From bcd08ce8c77a0dc5b4d0a136290e9142e1bc94fc Mon Sep 17 00:00:00 2001 From: morisita Date: Mon, 30 Nov 2009 08:38:49 +0000 Subject: [PATCH] =?utf8?q?DHA=E3=82=BD=E3=83=BC=E3=82=B9=E3=82=B3=E3=83=BC?= =?utf8?q?=E3=83=89=E3=80=81UT=E9=A0=85=E7=9B=AE=E7=A5=A8=EF=BC=8820091127?= =?utf8?q?=EF=BC=89=E3=81=AE=E7=99=BB=E9=8C=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit git-svn-id: http://10.144.169.20/repos/um/branches/l7vsd-3.x-ramiel@8665 1ed66053-1c2d-0410-8867-f7571e6e31d3 --- include/protocol_module_base.h | 5 + module/protocol/Makefile.am | 20 +- module/protocol/http_protocol_module_base.cpp | 8 +- module/protocol/http_protocol_module_base.h | 2 +- module/protocol/http_utility.cpp | 712 + module/protocol/http_utility.h | 117 + module/protocol/ip_protocol_module_base.h | 43 + module/protocol/ip_replication_data_processor.cpp | 536 + module/protocol/ip_replication_data_processor.h | 118 + module/protocol/ip_session_data_processor.cpp | 388 + module/protocol/ip_session_data_processor.h | 93 + module/protocol/protocol_module_ip.cpp | 6371 +++++++++ module/protocol/protocol_module_ip.h | 193 + module/protocol/protocol_module_sessionless.cpp | 12090 ++++++++--------- module/protocol/protocol_module_sessionless.h | 3 +- module/protocol/protocol_module_sslid.cpp | 782 +- module/protocol/ssl_protocol_module_base.cpp | 5 +- module/protocol/ssl_protocol_module_base.h | 3 + .../protocol/sslid_replication_data_processor.cpp | 149 +- module/protocol/sslid_session_data_processor.cpp | 115 +- module/schedule/schedule_module_lc.cpp | 77 +- module/schedule/schedule_module_rr.cpp | 46 +- module/schedule/schedule_module_wrr.cpp | 138 +- .../http_protocol_module_base_test.cpp | 82 +- unit_tests/module_test/http_utility_test/Makefile | 38 + .../http_utility_test/http_utility_test.cpp | 1328 ++ .../module_test/protocol_module_base_test/Makefile | 32 + .../protocol_module_base_ut.cpp | 319 + .../module_test/protocol_module_ip_test/Makefile | 37 + .../ip_replication_data_processor_test.cpp | 1540 +++ .../ip_session_data_processor_test.cpp | 720 ++ .../protocol_module_ip_test/ip_to_be_test_file.h | 42 + .../module_test/protocol_module_ip_test/ip_ut.cpp | 39 + .../protocol_module_ip_test.cpp | 10920 ++++++++++++++++ .../protocol_module_sessionless_test/Makefile | 37 + .../sessionless_ut.cpp | 12937 +++++++++++++++++++ .../protocol_module_sslid_test/Makefile | 36 + .../protocol_module_sslid_test.cpp | 6398 +++++++++ .../sslid_replication_data_processor_test.cpp | 1623 +++ .../sslid_session_data_processor_test.cpp | 1586 +++ .../sslid_to_be_test_file.h | 35 + .../protocol_module_sslid_test/sslid_ut.cpp | 39 + .../ssl_protocol_module_base_test/Makefile | 36 + .../ssl_protocol_module_base_test.cpp | 1867 +++ .../sslid_to_be_test_file.h | 35 + .../ssl_protocol_module_base_test/sslid_ut.cpp | 35 + .../schedule_module_lc_test.cpp | 18 + .../schedule_module_wrr_test.cpp | 20 +- 48 files changed, 55190 insertions(+), 6623 deletions(-) create mode 100644 module/protocol/http_utility.cpp create mode 100644 module/protocol/http_utility.h create mode 100644 module/protocol/ip_protocol_module_base.h create mode 100644 module/protocol/ip_replication_data_processor.cpp create mode 100644 module/protocol/ip_replication_data_processor.h create mode 100644 module/protocol/ip_session_data_processor.cpp create mode 100644 module/protocol/ip_session_data_processor.h create mode 100644 module/protocol/protocol_module_ip.cpp create mode 100644 module/protocol/protocol_module_ip.h create mode 100644 unit_tests/module_test/http_utility_test/Makefile create mode 100644 unit_tests/module_test/http_utility_test/http_utility_test.cpp create mode 100644 unit_tests/module_test/protocol_module_base_test/Makefile create mode 100644 unit_tests/module_test/protocol_module_base_test/protocol_module_base_ut.cpp create mode 100644 unit_tests/module_test/protocol_module_ip_test/Makefile create mode 100644 unit_tests/module_test/protocol_module_ip_test/ip_replication_data_processor_test.cpp create mode 100644 unit_tests/module_test/protocol_module_ip_test/ip_session_data_processor_test.cpp create mode 100644 unit_tests/module_test/protocol_module_ip_test/ip_to_be_test_file.h create mode 100644 unit_tests/module_test/protocol_module_ip_test/ip_ut.cpp create mode 100644 unit_tests/module_test/protocol_module_ip_test/protocol_module_ip_test.cpp create mode 100644 unit_tests/module_test/protocol_module_sessionless_test/Makefile create mode 100644 unit_tests/module_test/protocol_module_sessionless_test/sessionless_ut.cpp create mode 100644 unit_tests/module_test/protocol_module_sslid_test/Makefile create mode 100644 unit_tests/module_test/protocol_module_sslid_test/protocol_module_sslid_test.cpp create mode 100644 unit_tests/module_test/protocol_module_sslid_test/sslid_replication_data_processor_test.cpp create mode 100644 unit_tests/module_test/protocol_module_sslid_test/sslid_session_data_processor_test.cpp create mode 100644 unit_tests/module_test/protocol_module_sslid_test/sslid_to_be_test_file.h create mode 100644 unit_tests/module_test/protocol_module_sslid_test/sslid_ut.cpp create mode 100644 unit_tests/module_test/ssl_protocol_module_base_test/Makefile create mode 100644 unit_tests/module_test/ssl_protocol_module_base_test/ssl_protocol_module_base_test.cpp create mode 100644 unit_tests/module_test/ssl_protocol_module_base_test/sslid_to_be_test_file.h create mode 100644 unit_tests/module_test/ssl_protocol_module_base_test/sslid_ut.cpp diff --git a/include/protocol_module_base.h b/include/protocol_module_base.h index c0e07128..863b11df 100644 --- a/include/protocol_module_base.h +++ b/include/protocol_module_base.h @@ -32,6 +32,9 @@ #include "realserver.h" #include +#define VS_CONTACT_CLASS_NORMAL (0) +#define VS_CONTACT_CLASS_SSL (0x00000001) + namespace l7vs{ //! @class protocol_module_base @@ -393,6 +396,8 @@ public: virtual EVENT_TAG handle_realserver_close( const boost::thread::id thread_id, const boost::asio::ip::udp::endpoint& rs_endpoint ) = 0; + //! call from + virtual bool is_exec_OK(unsigned int vs_attr) {return true;} //! format dump data. //! @param[in] data want to format //! @param[in] data size diff --git a/module/protocol/Makefile.am b/module/protocol/Makefile.am index 8c1d4813..ff450b9a 100644 --- a/module/protocol/Makefile.am +++ b/module/protocol/Makefile.am @@ -2,7 +2,7 @@ AUTOMAKE_OPTIONS = foreign L7VS_MODDIR = @l7vs_moddir@ MAX_BUFFER_SIZE = @l7vs_max_buffer_size@ AM_CPPFLAGS = \ - -g -O2 -Wall -Werror -fPIC -pthread \ + -g -O0 -Wall -Werror -fPIC -pthread \ -I../../include \ -I../../logger \ -I../../parameter \ @@ -10,7 +10,8 @@ AM_CPPFLAGS = \ lib_LTLIBRARIES = libprotomod_cinsert.la \ libprotomod_sslid.la \ - libprotomod_sessionless.la + libprotomod_sessionless.la \ + libprotomod_ip.la libprotomod_cinsert_la_SOURCES = protocol_module_base.h \ http_protocol_module_base.h \ @@ -34,12 +35,27 @@ libprotomod_sessionless_la_SOURCES = protocol_module_base.h \ protocol_module_sessionless.cpp libprotomod_sessionless_la_LIBADD = -lrt -lboost_thread-gcc41-mt +libprotomod_ip_la_SOURCES = protocol_module_base.h \ + ip_protocol_module_base.h \ + protocol_module_ip.cpp \ + ip_replication_data_processor.h \ + ip_replication_data_processor.cpp \ + ip_session_data_processor.h \ + ip_session_data_processor.cpp \ + http_utility.h \ + http_utility.cpp +libprotomod_ip_la_LIBADD = -lrt -lboost_thread-gcc41-mt + + + install: cp ./.libs/libprotomod_cinsert.so ./.libs/protomod_cinsert.so && \ cp ./.libs/libprotomod_sslid.so ./.libs/protomod_sslid.so && \ cp ./.libs/libprotomod_sessionless.so ./.libs/protomod_sessionless.so && \ + cp ./.libs/libprotomod_ip.so ./.libs/protomod_ip.so && \ $(INSTALL) -m 755 -d $(L7VS_MODDIR) $(INSTALL) -m 755 -D \ ./.libs/protomod_cinsert.so \ ./.libs/protomod_sslid.so \ + ./.libs/protomod_ip.so \ ./.libs/protomod_sessionless.so $(L7VS_MODDIR) diff --git a/module/protocol/http_protocol_module_base.cpp b/module/protocol/http_protocol_module_base.cpp index 97769dec..c7dd8e9c 100644 --- a/module/protocol/http_protocol_module_base.cpp +++ b/module/protocol/http_protocol_module_base.cpp @@ -135,7 +135,7 @@ l7vs::http_protocol_module_base::check_http_method( const char* buffer, target[line_length] = backup_c; } else{ - check_result = CHECK_INPOSSIBLE; + check_result = CHECK_IMPOSSIBLE; } } else{ @@ -208,7 +208,7 @@ l7vs::http_protocol_module_base::check_http_version( const char* buffer, } else{ - check_result = CHECK_INPOSSIBLE; + check_result = CHECK_IMPOSSIBLE; } } else{ @@ -276,7 +276,7 @@ l7vs::http_protocol_module_base::check_status_code( const char* buffer, target[line_length] = backup_c; } else{ - check_result = CHECK_INPOSSIBLE; + check_result = CHECK_IMPOSSIBLE; } } else{ @@ -416,7 +416,7 @@ l7vs::http_protocol_module_base::check_http_version_and_status_code( target[line_length] = backup_c; } else{ - check_result = CHECK_INPOSSIBLE; + check_result = CHECK_IMPOSSIBLE; } } else{ diff --git a/module/protocol/http_protocol_module_base.h b/module/protocol/http_protocol_module_base.h index 327469d6..a2c17140 100644 --- a/module/protocol/http_protocol_module_base.h +++ b/module/protocol/http_protocol_module_base.h @@ -35,7 +35,7 @@ protected: enum CHECK_RESULT_TAG{ CHECK_OK = 0, //!< check ok CHECK_NG, //!< check ng - CHECK_INPOSSIBLE //!< check inpossible + CHECK_IMPOSSIBLE //!< check impossible }; //! check http method function diff --git a/module/protocol/http_utility.cpp b/module/protocol/http_utility.cpp new file mode 100644 index 00000000..2707663a --- /dev/null +++ b/module/protocol/http_utility.cpp @@ -0,0 +1,712 @@ +/* + * @file http_utility.cpp + * @brief shared object http protocol module abstract class + * + * L7VSD: Linux Virtual Server for Layer7 Load Balancing + * Copyright (C) 2009 NTT COMWARE Corporation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + **********************************************************************/ +#include + +#include "http_utility.h" +#include "utility.h" + +using namespace boost::xpressive; + +cregex method_regex + = ( as_xpr("GET") | as_xpr("HEAD") | as_xpr("POST") | + as_xpr("PUT") | as_xpr("PROPFIND") | as_xpr("PROPPATCH") | + as_xpr("OPTIONS") | as_xpr("CONNECT") | as_xpr("COPY") | + as_xpr("TRACE") | as_xpr("DELETE") | as_xpr("LOCK") | + as_xpr("UNLOCK") | as_xpr("MOVE") | as_xpr("MKCOL")) >> _s >> + +~_s >> _s >> + "HTTP/" >> _d >> "." >> _d; + +cregex version_regex_request + = +alpha >> _s >> + +~_s >> _s >> + "HTTP/" >> (as_xpr("1.0")|as_xpr("1.1")); + +cregex version_regex_response + = "HTTP/" >> (as_xpr("1.0")|as_xpr("1.1")) >> _s >> + repeat<3>(_d) >> _s >> + *_; + +cregex status_code_regex_check + = "HTTP/" >> _d >> "." >> _d >> _s >> + range('1', '3') >> repeat<2>(_d) >> _s >> + *_; + +cregex method_and_version_regex + = ( as_xpr("GET") | as_xpr("HEAD") | as_xpr("POST") | + as_xpr("PUT") | as_xpr("PROPFIND") | as_xpr("PROPPATCH") | + as_xpr("OPTIONS") | as_xpr("CONNECT") | as_xpr("COPY") | + as_xpr("TRACE") | as_xpr("DELETE") | as_xpr("LOCK") | + as_xpr("UNLOCK") | as_xpr("MOVE") | as_xpr("MKCOL")) >> _s >> + +~_s >> _s >> + "HTTP/" >> (as_xpr("1.0")|as_xpr("1.1")); + +cregex version_and_status_code_regex + = "HTTP/" >> (as_xpr("1.0")|as_xpr("1.1")) >> _s >> + range('1', '3') >> repeat<2>(_d) >> _s >> + *_; + +cregex uri_regex + = +alpha >> _s >> + (s1 = *~_s) >> _s >> + "HTTP/" >> _d >> "." >> _d; + +cregex status_code_regex_find + = "HTTP/" >> _d >> "." >> _d >> _s >> + (s1 = repeat<3>(_d)) >> _s >> + *_; + +cregex http_header_regex_cookie + = _ln >> (s1 = icase("cookie") >> ":" >> *~_ln); + +cregex http_header_regex_content_length + = _ln >> (s1 = icase("content-length") >> ":" >> *~_ln); + +cregex http_header_regex_x_forwarded_for + = _ln >> (s1 = icase("x-forwarded-for") >> ":" >> *~_ln); + +cregex http_header_regex_all + = _ln >> (s1 = *_ >> ~_ln) >> repeat<2>(_ln); + +cregex http_header_regex_none + = _ln >> (s1 = _ln); + + +//! check http method and version function +//! @param const char* buffer +//! @param const size_t buffer_len +//! @return CHECK_RESULT_TAG http method and version is valid +l7vs::http_utility::CHECK_RESULT_TAG +l7vs::http_utility::check_http_method_and_version( + const char* buffer, + const size_t buffer_len ){ + + l7vs::http_utility::CHECK_RESULT_TAG check_result = CHECK_OK; + + size_t line_length = 0; + + if( likely( buffer != NULL )){ + for( line_length = 0; line_length < buffer_len; line_length++ ){ + if( unlikely( buffer[line_length] == '\r' || buffer[line_length] == '\n' )){ + break; + } + } + if( likely( line_length < buffer_len )){ + char* target = const_cast( buffer ); + char backup_c = target[line_length]; + target[line_length] = '\0'; + + if( !regex_match( target, method_and_version_regex ) ) + check_result = CHECK_NG; + + target[line_length] = backup_c; + } + else{ + check_result = CHECK_NG; + } + } + else{ + check_result = CHECK_NG; + } + + return check_result; + +} + +//! check http version and status code function +//! @param const char* buffer +//! @param const size_t buffer_len +//! @return CHECK_RESULT_TAG http version and status code is valid +l7vs::http_utility::CHECK_RESULT_TAG +l7vs::http_utility::check_http_version_and_status_code( + const char* buffer, + const size_t buffer_len ){ + + l7vs::http_utility::CHECK_RESULT_TAG check_result = CHECK_OK; + + size_t line_length = 0; + + if( likely( buffer != NULL )){ + for( line_length = 0; line_length < buffer_len; line_length++ ){ + if( unlikely( buffer[line_length] == '\r' || buffer[line_length] == '\n' )){ + break; + } + } + + if( likely( line_length < buffer_len )){ + char* target = const_cast( buffer ); + char backup_c = target[line_length]; + target[line_length] = '\0'; + if( !regex_match( target, version_and_status_code_regex ) ) check_result = CHECK_NG; + target[line_length] = backup_c; + } + else{ + check_result = CHECK_IMPOSSIBLE; + } + } + else{ + check_result = CHECK_NG; + } + + return check_result; + +} + +//! serch uri function +//! @param const char* buffer +//! @param const size_t buffer_len +//! @param size_t& uri offset +//! @param size_t& uri length +//! @return bool find is true. not find is false +bool l7vs::http_utility::find_uri( const char* buffer, + const size_t buffer_len, + size_t& uri_offset, + size_t& uri_len){ + + bool find_result = true; + + size_t line_length = 0; + + match_results< const char* > result; + + if( likely( buffer != NULL )){ + + for( line_length = 0; line_length < buffer_len; line_length++ ){ + + if( unlikely( buffer[line_length] == '\r' || buffer[line_length] == '\n' )){ + + break; + + } + + } + + if( likely( line_length < buffer_len )){ + char* target = const_cast( buffer ); + char backup_c = target[line_length]; + find_result = regex_search( target, result, uri_regex ); + if( find_result ){ + uri_offset = result.position(1); + uri_len = result.length(1); + } + target[line_length] = backup_c; + } + else{ + find_result = false; + } + } + else{ + find_result = false; + } + + return find_result; + +} + +//! serch status function +//! @param const char* buffer +//! @param const size_t buffer_len +//! @param size_t& status offset +//! @param size_t& status length +//! @return bool find is true. not find is false +bool l7vs::http_utility::find_status_code( const char* buffer, + const size_t buffer_len, + size_t& status_code_offset, + size_t& status_code_len){ + + bool find_result = true; + + size_t line_length = 0; + + match_results< const char* > result; + + if( likely( buffer != NULL )){ + + for( line_length = 0; line_length < buffer_len; line_length++ ){ + if( unlikely( buffer[line_length] == '\r' || buffer[line_length] == '\n' )){ + break; + } + } + + if( likely( line_length < buffer_len )){ + char* target = const_cast( buffer ); + char backup_c = target[line_length]; + target[line_length] = '\0'; + find_result = regex_search( target, result, status_code_regex_find ); + if( find_result ){ + status_code_offset = result.position(1); + status_code_len = result.length(1); + } + target[line_length] = backup_c; + } + else{ + find_result = false; + } + } + else{ + find_result = false; + } + + return find_result; + +} + +//! serch http header function +//! @param const char* buffer +//! @param const size_t buffer_len +//! @param const string& header name +//! @param size_t& header offset +//! @param size_t& header length +//! @return bool find is true. not find is false +bool l7vs::http_utility::find_http_header( const char* buffer, + const size_t buffer_len, + const std::string& http_header_name, + size_t& http_header_offset, + size_t& http_header_len ){ + + cregex http_header_regex; + + bool find_result = true; + + size_t count = 0; + size_t header_begin = 0; + size_t header_end = 0; + size_t header_length = 0; + + int header_begin_flag = 0; + int header_end_flag = 0; + + match_results< const char* > result; + + if( likely( buffer != NULL )){ + + for( count = 0; count < buffer_len; count++ ){ + + if( unlikely( buffer[count] == '\r' || buffer[count] == '\n' )){ + + if( unlikely( header_begin_flag == 0 )){ + + header_begin = count; + header_begin_flag = 1; + + } + + if( likely( count > 0 )){ + + if( unlikely( ( buffer[count-1] == '\r' && buffer[count] == '\r' ) || + ( buffer[count-1] == '\n' && buffer[count] == '\n' ) )){ + + header_end = count; + header_end_flag = 1; + break; + + } + } + + if( likely( count > 2 )){ + + if( unlikely( buffer[count-3] == '\r' && buffer[count-2] == '\n' && + buffer[count-1] == '\r' && buffer[count] == '\n' )){ + + header_end = count; + header_end_flag = 1; + break; + + } + } + } + } + + if( likely( header_begin_flag == 1 && header_end_flag == 1 )){ + + header_length = header_end - header_begin + 1; + char* ptr = const_cast( buffer ) + header_begin; + char backup_c = *( ptr + header_length ); + *( ptr + header_length ) = '\0'; + + if( http_header_name.length() > 0 ){ + http_header_regex = _ln >> (s1 = icase(http_header_name) >> ":" >> *~_ln); + find_result = regex_search( ptr , result, http_header_regex ); + if( find_result){ + http_header_offset = result.position(1) + header_begin; + http_header_len = result.length(1); + } + } + else{ + http_header_regex = _ln >> (s1 = *_ >> ~_ln) >> repeat<2>(_ln); + find_result = regex_search( ptr, result, http_header_regex ); + if( find_result ){ + http_header_offset = result.position(1) + header_begin; + http_header_len = result.length(1); + } + else{ + http_header_regex = _ln >> (s1 = _ln); + find_result = regex_search( ptr, result, http_header_regex ); + if( find_result ){ + http_header_offset = result.position(1) + header_begin; + http_header_len = 0; + } + } + } + *( ptr + header_length ) = backup_c; + } + else{ + find_result = false; + } + } + else{ + find_result = false; + } + + return find_result; + +} + +//! serch http header Cookie function +//! @param const char* buffer +//! @param const size_t buffer_len +//! @param size_t& header offset +//! @param size_t& header length +//! @return bool find is true. not find is false +bool l7vs::http_utility::find_http_header_cookie( + const char* buffer, + const size_t buffer_len, + size_t& http_header_offset, + size_t& http_header_len ){ + + bool find_result = true; + + size_t count = 0; + size_t header_begin = 0; + size_t header_end = 0; + size_t header_length = 0; + + int header_begin_flag = 0; + int header_end_flag = 0; + + match_results< const char* > result; + + if( likely( buffer != NULL )){ + for( count = 0; count < buffer_len; count++ ){ + if( unlikely( buffer[count] == '\r' || buffer[count] == '\n' )){ + if( unlikely( header_begin_flag == 0 )){ + header_begin = count; + header_begin_flag = 1; + } + if( likely( count > 0 )){ + if( unlikely( ( buffer[count-1] == '\r' && buffer[count] == '\r' ) || + ( buffer[count-1] == '\n' && buffer[count] == '\n' ) )){ + header_end = count; + header_end_flag = 1; + break; + } + } + if( likely( count > 2 )){ + if( unlikely( buffer[count-3] == '\r' && buffer[count-2] == '\n' && + buffer[count-1] == '\r' && buffer[count] == '\n' )){ + header_end = count; + header_end_flag = 1; + break; + + } + } + } + } + + if( likely( header_begin_flag == 1 && header_end_flag == 1 )){ + header_length = header_end - header_begin + 1; + char* ptr = const_cast( buffer ) + header_begin; + char backup_c = *( ptr + header_length ); + *( ptr + header_length ) = '\0'; + + find_result = regex_search( ptr, result, http_header_regex_cookie ); + if( find_result ){ + http_header_offset = result.position(1) + header_begin; + http_header_len = result.length(1); + } + *( ptr + header_length ) = backup_c; + } + else{ + find_result = false; + } + } + else{ + find_result = false; + } + + return find_result; + +} + +//! serch http header Content_Length function +//! @param const char* buffer +//! @param const size_t buffer_len +//! @param size_t& header offset +//! @param size_t& header length +//! @return bool find is true. not find is false +bool l7vs::http_utility::find_http_header_content_length( + const char* buffer, + const size_t buffer_len, + size_t& http_header_offset, + size_t& http_header_len ){ + + bool find_result = true; + + size_t count = 0; + size_t header_begin = 0; + size_t header_end = 0; + size_t header_length = 0; + + int header_begin_flag = 0; + int header_end_flag = 0; + + match_results< const char* > result; + + if( likely( buffer != NULL )){ + for( count = 0; count < buffer_len; count++ ){ + if( unlikely( buffer[count] == '\r' || buffer[count] == '\n' )){ + if( unlikely( header_begin_flag == 0 )){ + header_begin = count; + header_begin_flag = 1; + } + if( likely( count > 0 )){ + if( unlikely( ( buffer[count-1] == '\r' && buffer[count] == '\r' ) || + ( buffer[count-1] == '\n' && buffer[count] == '\n' ) )){ + header_end = count; + header_end_flag = 1; + break; + } + } + if( likely( count > 2 )){ + if( unlikely( buffer[count-3] == '\r' && buffer[count-2] == '\n' && + buffer[count-1] == '\r' && buffer[count] == '\n' )){ + header_end = count; + header_end_flag = 1; + break; + } + } + } + } + + if( likely( header_begin_flag == 1 && header_end_flag == 1 )){ + header_length = header_end - header_begin + 1; + + char* ptr = const_cast( buffer ) + header_begin; + char backup_c = *( ptr + header_length ); + *( ptr + header_length ) = '\0'; + + find_result = regex_search( ptr, result, http_header_regex_content_length ); + if( find_result ){ + http_header_offset = result.position(1) + header_begin; + http_header_len = result.length(1); + } + + *( ptr + header_length ) = backup_c; + } + else{ + + find_result = false; + + } + } + else{ + + find_result = false; + + } + + return find_result; + +} + +//! serch http header X_Forwarded_For function +//! @param const char* buffer +//! @param const size_t buffer_len +//! @param size_t& header offset +//! @param size_t& header length +//! @return bool find is true. not find is false +bool l7vs::http_utility::find_http_header_x_forwarded_for( + const char* buffer, + const size_t buffer_len, + size_t& http_header_offset, + size_t& http_header_len ){ + + bool find_result = true; + + size_t count = 0; + size_t header_begin = 0; + size_t header_end = 0; + size_t header_length = 0; + + int header_begin_flag = 0; + int header_end_flag = 0; + + match_results< const char* > result; + + if( likely( buffer != NULL )){ + for( count = 0; count < buffer_len; count++ ){ + if( unlikely( buffer[count] == '\r' || buffer[count] == '\n' )){ + if( unlikely( header_begin_flag == 0 )){ + header_begin = count; + header_begin_flag = 1; + } + if( likely( count > 0 )){ + if( unlikely( ( buffer[count-1] == '\r' && buffer[count] == '\r' ) || + ( buffer[count-1] == '\n' && buffer[count] == '\n' ) )){ + header_end = count; + header_end_flag = 1; + break; + } + } + + if( likely( count > 2 )){ + if( unlikely( buffer[count-3] == '\r' && buffer[count-2] == '\n' && + buffer[count-1] == '\r' && buffer[count] == '\n' )){ + header_end = count; + header_end_flag = 1; + break; + + } + } + } + } + + if( likely( header_begin_flag == 1 && header_end_flag == 1 )){ + + header_length = header_end - header_begin + 1; + char* ptr = const_cast( buffer ) + header_begin; + char backup_c = *( ptr + header_length ); + *( ptr + header_length ) = '\0'; + + find_result = regex_search( ptr, result, http_header_regex_x_forwarded_for ); + if( find_result == true ){ + http_header_offset = result.position(1) + header_begin; + http_header_len = result.length(1); + } + + *( ptr + header_length ) = backup_c; + } + else{ + + find_result = false; + + } + } + else{ + + find_result = false; + + } + + return find_result; + +} + +//! serch http header all function +//! @param const char* buffer +//! @param const size_t buffer_len +//! @param size_t& header offset +//! @param size_t& header length +//! @return bool find is true. not find is false +bool l7vs::http_utility::find_http_header_all( + const char* buffer, + const size_t buffer_len, + size_t& http_header_offset, + size_t& http_header_len ){ + + bool find_result = true; + + size_t count = 0; + size_t header_begin = 0; + size_t header_end = 0; + size_t header_length = 0; + + int header_begin_flag = 0; + int header_end_flag = 0; + + match_results< const char* > result; + + if( likely( buffer != NULL )){ + for( count = 0; count < buffer_len; count++ ){ + if( unlikely( buffer[count] == '\r' || buffer[count] == '\n' )){ + if( unlikely( header_begin_flag == 0 )){ + header_begin = count; + header_begin_flag = 1; + } + + if( likely( count > 0 )){ + if( unlikely( ( buffer[count-1] == '\r' && buffer[count] == '\r' ) || + ( buffer[count-1] == '\n' && buffer[count] == '\n' ) )){ + header_end = count; + header_end_flag = 1; + break; + } + } + + if( likely( count > 2 )){ + if( unlikely( buffer[count-3] == '\r' && buffer[count-2] == '\n' && + buffer[count-1] == '\r' && buffer[count] == '\n' )){ + header_end = count; + header_end_flag = 1; + break; + } + } + } + } + + if( likely( header_begin_flag == 1 && header_end_flag == 1 )){ + header_length = header_end - header_begin + 1; + char* ptr = const_cast( buffer ) + header_begin; + char backup_c = *( ptr + header_length ); + *( ptr + header_length ) = '\0'; + + find_result = regex_search( ptr, result, http_header_regex_all ); + + if( find_result ){ + http_header_offset = result.position(1) + header_begin; + http_header_len = result.length(1); + } + else{ + find_result = regex_search( ptr, result, http_header_regex_none ); + if( find_result == true ){ + http_header_offset = result.position(1) + header_begin; + http_header_len = 0; + } + } + *( ptr + header_length ) = backup_c; + } + else{ + + find_result = false; + + } + } + else{ + + find_result = false; + + } + + return find_result; + +} diff --git a/module/protocol/http_utility.h b/module/protocol/http_utility.h new file mode 100644 index 00000000..d6a66c4b --- /dev/null +++ b/module/protocol/http_utility.h @@ -0,0 +1,117 @@ +/* + * @file http_utility.h + * @brief shared object http common utility class + * + * L7VSD: Linux Virtual Server for Layer7 Load Balancing + * Copyright (C) 2009 NTT COMWARE Corporation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + **********************************************************************/ +#ifndef HTTP_UTILITY_H +#define HTTP_UTILITY_H + +namespace l7vs{ + +class http_utility { +public: + //! constractor + http_utility(){}; + + //! destractor + virtual ~http_utility(){}; + + //! @enum CHECK_RESULT_TAG + //! @brief check tag is return to http protocol module. + enum CHECK_RESULT_TAG{ + CHECK_OK = 0, //!< check ok + CHECK_NG, //!< check ng + CHECK_IMPOSSIBLE //!< check impossible + }; + + //! check http method and version function + //! @param const char* buffer + //! @param const size_t buffer_len + //! @return CHECK_RESULT_TAG http method and version is valid + static CHECK_RESULT_TAG check_http_method_and_version( const char*, const size_t ); + + //! check http version and status code function + //! @param const char* buffer + //! @param const size_t buffer_len + //! @return CHECK_RESULT_TAG http version and status code is valid + static CHECK_RESULT_TAG check_http_version_and_status_code( const char*, const size_t ); + + //! serch uri function + //! @param const char* buffer + //! @param const size_t buffer_len + //! @param size_t& uri offset + //! @param size_t& uri length + //! @return bool find is true. not find is false + static bool find_uri( const char*, const size_t, size_t&, size_t&); + + //! serch status function + //! @param const char* buffer + //! @param const size_t buffer_len + //! @param size_t& status offset + //! @param size_t& status length + //! @return bool find is true. not find is false + static bool find_status_code( const char*, const size_t, size_t&, size_t& ); + + //! serch http header function + //! @param const char* buffer + //! @param const size_t buffer_len + //! @param const string& header name + //! @param size_t& header offset + //! @param size_t& header length + //! @return bool find is true. not find is false + static bool find_http_header( const char*, const size_t, const std::string&, size_t&, size_t& ); + + //! serch http header Cookie function + //! @param const char* buffer + //! @param const size_t buffer_len + //! @param size_t& header offset + //! @param size_t& header length + //! @return bool find is true. not find is false + static bool find_http_header_cookie( const char*, const size_t, size_t&, size_t& ); + + //! serch http header Content_Length function + //! @param const char* buffer + //! @param const size_t buffer_len + //! @param size_t& header offset + //! @param size_t& header length + //! @return bool find is true. not find is false + static bool find_http_header_content_length( const char*, const size_t, size_t&, size_t& ); + + //! serch http header X_Forwarded_For function + //! @param const char* buffer + //! @param const size_t buffer_len + //! @param size_t& header offset + //! @param size_t& header length + //! @return bool find is true. not find is false + static bool find_http_header_x_forwarded_for( const char*, const size_t, size_t&, size_t& ); + + //! serch http header all function + //! @param const char* buffer + //! @param const size_t buffer_len + //! @param size_t& header offset + //! @param size_t& header length + //! @return bool find is true. not find is false + static bool find_http_header_all( const char*, const size_t, size_t&, size_t& ); +}; + +} // namespace l7vsd + +#endif //HTTP_UTILITY_H diff --git a/module/protocol/ip_protocol_module_base.h b/module/protocol/ip_protocol_module_base.h new file mode 100644 index 00000000..72c5396c --- /dev/null +++ b/module/protocol/ip_protocol_module_base.h @@ -0,0 +1,43 @@ +/* + * @file ip_protocol_module_base.h + * @brief shared object http protocol module abstract class + * + * L7VSD: Linux Virtual Server for Layer7 Load Balancing + * Copyright (C) 2009 NTT COMWARE Corporation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + **********************************************************************/ +#ifndef IP_PROTOCOL_MODULE_BASE_H +#define IP_PROTOCOL_MODULE_BASE_H + +#include "protocol_module_base.h" + +namespace l7vs{ + +class ip_protocol_module_base : public protocol_module_base { +public: + + //! constractor + ip_protocol_module_base( std::string in_modulename ) : protocol_module_base( in_modulename ){}; + + //! destractor + virtual ~ip_protocol_module_base(){}; +}; + +} // namespace l7vsd + +#endif //IP_PROTOCOL_MODULE_BASE_H diff --git a/module/protocol/ip_replication_data_processor.cpp b/module/protocol/ip_replication_data_processor.cpp new file mode 100644 index 00000000..2fffe9fd --- /dev/null +++ b/module/protocol/ip_replication_data_processor.cpp @@ -0,0 +1,536 @@ +/* + * @file ip_replication_data_processor.cpp + * @brief the replication of data between ACT and SBY. + * + * L7VSD: Linux Virtual Server for Layer7 Load Balancing + * Copyright (C) 2009 NTT COMWARE Corporation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + **********************************************************************/ + +#include "ip_replication_data_processor.h" +#include "replication.h" +#include "protocol_module_base.h" +#include "boost/format.hpp" +#include "utility.h" + +namespace l7vs +{ + +//! constructor +ip_replication_data_processor::ip_replication_data_processor( + char* ip_replication_area_begin, int ip_replication_area_size, + const boost::asio::ip::tcp::endpoint& virtual_service_endpoint, + getloglevel_func_type ingetloglevel, logger_func_type inputLogFatal, + logger_func_type inputLogError, logger_func_type inputLogWarn, + logger_func_type inputLogInfo, logger_func_type inputLogDebug) + :replication_area(NULL), virtual_service_endpoint(virtual_service_endpoint), + getloglevel(ingetloglevel), putLogFatal(inputLogFatal), + putLogError(inputLogError), putLogWarn(inputLogWarn), + putLogInfo(inputLogInfo), putLogDebug(inputLogDebug) +{ + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("in_function : Constructor ip_replication_data_processor::" + "ip_replication_data_processor(" + "char* ip_replication_area_begin, int ip_replication_area_size, " + "const boost::asio::ip::tcp::endpoint& virtual_service_endpoint, " + "getloglevel_func_type ingetloglevel, logger_func_type inputLogFatal, " + "logger_func_type inputLogError, logger_func_type inputLogWarn, " + "logger_func_type inputLogInfo, logger_func_type inputLogDebug) : " + "ip_replication_area_begin = &(%d), " + "ip_replication_area_size = %d, virtual_service_endpoint = [%s]:%d."); + formatter % static_cast(ip_replication_area_begin) + % ip_replication_area_size % virtual_service_endpoint.address().to_string() + % virtual_service_endpoint.port(); + putLogDebug(600201, formatter.str(), __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + + //ctor + struct ip_replication_data_header* head = NULL; + struct ip_replication_data_header* pick = NULL; + unsigned int used = 0; + char exist = -1; + int srv_num = 0; + + // parameter check + if (unlikely(ip_replication_area_size < 0)) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + putLogDebug(600202, "out_function : Constructor ip_replication_data_processor::" + "ip_replication_data_processor(" + "char* ip_replication_area_begin, int ip_replication_area_size, " + "const boost::asio::ip::tcp::endpoint& virtual_service_endpoint, " + "getloglevel_func_type ingetloglevel, logger_func_type inputLogFatal, " + "logger_func_type inputLogError, logger_func_type inputLogWarn, " + "logger_func_type inputLogInfo, logger_func_type inputLogDebug).", __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + + throw std::logic_error("Invalid parameter value."); + } + + if (ip_replication_area_begin == NULL) + { + // replication area is null + putLogError(600110, "Replication area is null.", __FILE__, __LINE__); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + putLogDebug(600203, "function : ip_replication_data_processor::" + "ip_replication_data_processor() : Replication area is null.", __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + } + else + { + // check replication area header + for (srv_num = 0; srv_num < IP_SERVICE_NUMBER; ++srv_num) + { + // get the replication data header pointer + head = reinterpret_cast(ip_replication_area_begin) + srv_num; + // add used service area size + used += head->size; + + if (static_cast(ip_replication_area_size) * DATA_SIZE < + sizeof(ip_replication_data_header) * IP_SERVICE_NUMBER + used) + { + // no enough replication area + putLogError(600111, "Over replication area.", __FILE__, __LINE__); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + putLogDebug(600204, "function : ip_replication_data_processor::" + "ip_replication_data_processor() : Over replication area.", + __FILE__, __LINE__); + putLogDebug(600205, "out_function : Constructor ip_replication_data_processor::" + "ip_replication_data_processor(int maxlist, " + "char* ip_replication_area_begin, int ip_replication_area_size, " + "const boost::asio::ip::tcp::endpoint& virtual_service_endpoint, " + "getloglevel_func_type ingetloglevel, logger_func_type inputLogFatal, " + "logger_func_type inputLogError, logger_func_type inputLogWarn, " + "logger_func_type inputLogInfo, logger_func_type inputLogDebug).", __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + return; + } + + if (pick == NULL && head->size == 0) + { + // find the first empty head + pick = head; + } + + if (exist >= 0 && pick != NULL) + { + // find the lastest same header + break; + } + + // match ip and port, this is pre-used ip information + if (virtual_service_endpoint.address().to_string() == head->virtualserver_ip && + virtual_service_endpoint.port() == head->virtualserver_port) + { + exist = srv_num; + } + } + + if (exist >= 0) + { + head = reinterpret_cast(ip_replication_area_begin) + exist; + + // restore session data from replication direct + replication_area = reinterpret_cast(ip_replication_area_begin + + head->offset); + } + else + { + if (pick != NULL) + { + // data size check + if (sizeof(ip_replication_data_header) * IP_SERVICE_NUMBER + used + + IP_REPLICATION_MAXLENGTH * sizeof(ip_replication_data) > + static_cast(ip_replication_area_size) * DATA_SIZE) + { + // replication area is full + putLogError(600112, "Replication area is full.", __FILE__, __LINE__); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + putLogDebug(600206, "function : ip_replication_data_processor::" + "ip_replication_data_processor() : Replication area is full.", + __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + } + else + { + // initialize replication information + replication_area = reinterpret_cast(ip_replication_area_begin + + sizeof(ip_replication_data_header) * IP_SERVICE_NUMBER + + used); + strncpy(pick->virtualserver_ip, virtual_service_endpoint.address().to_string().c_str(), + sizeof(pick->virtualserver_ip)-1); + pick->virtualserver_ip[sizeof(pick->virtualserver_ip)] = '\0'; + pick->virtualserver_port = virtual_service_endpoint.port(); + pick->size = IP_REPLICATION_MAXLENGTH * sizeof(ip_replication_data); + pick->offset = sizeof(ip_replication_data_header) * IP_SERVICE_NUMBER + + used; + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("Write replication area : head = (ip = %s, port = %d, " + "size = %d, offset = %d)."); + formatter % pick->virtualserver_ip % pick->virtualserver_port + % pick->size % pick->offset; + putLogDebug(600207, formatter.str(), __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + } + } + else + { + // replication area is full + putLogError(600113, "Replication area is full.", __FILE__, __LINE__); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + putLogDebug(600208, "function : ip_replication_data_processor::" + "ip_replication_data_processor() : Replication area is full.", + __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + } + } + } + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + putLogDebug(600209, "out_function : Constructor ip_replication_data_processor::" + "ip_replication_data_processor(" + "char* ip_replication_area_begin, int ip_replication_area_size, " + "const boost::asio::ip::tcp::endpoint& virtual_service_endpoint, " + "getloglevel_func_type ingetloglevel, logger_func_type inputLogFatal, " + "logger_func_type inputLogError, logger_func_type inputLogWarn, " + "logger_func_type inputLogInfo, logger_func_type inputLogDebug)." + , __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ +} + +//! destructor +ip_replication_data_processor::~ip_replication_data_processor() +{ + //dtor + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + putLogDebug(600210, "in/out_function : Destructor ip_replication_data_processor::" + "~ip_replication_data_processor().", __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ +} + +//! put data into temp list +//! @param[in] ip_replication_temp_data refrence +void ip_replication_data_processor::put_into_temp_list( + const ip_replication_temp_data& data) +{ + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("in_function : void ip_replication_data_processor::put_into_temp_list(" + "const ip_replication_temp_data& data) : data.op_code = %c, " + "data.ip_hash = %d, data.last_time = %lu, data.rs_endpoint = [%s]:%d."); + formatter % data.op_code % data.ip_hash % data.last_time % data.rs_endpoint.address().to_string() + % data.rs_endpoint.port(); + putLogDebug(600211, formatter.str(), __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + + if (replication_area) + { + boost::mutex::scoped_lock sclock(temp_list_mutex); + while (temp_list.size() >= static_cast(MAX_IP_SESSION_TEMPLIST_SIZE)) + { + // wait for empty list item + temp_list_condition.wait(sclock); + } + + temp_list.push_back(data); + temp_list_condition.notify_one(); + } + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + putLogDebug(600212, "out_function : void ip_replication_data_processor::" + "put_into_temp_list(const ip_replication_temp_data& data).", __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ +} + +//! write replication area, called by protocol_module_ip::replication_interrupt +void ip_replication_data_processor::write_replication_area() +{ + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + putLogDebug(600213, "in_function : void ip_replication_data_processor::" + "write_replicaion_area().", __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + + // replication_area check + if (replication_area == NULL) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + putLogDebug(600214, "out_function : void ip_replication_data_processor::" + "write_replicaion_area().", __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + return; + } + + bool blocked = false; + try + { + ip_replication_temp_data temp_data; + + while (true) + { + if (get_from_temp_list(temp_data) == -1) + { + break; + } + blocked = false; + replication_area_lock(); + blocked = true; + + // ip data process + switch (temp_data.op_code) + { + case 'A': + // data add + replication_area[temp_data.ip_hash].last_time = temp_data.last_time; + strncpy(replication_area[temp_data.ip_hash].realserver_ip, + temp_data.rs_endpoint.address().to_string().c_str(), + sizeof(replication_area[temp_data.ip_hash].realserver_ip)-1); + replication_area[temp_data.ip_hash].realserver_port = temp_data.rs_endpoint.port(); + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : void ip_replication_data_processor::" + "write_replicaion_area() : 'A' : realserver_ip = %s, " + "realserver_prot = %d, last_time = %d."); + formatter % replication_area[temp_data.ip_hash].realserver_ip % replication_area[temp_data.ip_hash].realserver_port % + replication_area[temp_data.ip_hash].last_time; + putLogDebug(600215, formatter.str(), __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + + replication_area[temp_data.ip_hash].valid = 1; + break; + case 'U': + // data update + replication_area[temp_data.ip_hash].last_time = temp_data.last_time; + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : void ip_replication_data_processor::" + "write_replicaion_area() : 'U' : last_time = %d."); + formatter % replication_area[temp_data.ip_hash].last_time; + putLogDebug(600216, formatter.str(), __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + + replication_area[temp_data.ip_hash].valid = 1; + break; + default: + break; + } + + replication_area_unlock(); + } + } + catch (const std::exception& e) + { + if (blocked) + { + replication_area_unlock(); + } + std::cerr << "ip_replication_data_processor::write_replicaion_area() : exception : error " << e.what() << "." << std::endl; + boost::format formatter("function : void ip_replication_data_processor::write_replicaion_area() : " + "exception : error = %s."); + formatter % e.what(); + putLogError(600114, formatter.str(), __FILE__, __LINE__); + } + catch (boost::thread_interrupted&) + { + if (blocked) + { + replication_area_unlock(); + } + std::cerr << "ip_replication_data_processor::write_replicaion_area() : exception." << std::endl; + putLogError(600115, "function : void ip_replication_data_processor::write_replicaion_area() : " + "Thread_interrupted exception.", __FILE__, __LINE__); + } + catch (...) + { + if (blocked) + { + replication_area_unlock(); + } + std::cerr << "ip_replication_data_processor::write_replicaion_area() : Unknown exception." << std::endl; + putLogError(600116, "function : void ip_replication_data_processor::write_replicaion_area() : " + "Unknown exception.", __FILE__, __LINE__); + } + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + putLogDebug(600217, "out_function : void ip_replication_data_processor::" + "write_replicaion_area().", __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ +} + +//! return the replication area pointer +//! @return ip_replication_data pointer +ip_replication_data* ip_replication_data_processor::get_replication_area() +{ + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("in/out_function : ip_replication_data* " + "ip_replication_data_processor::" + "get_replication_area() : return_value = &(%d)."); + formatter % static_cast(replication_area); + putLogDebug(600218, formatter.str(), __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + + return replication_area; +} + +//! register replication area lock function +//! @param[in] lock function object +void ip_replication_data_processor::register_replication_area_lock( + boost::function intable_lock) +{ + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + putLogDebug(600219, "in_function : void ip_replication_data_processor::" + "register_replication_area_lock(boost::function intable_lock).", + __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + + replication_area_lock = intable_lock; + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + putLogDebug(600220, "out_function : void ip_replication_data_processor::" + "register_replication_area_lock(boost::function intable_lock).", + __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ +} + +//! register replication area unlock function +//! @param[in] unlock function object +void ip_replication_data_processor::register_replication_area_unlock( + boost::function intable_unlock) +{ + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + putLogDebug(600221, "in_function : void ip_replication_data_processor::" + "register_replication_area_unlock(boost::function intable_unlock).", + __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + + replication_area_unlock = intable_unlock; + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + putLogDebug(600222, "out_function : void ip_replication_data_processor::" + "register_replication_area_unlock(boost::function intable_unlock).", + __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ +} + +//! get data from temp list +//! @param[out] ip_replication_temp_data refrence +//! @return 0 : success for get data +//! @return -1 : faild to get data +int ip_replication_data_processor::get_from_temp_list( + ip_replication_temp_data& data) +{ + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + putLogDebug(600223, "in_function : void ip_replication_data_processor::" + "get_from_temp_list(ip_replication_temp_data& data).", __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + + int ret = 0; + boost::mutex::scoped_lock sclock(temp_list_mutex); + if (temp_list.size() <= 0) + { + ret = -1; + } + else + { + data = temp_list[0]; + temp_list.pop_front(); + + temp_list_condition.notify_one(); + } + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("out_function : void ip_replication_data_processor::" + "get_from_temp_list(ip_replication_temp_data& data) : " + "return_value = %d, data.op_code = %c, data.ip_hash = %d, " + "data.last_time = %lu, data.rs_endpoint = [%s]:%d."); + formatter % ret % data.op_code % data.ip_hash % data.last_time % + data.rs_endpoint.address().to_string() % data.rs_endpoint.port(); + putLogDebug(600224, formatter.str(), __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + + return ret; +} + +} diff --git a/module/protocol/ip_replication_data_processor.h b/module/protocol/ip_replication_data_processor.h new file mode 100644 index 00000000..8f09ec7c --- /dev/null +++ b/module/protocol/ip_replication_data_processor.h @@ -0,0 +1,118 @@ +/* + * @file ip_replication_data_processor.h + * @brief ip replication data processor header file. + * + * L7VSD: Linux Virtual Server for Layer7 Load Balancing + * Copyright (C) 2009 NTT COMWARE Corporation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + **********************************************************************/ + +#ifndef IP_REPLICATION_DATA_PROCESSOR_H +#define IP_REPLICATION_DATA_PROCESSOR_H + +#include +#include +#include "logger_enum.h" + +#define IP_MAXLENGTH (40) +#define IP_SERVICE_NUMBER (128) +#define IP_REPLICATION_MAXLENGTH (256) +#define MAX_IP_SESSION_TEMPLIST_SIZE (20000) + +namespace l7vs +{ + +struct ip_replication_data_header +{ + char virtualserver_ip[IP_MAXLENGTH]; + unsigned short virtualserver_port; + size_t offset; + size_t size; +}; + +struct ip_replication_data +{ + char realserver_ip[IP_MAXLENGTH]; + unsigned short realserver_port; + time_t last_time; + int valid; +}; + +struct ip_replication_temp_data +{ + char op_code; + int ip_hash; + time_t last_time; + boost::asio::ip::tcp::endpoint rs_endpoint; +}; + +class ip_replication_data_processor +{ + public: + //! loglevel get function object type + typedef boost::function< LOG_LEVEL_TAG(void) > + getloglevel_func_type; + //! log output function object type + typedef boost::function< void (const unsigned int, const std::string&, const char*, int) > + logger_func_type; + + public: + ip_replication_data_processor(char* ip_replication_area_begin, + int ip_replication_area_size, + const boost::asio::ip::tcp::endpoint& virtual_service_endpoint, + getloglevel_func_type ingetloglevel, + logger_func_type inputLogFatal, + logger_func_type inputLogError, + logger_func_type inputLogWarn, + logger_func_type inputLogInfo, + logger_func_type inputLogDebug); + + virtual ~ip_replication_data_processor(); + + void put_into_temp_list(const ip_replication_temp_data& data); + + void write_replication_area(); + + ip_replication_data* get_replication_area(); + + void register_replication_area_lock(boost::function intable_lock); + + void register_replication_area_unlock(boost::function intable_unlock); + + protected: + int get_from_temp_list(ip_replication_temp_data& data); + + protected: + std::deque temp_list; + boost::mutex temp_list_mutex; + boost::condition temp_list_condition; + ip_replication_data* replication_area; + boost::function replication_area_lock; + boost::function replication_area_unlock; + boost::asio::ip::tcp::endpoint virtual_service_endpoint; + getloglevel_func_type getloglevel; //! get loglevel function object + logger_func_type putLogFatal; //! fatal log output function object + logger_func_type putLogError; //! error log output function object + logger_func_type putLogWarn; //! warn log output function object + logger_func_type putLogInfo; //! info log output function object + logger_func_type putLogDebug; //! debug log output function object +}; + +} + +#endif // IP_REPLICATION_DATA_PROCESSOR_H diff --git a/module/protocol/ip_session_data_processor.cpp b/module/protocol/ip_session_data_processor.cpp new file mode 100644 index 00000000..1b320623 --- /dev/null +++ b/module/protocol/ip_session_data_processor.cpp @@ -0,0 +1,388 @@ +/* + * @file ip_session_data_processor.cpp + * @brief read ip data from replication area and set ip + * @brief data to replication area. + * + * L7VSD: Linux Virtual Server for Layer7 Load Balancing + * Copyright (C) 2009 NTT COMWARE Corporation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + **********************************************************************/ + +#include "ip_session_data_processor.h" +#include "protocol_module_base.h" +#include "boost/format.hpp" +#include "utility.h" + +namespace l7vs +{ +//! constructor +ip_session_data_processor::ip_session_data_processor( + int timeout, + ip_replication_data_processor* replication_data_processor, + getloglevel_func_type ingetloglevel, logger_func_type inputLogFatal, + logger_func_type inputLogError, logger_func_type inputLogWarn, + logger_func_type inputLogInfo, logger_func_type inputLogDebug) + :timeout(timeout), + replication_data_processor(replication_data_processor), + getloglevel(ingetloglevel), putLogFatal(inputLogFatal), + putLogError(inputLogError), putLogWarn(inputLogWarn), + putLogInfo(inputLogInfo), putLogDebug(inputLogDebug) +{ + //ctor + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("in_function : Constructor ip_session_data_processor::" + "ip_session_data_processor( " + "int timeout, ip_replication_data_processor* replication_data_processor, " + "getloglevel_func_type ingetloglevel, logger_func_type inputLogFatal, " + "logger_func_type inputLogError, logger_func_type inputLogWarn, " + "logger_func_type inputLogInfo, logger_func_type inputLogDebug) : " + "timeout = %d, replication_data_processor = &(%d)."); + formatter % timeout % static_cast(replication_data_processor); + putLogDebug(600186, formatter.str(), __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + + // parameter check + if (unlikely(timeout < 0 || replication_data_processor == NULL)) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + putLogDebug(600187, "out_function : Constructor ip_session_data_processor::" + "ip_session_data_processor(int timeout, " + "ip_replication_data_processor* replication_data_processor, " + "getloglevel_func_type ingetloglevel, logger_func_type inputLogFatal, " + "logger_func_type inputLogError, logger_func_type inputLogWarn, " + "logger_func_type inputLogInfo, logger_func_type inputLogDebug)." + , __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + + throw std::logic_error("invalid parameter value."); + } + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + putLogDebug(600188, "out_function : Constructor ip_session_data_processor::" + "ip_session_data_processor(int timeout, " + "ip_replication_data_processor* replication_data_processor, " + "getloglevel_func_type ingetloglevel, logger_func_type inputLogFatal, " + "logger_func_type inputLogError, logger_func_type inputLogWarn, " + "logger_func_type inputLogInfo, logger_func_type inputLogDebug)." + , __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ +} + +//! destructor +ip_session_data_processor::~ip_session_data_processor() +{ + //dtor + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + putLogDebug(600189, "in/out_function : Destructor ip_session_data_processor::" + "~ip_session_data_processor().", __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ +} + +//! get endpoint from session data +//! @param[in] ip hash +//! @param[out] endpoint refrence +//! @return 0 : success +//! @return 1: failed +//! @return -1:exception +int ip_session_data_processor::get_endpoint_from_session_data( + int ip_hash, + boost::asio::ip::tcp::endpoint& endpoint) +{ + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("in_function : int ip_session_data_processor::" + "get_endpoint_from_session_data(int ip_hash, " + "boost::asio::ip::tcp::endpoint& endpoint) : " + "ip_hash = %d."); + formatter % ip_hash; + putLogDebug(600190, formatter.str(), __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + + int ret = 0; + + try + { + boost::asio::ip::tcp::endpoint init_endpoint; + + // ip hash check + if (unlikely(ip_hash < 0 || ip_hash >= MAX_IP_SESSION_TBL_SIZE)) + { + putLogError(600104, "invalid parameter value.", __FILE__, __LINE__); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("out_function : int ip_session_data_processor::" + "get_endpoint_from_ip_data(int ip_hash, " + "boost::asio::ip::tcp::endpoint& endpoint) : return_value = 1."); + putLogDebug(600191, formatter.str(), __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + return 1; + } + + // session is not exist + if (session_table[ip_hash].rs_endpoint == init_endpoint) + { + ret = 1; + } + // session is exist + else + { + // expired time check + time_t now; + time(&now); + if (session_table[ip_hash].last_time == 0 || + timeout == 0 || + now - session_table[ip_hash].last_time <= timeout) + { + // time in + endpoint = session_table[ip_hash].rs_endpoint; + } + else + { + // time out + ret = 1; + } + } + } + catch(const std::exception& e) + { + std::cerr << "ip_session_data_processor::get_endpoint_from_ip_data() : exception: error = " << e.what() << "." << std::endl; + boost::format formatter("function : int ip_session_data_processor::" + "get_endpoint_from_ip_data() : exception : error = %s."); + formatter % e.what(); + putLogError(600105, formatter.str(), __FILE__, __LINE__); + + ret = -1; + } + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("out_function : int ip_session_data_processor::" + "get_endpoint_from_ip_data(int ip_hash, " + "boost::asio::ip::tcp::endpoint& endpoint) : return_value = %d."); + formatter % ret; + putLogDebug(600192, formatter.str(), __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + + return ret; +} + +//! write session data to session table +//! @param[in] ip hash +//! @param[in] endpoint refrence +//! @param[in] now time +//! @return 0 : success +//! @return 1: failed +//! @return -1:exception +int ip_session_data_processor::write_session_data( + int ip_hash, + const boost::asio::ip::tcp::endpoint& endpoint, + time_t now_time) +{ + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("in_function : int ip_session_data_processor::" + "write_session_data(int ip_hash," + "const boost::asio::ip::tcp::endpoint& endpoint, " + "time_t now_time) : ip_hash = %d, now_time = %d."); + formatter % ip_hash % now_time; + putLogDebug(600193, formatter.str(), __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + + boost::asio::ip::tcp::endpoint init_endpoint; + ip_replication_temp_data temp_data; + + try + { + // ip hash check + if (unlikely(ip_hash < 0 || ip_hash >= MAX_IP_SESSION_TBL_SIZE)) + { + putLogError(600106, "invalid parameter value.", __FILE__, __LINE__); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("out_function : int ip_session_data_processor::" + "write_session_data(int ip_hash," + "const boost::asio::ip::tcp::endpoint& endpoint, " + "time_t now_time) : return_value = 1."); + putLogDebug(600194, formatter.str(), __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + return 1; + } + + // write session data to session table + session_table[ip_hash].rs_endpoint = endpoint; + session_table[ip_hash].last_time = now_time; + + // set op_code + if (endpoint == init_endpoint) + { + temp_data.op_code = 'U'; + } + else + { + temp_data.op_code = 'A'; + } + + // add the replication list + temp_data.ip_hash = ip_hash; + temp_data.last_time = now_time; + temp_data.rs_endpoint = endpoint; + replication_data_processor->put_into_temp_list(temp_data); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string buffer; + boost::format formatter("function : int ip_session_data_processor::" + "write_session_data() : put_into_temp_list() " + "--add item ip_hash = %d -- end."); + formatter % ip_hash; + putLogDebug(600195, formatter.str(), __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + } + catch (const std::exception& e) + { + std::cerr << "write_session_data exception : error = " << e.what() << "." << std::endl; + boost::format formatter("function : int ip_session_data_processor::" + "write_session_data() : exception : error = %s."); + formatter % e.what(); + putLogError(600107, formatter.str(), __FILE__, __LINE__); + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + putLogDebug(600196, "out_function : int ip_session_data_processor::" + "write_session_data(int hash, " + "const boost::asio::ip::tcp::endpoint& endpoint, time_t now_time) : " + "return_value = -1.", __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + + return -1; + } + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + putLogDebug(600197, "out_function : int ip_session_data_processor::" + "write_ip_data(const std::string& ip, " + "const boost::asio::ip::tcp::endpoint& endpoint, time_t now_time) : " + "return_value = 0.", __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + + return 0; +} + +//! read session data from replication area +//! @param[in] ip_replication_data pointer +//! @return 0 : success +//! @return -1:exception +int ip_session_data_processor::read_session_data_from_replication_area( + ip_replication_data* replication_area ) +{ + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("in_function : int ip_session_data_processor::" + "read_session_data_from_replication_area(ip_replication_data* replication_area) : " + "replication_area = &(%d)."); + formatter % static_cast(replication_area); + putLogDebug(600198, formatter.str(), __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + + // null check + if (replication_area == NULL) + { + putLogError(600108, "Replication area is NULL.", __FILE__, __LINE__); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + putLogDebug(600199, "out_function : int ip_session_data_processor::" + "read_session_data_from_replication_area(" + "ip_replication_data* replication_area) : return_value = -1.", __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + return -1; + } + + int ret = 0; + try + { + // restore replication data to session table + for (int i = 0; i < MAX_IP_SESSION_TBL_SIZE; ++i) + { + if (replication_area[i].valid == 1) + { + boost::asio::ip::tcp::endpoint endpoint( + boost::asio::ip::address::from_string(replication_area[i].realserver_ip), + replication_area[i].realserver_port); + session_table[i].rs_endpoint = endpoint; + session_table[i].last_time = replication_area[i].last_time; + } + } + } + catch(const std::exception& e) + { + std::cerr << "ip_session_data_processor::read_session_data_from_replication_area() : " + "exception : error = " << e.what() << "." << std::endl; + boost::format formatter("function : int ip_session_data_processor::" + "read_session_data_from_replication_area() : exception : error = %s."); + formatter % e.what(); + putLogError(600109, formatter.str(), __FILE__, __LINE__); + + ret = -1; + } + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("out_function : int ip_session_data_processor::" + "read_session_data_from_replication_area(ip_replication_data* replication_area) : " + "return_value = %d."); + formatter % ret; + putLogDebug(600200, formatter.str(), __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + + return ret; +} + +} diff --git a/module/protocol/ip_session_data_processor.h b/module/protocol/ip_session_data_processor.h new file mode 100644 index 00000000..8572d0a2 --- /dev/null +++ b/module/protocol/ip_session_data_processor.h @@ -0,0 +1,93 @@ +/* + * @file ip_session_data_processor.h + * @brief ip ip data processor header file. + * + * L7VSD: Linux Virtual Server for Layer7 Load Balancing + * Copyright (C) 2009 NTT COMWARE Corporation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + **********************************************************************/ + +#ifndef IP_SESSION_DATA_PROCESSOR_H +#define IP_SESSION_DATA_PROCESSOR_H + +#include "ip_replication_data_processor.h" +#include "logger_enum.h" +#include +#include + +#define HASH_TABLE_BITS 8 +#define MAX_IP_SESSION_TBL_SIZE (1 << HASH_TABLE_BITS) + +namespace l7vs +{ + +struct ip_session_table_entry{ + time_t last_time; + boost::asio::ip::tcp::endpoint rs_endpoint; +}; + + +class ip_session_data_processor +{ + public: + //! loglevel get function object type + typedef boost::function< LOG_LEVEL_TAG(void) > + getloglevel_func_type; + //! log output function object type + typedef boost::function< void (const unsigned int, const std::string&, const char*, int) > + logger_func_type; + + public: + ip_session_data_processor( + int timeout, + ip_replication_data_processor* replication_data_processor, + getloglevel_func_type ingetloglevel, + logger_func_type inputLogFatal, + logger_func_type inputLogError, + logger_func_type inputLogWarn, + logger_func_type inputLogInfo, + logger_func_type inputLogDebug); + + virtual ~ip_session_data_processor(); + + int get_endpoint_from_session_data( + int ip_hash, + boost::asio::ip::tcp::endpoint& endpoint); + + int write_session_data( + int ip_hash, + const boost::asio::ip::tcp::endpoint& endpoint, + time_t now_time); + + int read_session_data_from_replication_area(ip_replication_data* replication_area); + + protected: + int timeout; + boost::array session_table; + ip_replication_data_processor* replication_data_processor; + getloglevel_func_type getloglevel; //!< get loglevel function object + logger_func_type putLogFatal; //!< fatal log output function object + logger_func_type putLogError; //!< error log output function object + logger_func_type putLogWarn; //!< warn log output function object + logger_func_type putLogInfo; //!< info log output function object + logger_func_type putLogDebug; //!< debug log output function object + private: +}; + +} +#endif // IP_SESSION_DATA_PROCESSOR_H diff --git a/module/protocol/protocol_module_ip.cpp b/module/protocol/protocol_module_ip.cpp new file mode 100644 index 00000000..39bf60f5 --- /dev/null +++ b/module/protocol/protocol_module_ip.cpp @@ -0,0 +1,6371 @@ +/* + * @file protocol_module_ip.cpp + * @brief protocol module of any protocol. + * @brief this module never keep session persistence. + * + * L7VSD: Linux Virtual Server for Layer7 Load Balancing + * Copyright (C) 2009 NTT COMWARE Corporation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + **********************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include "protocol_module_ip.h" +#include "http_utility.h" +#include "utility.h" + +namespace l7vs +{ + + const std::string protocol_module_ip::MODULE_NAME = "ip"; + const int protocol_module_ip::THREAD_DIVISION_UP_STREAM = 0; + const int protocol_module_ip::THREAD_DIVISION_DOWN_STREAM = 1; + + const int protocol_module_ip::END_FLAG_OFF = 0; + const int protocol_module_ip::END_FLAG_ON = 1; + + const int protocol_module_ip::ACCEPT_END_FLAG_OFF = 0; + const int protocol_module_ip::ACCEPT_END_FLAG_ON = 1; + + const int protocol_module_ip::SORRY_FLAG_ON = 1; + const int protocol_module_ip::SORRY_FLAG_OFF = 0; + + const int protocol_module_ip::SWITCH_FLAG_OFF = 0; + const int protocol_module_ip::SWITCH_FLAG_ON = 1; + + const int protocol_module_ip::FORWARDED_FOR_OFF = 0; + const int protocol_module_ip::FORWARDED_FOR_ON = 1; + + using namespace boost::xpressive; + //! constractor + protocol_module_ip::protocol_module_ip() : + ip_protocol_module_base(MODULE_NAME), forwarded_for(FORWARDED_FOR_OFF), + realserver_connect_failed_max_count(REALSERVER_CONNECT_FAILED_COUNT) + { + sorry_uri.assign('\0'); + sorry_uri[0] = '/'; + } + //! destractor + protocol_module_ip::~protocol_module_ip() + { + } + //! tcp protocol support check + //! @return tcp support is true + //! @return tcp not-support is false + bool protocol_module_ip::is_tcp() + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + putLogDebug(600000, "in/out_function : bool protocol_module_ip::is_tcp() : return_value = true.", + __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + return true; + } + + //! udp protocol support check + //! @return udp support is true + //! @return udp not-support is false + bool protocol_module_ip::is_udp() + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + putLogDebug(600001, "in/out_function : bool protocol_module_ip::is_udp() : return_value = false.", + __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + return false; + } + + //! replication interval interrrupt + //! timer thread call this function. from virtualservice. + void protocol_module_ip::replication_interrupt() + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + putLogDebug(600002, "in/out_function : void protocol_module_ip::" + "replication_interrupt().", __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + } + //! initialize function. called from module control. module loaded call + //! @param[in] realserver list iterator begin function object type + //! @param[in] realserver list iterator end function object type + //! @param[in] realserver list iterator next function object type + //! @param[in] realserver list mutex lock function object type. + //! @param[in] realserver list mutex unlock function object type + void protocol_module_ip::initialize(rs_list_itr_func_type inlist_begin, + rs_list_itr_func_type inlist_end, + rs_list_itr_next_func_type inlist_next, + boost::function< void( void ) > inlist_lock, + boost::function< void( void ) > inlist_unlock) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + putLogDebug(600003, "in_function : void protocol_module_ip::initialize(" + "rs_list_itr_func_type inlist_begin, rs_list_itr_func_type inlist_end, " + "rs_list_itr_next_func_type inlist_next, boost::function< void(void) > " + "inlist_lock, boost::function< void(void) > inlist_unlock).", __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + + //RealServer list begin function + rs_list_begin = inlist_begin; + //RealServer list end function + rs_list_end = inlist_end; + //RealServer list next function + rs_list_next = inlist_next; + //RealServer list lock funtion + rs_list_lock = inlist_lock; + //RealServer list unlock funtion + rs_list_unlock = inlist_unlock; + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + putLogDebug(600004, "out_function : void protocol_module_ip::initialize(" + "rs_list_itr_func_type inlist_begin, rs_list_itr_func_type inlist_end, " + "rs_list_itr_next_func_type inlist_next, boost::function< void(void) > " + "inlist_lock, boost::function< void(void) > inlist_unlock).", __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + } + + //! finalize called from module control. module unloaded call. + void protocol_module_ip::finalize() + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + putLogDebug(600005, "in_function : void protocol_module_ip::finalize().", __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + + //RealServer list functions initializtion + //RealServer list begin function + rs_list_begin.clear(); + //RealServer list end function + rs_list_end.clear(); + //RealServer list next function + rs_list_next.clear(); + //RealServer list lock function + rs_list_lock.clear(); + //RealServer list unlock function + rs_list_unlock.clear(); + + //Replication functions initializtion + //component memory allcate function + replication_pay_memory.clear(); + //component memory lock function + replication_area_lock.clear(); + //component memory unlock function + replication_area_unlock.clear(); + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + putLogDebug(600006, "function : void protocol_module_ip::finalize() : " + "rs_list_begin.clear(), rs_list_end.clear(), rs_list_next.clear(), " + "rs_list_lock.clear(), rs_list_unlock.clear() end.", __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + + //ScheduleModule's functions initializtion + schedule_tcp.clear(); + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + putLogDebug(600007, "function : void protocol_module_ip::finalize() : " + "schedule_tcp.clear() end.", __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + + //Module's option initializtion + //forwarded_for + forwarded_for = FORWARDED_FOR_OFF; + //sorry-uri + sorry_uri.assign('\0'); + //time_out + timeout = 0; + //reschedule flag + reschedule = 0; + + // replication initialize + if (replication_data_processor) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("delete : address = &(%d)."); + formatter % static_cast(replication_data_processor); + putLogDebug(600008, formatter.str(), __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + + delete replication_data_processor; + replication_data_processor = NULL; + } + + // session initialize + if (ip_data_processor) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("delete : address = &(%d)."); + formatter % static_cast(ip_data_processor); + putLogDebug(600009, formatter.str(), __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + + delete ip_data_processor; + ip_data_processor = NULL; + } + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + putLogDebug(600010, "out_function : void protocol_module_ip::finalize().", __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + + //logger functions initializtion + //log level getting function + getloglevel.clear(); + //logger(Fatal) + putLogFatal.clear(); + //logger(Error) + putLogError.clear(); + //logger(Warn) + putLogWarn.clear(); + //logger(Info) + putLogInfo.clear(); + //logger(Debug) + putLogDebug.clear(); + } + + //! sorry support check + //! @return true sorry mode is supported. + //! @return false sorry mode is unsupported. + bool protocol_module_ip::is_use_sorry() + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + putLogDebug(600011, "in/out_function : bool protocol_module_ip::is_use_sorry() : return_value = true.", + __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + return true; + } + + //! realserver list update event + void protocol_module_ip::handle_rslist_update() + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + putLogDebug(600012, "in/out_function : void protocol_module_ip::handle_rslist_update().", + __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + } + + //! module parameter check.used by l7vsadm + //! @param[in] module paramter string list + //! @return result.flag true is parameter is noproblem. + //! @return result.flag false is paramter is problem. + protocol_module_base::check_message_result protocol_module_ip::check_parameter(const std::vector< + std::string>& args) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("in_function : protocol_module_ip::check_message_result " + "protocol_module_ip::check_parameter(" + "const std::vector& args) : args = %s."); + std::string argsdump; + for (std::vector::const_iterator it = args.begin(); it != args.end(); ++it) + { + argsdump += *it; + } + formatter % argsdump; + putLogDebug(600013, formatter.str(), __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + + //set check result true + // set check result flag true + check_message_result check_result; + check_result.flag = true; + bool timeout_flag = false; + bool reschedule_flag = false; + bool no_reschedule_flag = false; + bool forward_checked = false; + bool sorryuri_checked = false; + sregex sorry_uri_regex + = +( '/' >> + *( alpha | + digit | + ( set = ';', ':', '@', '&', '=' ) | + ( set = '$', '-', '_', '.', '+' ) | + ( set = '!', '*', '\'', '\(', ')', ',' ) | + '%' >> repeat<2>(xdigit))); + + typedef std::vector::const_iterator vec_str_it; + + try + { + vec_str_it it = args.begin(); + vec_str_it it_end = args.end(); + boost::format formatter; + + //loop option strings + for (; it != it_end;) + { + if (*it == "-T" || *it == "--timeout") + { + // timeout + if (!timeout_flag) + { + // not set timeout option + ++it; + // next parameter exist check + if (it != it_end) + { + // next parameter exist + if ((*it).substr(0, 1) == "-" || (*it).substr(0, 2) == "--") + { + continue; + } + + try + { + unsigned long ultimeout = 0; + ultimeout = boost::lexical_cast(*it); + // int maxvalue check + if (ultimeout > INT_MAX) + { + check_result.flag = false; + formatter.parse("'-T/--timeout' option value '%s' is too large."); + formatter % *it; + check_result.message = formatter.str(); + putLogError(600000, check_result.message, __FILE__, __LINE__); + break; + } + else + { + timeout_flag = true; + ++it; + continue; + } + } + catch (boost::bad_lexical_cast& e) + { + // not numeric character + check_result.flag = false; + formatter.parse("'-T/--timeout' option value '%s' is not numeric character."); + formatter % *it; + check_result.message = formatter.str(); + putLogError(600001, check_result.message, __FILE__, __LINE__); + break; + } + } + else + { + break; + } + } + else + { + // already set timeout + check_result.flag = false; + check_result.message = "Cannot set multiple option '-T/--timeout'."; + putLogError(600002, check_result.message, __FILE__, __LINE__); + break; + } + } + else if (*it == "-R" || *it == "--reschedule") + { + // reschedule + if (!no_reschedule_flag) + { + // not set no-reschedule flag + reschedule_flag = true; + } + else + { + // already set no-reschedule flag + check_result.flag = false; + check_result.message = "You have to choose either of reschedule or no-reschedule."; + putLogError(600003, check_result.message, __FILE__, __LINE__); + break; + } + } + else if (*it == "-N" || *it == "--no-reschedule") + { + // no-reschedule + if (!reschedule_flag) + { + // not set reschedule flag + no_reschedule_flag = true; + } + else + { + // already set reshcedule flag + check_result.flag = false; + check_result.message = "You have to choose either of reschedule or no-reschedule."; + putLogError(600004, check_result.message, __FILE__, __LINE__); + break; + } + } + //option string = "-F" + else if (*it == "-F" || *it == "--forwarded-for") + { + //set forward flag ON + forward_checked = true; + } + //option string = "-S" + else if (*it == "-S" || *it == "--sorry-uri") + { + //set sorryURI flag OFF + if (!sorryuri_checked) + { + //next item exist + if (++it != it_end) + { + if (!it->empty() && (it->substr(0, 1) == "-" || it->substr(0, 2) == "--")) + { + //set check result flag false + check_result.flag = false; + //set check result message + check_result.message = "You have to set option value '-S/--sorry-uri'."; + putLogError(600005, check_result.message, __FILE__, __LINE__ ); + //loop break; + break; + } + //next option string's length > 127 + if (it->size() > MAX_OPTION_SIZE - 1) + { + std::ostringstream ostr; + ostr << "'-S/--sorry-uri' option value '" << *it << "' is too long."; + + //set check result flag false + check_result.flag = false; + //set check result message + check_result.message = ostr.str(); + putLogError(600006, check_result.message, __FILE__, __LINE__ ); + //loop break; + break; + } + //next option string's length <= 127 + else + { + //regex check + if (regex_match(*it, sorry_uri_regex )) + { + //check OK + //set sorryURI flag ON + sorryuri_checked = true; + } + //check NG + else + { + std::ostringstream ostr; + ostr << "'-S/--sorry-uri' option value '" << *it << "' is not a valid URI."; + + //set check result flag false + check_result.flag = false; + //set check result message + check_result.message = ostr.str(); + putLogError(600007, check_result.message, __FILE__, __LINE__ ); + break; + } + } + } + //next item is not exist + else + { + //set check flag false + check_result.flag = false; + //set check result message + check_result.message = "You have to set option value '-S/--sorry-uri'."; + putLogError(600008, check_result.message, __FILE__, + __LINE__ ); + //loop break + break; + } + } + //sorryURI flag = ON + else + { + //set check result flag false + check_result.flag = false; + //set check result message + check_result.message = "Cannot set multiple option '-S/--sorry-uri'."; + putLogError(600009, check_result.message, __FILE__, + __LINE__ ); + //loop break + break; + } + } + //other option string + else + { + //set check result flag false + check_result.flag = false; + //set check result message + check_result.message = "Option error."; + putLogError(600010, check_result.message, __FILE__, __LINE__ ); + //loop break + break; + } + + ++it; + } + } + catch (const std::exception& ex) + { + check_result.flag = false; + std::cerr << "protocol_module_ip::check_parameter() : exception : error = " << ex.what() << "." << std::endl; + boost::format formatter("function : protocol_module_base::check_message_result " + "protocol_module_ip::check_parameter() exception : " + "error = %s."); + formatter % ex.what(); + putLogError(600011, formatter.str(), __FILE__, __LINE__ ); + } + catch (...) + { + check_result.flag = false; + std::cerr << "protocol_module_ip::check_parameter() : Unknown exception." << std::endl; + putLogError(600012, "function : protocol_module_base::check_message_result " + "protocol_module_ip::check_parameter() : " + "Unknown exception.", __FILE__, __LINE__ ); + } + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("out_function : protocol_module_base::check_message_result " + "protocol_module_ip::check_parameter(" + "const std::vector& args) : return_value = (" + "check_message_result.flag = %d, check_message_result.message = %s)."); + formatter % check_result.flag % check_result.message; + putLogDebug(600014, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + return check_result; + } + + //! parameter set + //! @param[in] module paramter string list + //! @return result.flag true is parameter is noproblem. + //! @return result.flag false is paramter is problem. + protocol_module_base::check_message_result protocol_module_ip::set_parameter(const std::vector< + std::string>& args) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("in_function : protocol_module_base::check_message_result " + "protocol_module_ip::set_parameter(" + "const std::vector& args) : args = %s."); + std::string argsdump; + for (std::vector::const_iterator it = args.begin(); it != args.end(); ++it) + { + argsdump += *it; + argsdump += " "; + } + formatter % argsdump; + putLogDebug(600015, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + //set check result flag true + check_message_result check_result; + check_result.flag = true; + bool timeout_flag = false; + bool reschedule_flag = false; + bool no_reschedule_flag = false; + bool forward_checked = false; + bool sorryuri_checked = false; + boost::format formatter; + sregex sorry_uri_regex + = +( '/' >> + *( alpha | + digit | + ( set = ';', ':', '@', '&', '=' ) | + ( set = '$', '-', '_', '.', '+' ) | + ( set = '!', '*', '\'', '\(', ')', ',' ) | + '%' >> repeat<2>(xdigit))); + + typedef std::vector::const_iterator vec_str_it; + + //set forwarded flag true + forwarded_for = 1; + + try + { + vec_str_it it = args.begin(); + vec_str_it it_end = args.end(); + + for (; it != it_end;) + { + + if (*it == "-T" || *it == "--timeout") + { + // timeout + if (!timeout_flag) + { + // not set timeout option + ++it; + // next parameter exist check + if (it != it_end) + { + // next parameter exist + if ((*it).substr(0, 1) == "-" || (*it).substr(0, 2) == "--") + { + continue; + } + + try + { + unsigned long ultimeout = 0; + ultimeout = boost::lexical_cast(*it); + // int maxvalue check + if (ultimeout > INT_MAX) + { + check_result.flag = false; + formatter.parse("'-T/--timeout' option value '%s' is too large."); + formatter % *it; + check_result.message = formatter.str(); + putLogError(600013, check_result.message, __FILE__, __LINE__); + break; + } + else + { + timeout_flag = true; + timeout = ultimeout; + ++it; + continue; + } + } + catch (boost::bad_lexical_cast& e) + { + // not numeric character + check_result.flag = false; + formatter.parse("'-T/--timeout' option value '%s' is not numeric character."); + formatter % *it; + check_result.message = formatter.str(); + putLogError(600014, check_result.message, __FILE__, __LINE__); + break; + } + } + else + { + break; + } + } + else + { + // already set timeout + check_result.flag = false; + check_result.message = "Cannot set multiple option '-T/--timeout'."; + putLogError(600015, check_result.message, __FILE__, __LINE__); + break; + + } + } + else if (*it == "-R" || *it == "--reschedule") + { + // reschedule + if (!no_reschedule_flag) + { + // not set no-reschedule flag + reschedule_flag = true; + reschedule = 1; + } + else + { + // already set no-reschedule flag + check_result.flag = false; + check_result.message = "You have to choose either of reschedule or no-reschedule."; + putLogError(600016, check_result.message, __FILE__, __LINE__); + break; + } + } + else if (*it == "-N" || *it == "--no-reschedule") + { + // no-reschedule + if (!reschedule_flag) + { + // not set reschedule flag + no_reschedule_flag = true; + reschedule = 0; + + } + else + { + // already set reshcedule flag + check_result.flag = false; + check_result.message = "You have to choose either of reschedule or no-reschedule."; + putLogError(600017, check_result.message, __FILE__, __LINE__); + break; + } + } + //option string = "-F" + else if (*it == "-F" || *it == "--forwarded-for") + { + //set forwarded flag ON + forward_checked = true; + forwarded_for = FORWARDED_FOR_ON; + } + //option string = "-S" + else if (*it == "-S" || *it == "--sorry-uri") + { + //sorryURI flag = OFF + if (!sorryuri_checked) + { + //next item exist + if (++it != it_end) + { + if (!it->empty() && (it->substr(0, 1) == "-" || it->substr(0, 2) == "--")) + { + //set check result flag false + check_result.flag = false; + //set check result message + check_result.message = "You have to set option value '-S/--sorry-uri'."; + //loop break + break; + } + //next option string's length > 127 + if (it->size() > MAX_OPTION_SIZE - 1) + { + std::ostringstream ostr; + ostr << "'-S/--sorry-uri' option value '" << *it << "' is too long."; + + //set check result flag false + check_result.flag = false; + //set check result message + check_result.message = ostr.str(); + putLogError(600018, check_result.message, __FILE__, + __LINE__ ); + //loop break + break; + } + //next option string's length <= 127 + else + { + //regex check + //check OK + if (regex_match(*it, sorry_uri_regex)) + { + sorryuri_checked = true; + memcpy(sorry_uri.data(), it->c_str(), it->size()); + } + //check NG + else + { + std::ostringstream ostr; + ostr << "'-S/--sorry-uri' option value '" << *it << "' is not a valid URI."; + + //set check result flag false + check_result.flag = false; + //set check result message + check_result.message = ostr.str(); + putLogError(600019, check_result.message, __FILE__, + __LINE__ ); + break; + } + } + } + //next item not exist + else + { + //set check result flag false + check_result.flag = false; + //set check result message + check_result.message = "You have to set option value '-S/--sorry-uri'."; + putLogError(600020, check_result.message, __FILE__, + __LINE__ ); + break; + } + } + //sorryURI flag = ON + else + { + //set check result flag false + check_result.flag = false; + //set check result message + check_result.message = "Cannot set multiple option '-S/--sorry-uri'."; + putLogError(600021, check_result.message, __FILE__, + __LINE__ ); + break; + } + } + //others + else + { + //set check result flag false + check_result.flag = false; + //set check result message + check_result.message = "Option error."; + putLogError(600022, check_result.message, __FILE__, __LINE__); + + break; + } + ++it; + } + + // result check + if (check_result.flag) + { + // set timeout's default value + if (!timeout_flag) + { + timeout = 3600; + } + + // set reschedule's default value + if (!reschedule_flag) + { + reschedule = 0; + } + //forward flag = OFF + if (!forward_checked) + { + forwarded_for = 0; + } + + } + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_ip::check_message_result " + "protocol_module_ip::set_parameter(const std::vector& args) : " + "timeout = %d, reschedule = %d."); + formatter % timeout % reschedule; + putLogDebug(600016, formatter.str(), __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + + unsigned int data_size = 0; + void* data_addr = NULL; + data_addr = replication_pay_memory(get_name(), &data_size); + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + putLogDebug(600017, "function : protocol_module_ip::check_message_result protocol_module_ip::" + "set_parameter() : replication_pay_memory() end.", __FILE__, __LINE__); + boost::format formatter("function : protocol_module_ip::check_message_result protocol_module_ip::" + "set_parameter() : data_addr = &(%d), data_size = %d."); + formatter % data_addr % data_size; + putLogDebug(600018, formatter.str(), __FILE__, __LINE__); + } + + /*------DEBUG LOG END------*/ + if (data_addr == NULL || data_size <= 0) + { + // replication area is null + putLogError(600023, "Replication area is null.", __FILE__, __LINE__); + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + putLogDebug(600019, "function : protocol_module_ip::check_message_result " + "protocol_module_ip::set_parameter() : " + "Replication area is null.", __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + } + + // create ip_replication_data_processor + replication_data_processor = new ip_replication_data_processor( + static_cast(data_addr), + data_size, + virtual_service_endpoint_tcp, + getloglevel, + putLogFatal, + putLogError, + putLogWarn, + putLogInfo, + putLogDebug ); + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("new : address = &(%d), size = %lu."); + formatter % static_cast(replication_data_processor) + % sizeof(ip_replication_data_processor); + putLogDebug(600020, formatter.str(), __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + + replication_data_processor->register_replication_area_lock(replication_area_lock); + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + putLogDebug(600021, "function : protocol_module_ip::check_message_result protocol_module_ip::" + "set_parameter() : register_replication_area_lock() end.", __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + + replication_data_processor->register_replication_area_unlock(replication_area_unlock); + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + putLogDebug(600022, "function : protocol_module_ip::check_message_result protocol_module_ip::" + "set_parameter() : register_replication_area_unlock() end.", __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + + // create ip_session_data_processor + ip_data_processor = new ip_session_data_processor( + timeout, + replication_data_processor, + getloglevel, + putLogFatal, + putLogError, + putLogWarn, + putLogInfo, + putLogDebug); + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("new : address = &(%d), size = %lu."); + formatter % static_cast(ip_data_processor) + % sizeof(ip_session_data_processor); + putLogDebug(600023, formatter.str(), __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + + // restore data from replication area + ip_replication_data* redata = replication_data_processor->get_replication_area(); + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + putLogDebug(600024, "function : protocol_module_ip::check_message_result protocol_module_ip::" + "set_parameter() : get_replication_area() end.", __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + + replication_area_lock(); + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + putLogDebug(600025, "function : protocol_module_ip::check_message_result protocol_module_ip::" + "set_parameter() : replication_area_lock() end.", __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + + ip_data_processor->read_session_data_from_replication_area(redata); + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + putLogDebug(600026, "function : protocol_module_ip::check_message_result protocol_module_ip::" + "set_parameter() : read_session_data_from_replication_area() end.", __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + + replication_area_unlock(); + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + putLogDebug(600027, "function : protocol_module_ip::check_message_result protocol_module_ip::" + "set_parameter() : replication_area_unlock() end.", __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + + } + catch (const std::bad_alloc& ba) + { + if (replication_data_processor) + { + delete replication_data_processor; + replication_data_processor = NULL; + } + + if (ip_data_processor) + { + delete ip_data_processor; + ip_data_processor = NULL; + } + + std::cerr << "protocol_module_ip::set_parameter() : exception : Could not allocate memory." << std::endl; + check_result.flag = false; + check_result.message = "Could not allocate memory."; + putLogError(600024, check_result.message, __FILE__, __LINE__); + } + catch (const std::exception& ex) + { + if (replication_data_processor) + { + delete replication_data_processor; + replication_data_processor = NULL; + } + + if (ip_data_processor) + { + delete ip_data_processor; + ip_data_processor = NULL; + } + + check_result.flag = false; + std::cerr << "protocol_module_ip::set_parameter() : exception : error = " << ex.what() << std::endl; + boost::format formatter("function : protocol_module_ip::check_message_result " + "protocol_module_ip::set_parameter() : exception : error = %s."); + formatter % ex.what(); + putLogError(600025, formatter.str(), __FILE__, __LINE__); + } + catch (...) + { + if (replication_data_processor) + { + delete replication_data_processor; + replication_data_processor = NULL; + } + + if (ip_data_processor) + { + delete ip_data_processor; + ip_data_processor = NULL; + } + + check_result.flag = false; + std::cerr << "protocol_module_ip::set_parameter() : Unknown exception." << std::endl; + putLogError(600026, "function : protocol_module_ip::check_message_result protocol_module_ip::" + "set_parameter() : Unknown exception.", __FILE__, __LINE__); + } + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("out_function : protocol_module_ip::check_message_result " + "protocol_module_ip::set_parameter(" + "const std::vector& args) : return_value = (" + "check_message_result.flag = %d, check_message_result.message = %s)."); + formatter % check_result.flag % check_result.message; + putLogDebug(600028, formatter.str(), __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + return check_result; + } + + //! parameter add + //! @param[in] module paramter string list + //! @return result.flag true is parameter is noproblem. + //! @return result.flag false is paramter is problem. + protocol_module_base::check_message_result protocol_module_ip::add_parameter(const std::vector< + std::string>& args) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("in_function : protocol_module_ip::check_message_result protocol_module_ip::" + "add_parameter(const std::vector& args) : args = %s."); + std::string argsdump; + for (std::vector::const_iterator it = args.begin(); it != args.end(); ++it) + { + argsdump += *it; + } + formatter % argsdump; + putLogDebug(600029, formatter.str(), __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + check_message_result check_result; + //set check result flag true + check_result.flag = true; + + //param list is not empty + if (!args.empty()) + { + //set check result flag false + check_result.flag = false; + //set check result message + check_result.message = "Cannot add option."; + putLogError(600027, check_result.message, __FILE__, __LINE__ ); + } + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("out_function : protocol_module_ip::check_message_result " + "protocol_module_ip::add_parameter(const std::vector& args) : " + "return_value = (check_message_result.flag = %d, check_message_result.message = %s)."); + formatter % check_result.flag % check_result.message; + putLogDebug(600030, formatter.str(), __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + return check_result; + } + + + + //! TCP/IP scheduled function registation. + //! @param[in] schedule module TCP/IP scheduled function object type + void protocol_module_ip::register_schedule(tcp_schedule_func_type inschedule) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + putLogDebug(600031, "in_function : void protocol_module_ip::register_schedule(" + "tcp_schedule_func_type inschedule).", __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + schedule_tcp = inschedule; + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + putLogDebug(600032, "out_function : void protocol_module_ip::register_schedule(" + "tcp_schedule_func_type inschedule).", __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + } + + //! UDP scheduled function registation + //! @param[in] schedule module UDP scheduled funtion object type + void protocol_module_ip::register_schedule(udp_schedule_func_type inschedule) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + putLogDebug(600033, "in/out_function : void protocol_module_ip::register_schedule(" + "udp_schedule_func_type inschedule).", __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + } + + //! called from session initialzie use in upstream_thread + //! @param[in] upstream thread id. + //! @param[in] downstream thread id + //! @return session use EVENT mode. + protocol_module_base::EVENT_TAG protocol_module_ip::handle_session_initialize( + const boost::thread::id up_thread_id, const boost::thread::id down_thread_id, + const boost::asio::ip::tcp::endpoint& client_endpoint_tcp, + const boost::asio::ip::udp::endpoint& client_endpoint_udp) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("in_function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_session_initialize(const boost::thread::id up_thread_id, " + "const boost::thread::id down_thread_id, " + "const boost::asio::ip::tcp::endpoint& client_endpoint_tcp, " + "const boost::asio::ip::udp::endpoint& client_endpoint_udp) : " + "up_thread_id = %d, down_thread_id = %d."); + formatter % up_thread_id % down_thread_id; + putLogDebug(600034, formatter.str(), __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + + EVENT_TAG status = FINALIZE; + unsigned int ip_hash = 0; + + //session thread initialization + try + { + thread_data_ptr p_up(new session_thread_data_ip); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("new : address = &(%d), size = %lu."); + formatter % static_cast(p_up.get()) % sizeof(session_thread_data_ip); + putLogDebug(600035, formatter.str(), __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + + //calculate ip address's hash + ip_hash = l7vs_ip_service_calc_hash(client_endpoint_tcp); + + p_up->thread_id = up_thread_id; + p_up->thread_division = THREAD_DIVISION_UP_STREAM; + p_up->pair_thread_id = down_thread_id; + p_up->accept_end_flag = ACCEPT_END_FLAG_OFF; + p_up->end_flag = END_FLAG_OFF; + p_up->sorry_flag = SORRY_FLAG_OFF; + p_up->switch_flag = SWITCH_FLAG_OFF; + p_up->last_status = INITIALIZE; + p_up->client_endpoint = client_endpoint_tcp; + p_up->data_buffer = new char[MAX_BUFFER_SIZE]; + p_up->data_buffer_size = MAX_BUFFER_SIZE; + p_up->data_length = 0; + p_up->data_offset = 0; + p_up->current_message_rest_size = 0; + p_up->data_state = HTTP_START; + p_up->realserver_connect_failed_count = 0; + p_up->ip_hash = ip_hash; + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + // data dump + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_session_initialize() : session_thread_data_ip(upthread) : " + "thread_id = %d, thread_division = %d, " + "pair_thread_id = %d, accept_end_flag = %d, end_flag = %d, " + "sorry_flag = %d, switch_flag = %d, last_status = %d, client_endpoint = [%s]:%d, data_buffer = &(%d)," + "data_buffer_size = %d, data_length = %d, data_offset = %d, current_message_rest_size = %d, data_state = %d," + "realserver_connect_failed_count = %d, ip_hash = %d."); + formatter % p_up->thread_id + % p_up->thread_division + % p_up->pair_thread_id + % p_up->accept_end_flag + % p_up->end_flag + % p_up->sorry_flag + % p_up->switch_flag + % p_up->last_status + % p_up->client_endpoint.address().to_string() + % p_up->client_endpoint.port() + % p_up->data_buffer + % p_up->data_buffer_size + % p_up->data_length + % p_up->data_offset + % p_up->current_message_rest_size + % p_up->data_state + % p_up->realserver_connect_failed_count + % p_up->ip_hash; + + + putLogDebug(600036, formatter.str(), __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + + thread_data_ptr p_down(new session_thread_data_ip); + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("new : address = &(%d), size = %lu."); + formatter % static_cast(p_down.get()) % sizeof(session_thread_data_ip); + putLogDebug(600037, formatter.str(), __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + + p_down->thread_id = down_thread_id; + p_down->thread_division = THREAD_DIVISION_DOWN_STREAM; + p_down->pair_thread_id = up_thread_id; + p_down->accept_end_flag = ACCEPT_END_FLAG_OFF; + p_down->end_flag = END_FLAG_OFF; + p_down->sorry_flag = SORRY_FLAG_OFF; + p_down->switch_flag = SWITCH_FLAG_OFF; + p_down->last_status = INITIALIZE; + p_down->client_endpoint = client_endpoint_tcp; + p_down->data_buffer = new char[MAX_BUFFER_SIZE]; + p_down->data_buffer_size = MAX_BUFFER_SIZE; + p_down->data_length = 0; + p_down->data_offset = 0; + p_down->current_message_rest_size = 0; + p_down->data_state = HTTP_START; + p_down->realserver_connect_failed_count = 0; + p_down->ip_hash = ip_hash; + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + // data_dump + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_session_initialize() : session_thread_data_ip(downthread) : " + "thread_id = %d, thread_division = %d, " + "pair_thread_id = %d, accept_end_flag = %d, end_flag = %d, " + "sorry_flag = %d, switch_flag = %d, last_status = %d, client_endpoint = [%s]:%d, data_buffer = &(%d)," + "data_buffer_size = %d, data_length = %d, data_offset = %d, current_message_rest_size = %d, data_state = %d," + "realserver_connect_failed_count = %d, ip_hash = %d."); + formatter % p_down->thread_id + % p_down->thread_division + % p_down->pair_thread_id + % p_down->accept_end_flag + % p_down->end_flag + % p_down->sorry_flag + % p_down->switch_flag + % p_down->last_status + % p_down->client_endpoint.address().to_string() + % p_down->client_endpoint.port() + % p_down->data_buffer + % p_down->data_buffer_size + % p_down->data_length + % p_down->data_offset + % p_down->current_message_rest_size + % p_down->data_state + % p_down->realserver_connect_failed_count + % p_down->ip_hash; + putLogDebug(600038, formatter.str(), __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + + + boost::mutex::scoped_lock slock(session_thread_data_map_mutex); + + session_thread_data_map[up_thread_id] = p_up; + session_thread_data_map[down_thread_id] = p_down; + + //set return status + status = ACCEPT; + //save last status + session_thread_data_map[up_thread_id]->last_status = status; + session_thread_data_map[down_thread_id]->last_status = REALSERVER_RECV; + } + catch (const std::bad_alloc&) + { + std::cerr << "protocol_module_ip::handle_session_initialize() : exception : Could not allocate memory." << std::endl; + boost::format formatter("Could not allocate memory. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(600028, formatter.str(), __FILE__, __LINE__); + status = FINALIZE; + } + catch (const std::exception& ex) + { + std::cerr << "protocol_module_ip::handle_session_initialize() : exception : error = " << ex.what() << "." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_session_initialize() : exception : error = %s. thread id : %d."); + formatter % ex.what() % boost::this_thread::get_id(); + putLogError(600029, formatter.str(), __FILE__, __LINE__); + status = FINALIZE; + } + catch (...) + { + std::cerr << "protocol_module_ip::handle_session_initialize() : Unknown exception." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_session_initialize() : Unknown exception. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(600030, formatter.str(), __FILE__, __LINE__); + status = FINALIZE; + } + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_session_initialize(const boost::thread::id up_thread_id, " + "const boost::thread::id down_thread_id, " + "const boost::asio::ip::tcp::endpoint& client_endpoint_tcp, " + "const boost::asio::ip::udp::endpoint& client_endpoint_udp) : return_value = %d. " + "thread id : %d."); + formatter % status % boost::this_thread::get_id(); + putLogDebug(600039, formatter.str(), __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + + return status; + } + //! called from session finalize use in upstream thread. + //! @param[in] upstream thread id. + //! @param[in] downstream thread id + //! @return session use EVENT mode. + protocol_module_base::EVENT_TAG protocol_module_ip::handle_session_finalize( + const boost::thread::id up_thread_id, const boost::thread::id down_thread_id) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("in_function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_session_finalize(const boost::thread::id up_thread_id, " + "const boost::thread::id down_thread_id) : " + "up_thread_id = %d, down_thread_id = %d."); + formatter % up_thread_id % down_thread_id; + putLogDebug(600040, formatter.str(), __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + EVENT_TAG status = STOP; + thread_data_ptr p_up; + thread_data_ptr p_down; + session_thread_data_map_it session_thread_data_it; + + //session thread free + try + { + boost::mutex::scoped_lock slock(session_thread_data_map_mutex); + + session_thread_data_it = session_thread_data_map.find(up_thread_id); + if (session_thread_data_it != session_thread_data_map.end()) + { + p_up = session_thread_data_it->second; + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("delete : address = &(%d)."); + formatter % static_cast(p_up->data_buffer); + putLogDebug(600041, formatter.str(), __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + + delete p_up->data_buffer; + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("delete : address = &(%d)."); + formatter % static_cast(p_up.get()); + putLogDebug(600042, formatter.str(), __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + + session_thread_data_map.erase(up_thread_id); + } + + session_thread_data_it = session_thread_data_map.find(down_thread_id); + if (session_thread_data_it != session_thread_data_map.end()) + { + + p_down = session_thread_data_it->second; + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("delete : address = &(%d)."); + formatter % static_cast(p_up->data_buffer); + putLogDebug(600043, formatter.str(), __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + + delete p_down->data_buffer; + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("delete : address = &(%d)."); + formatter % static_cast(p_down.get()); + putLogDebug(600044, formatter.str(), __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + + session_thread_data_map.erase(down_thread_id); + } + + //set return status + status = STOP; + } + catch (const std::exception& ex) + { + std::cerr << "protocol_module_ip::handle_session_finalize() : exception : error = " << ex.what() << "." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_session_finalize() : exception : error = %s. thread id : %d."); + formatter % ex.what() % boost::this_thread::get_id(); + putLogError(600031, formatter.str(), __FILE__, __LINE__ ); + status = STOP; + } + catch (...) + { + std::cerr << "protocol_module_ip::handle_session_finalize() : Unknown exception." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_session_finalize() : " + "Unknown exception. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(600032, formatter.str(), __FILE__, __LINE__ ); + status = STOP; + } + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_session_finalize(const boost::thread::id up_thread_id, " + "const boost::thread::id down_thread_id) : return_value = %d. thread id : %d."); + formatter % status % boost::this_thread::get_id(); + putLogDebug(600045, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + return status; + } + + //! called from after session accept.in client socket use in upstream thread. + //! @param[in] upstream thread id. + //! @return session use EVENT mode. + protocol_module_base::EVENT_TAG protocol_module_ip::handle_accept(const boost::thread::id thread_id) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("in_function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_accept(const boost::thread::id thread_id) : thread_id = %d."); + formatter % thread_id; + putLogDebug(600046, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + EVENT_TAG status = FINALIZE; + thread_data_ptr session_data_ptr; + session_thread_data_map_it session_thread_it; + + try + { + { + boost::mutex::scoped_lock slock(session_thread_data_map_mutex); + + session_thread_it = session_thread_data_map.find(thread_id); + if (unlikely(session_thread_it == session_thread_data_map.end() || session_thread_it->second == NULL)) + { + boost::format formatter("Invalid thread id. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(600033, formatter.str(), __FILE__, __LINE__ ); + throw -1; + } + + session_data_ptr = session_thread_it->second; + } + + //set accept end flag ON + session_data_ptr->accept_end_flag = ACCEPT_END_FLAG_ON; + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_accept(const boost::thread::id thread_id) : ACCEPT_END_FLAG_ON. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogDebug(600047, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + //sorry flag on + if (session_data_ptr->sorry_flag == SORRY_FLAG_ON) + { + //set return status + status = SORRYSERVER_SELECT; + } + //sorry flag off + else + { + //set return status + status = REALSERVER_SELECT; + } + + //set last status + session_data_ptr->last_status = status; + } + catch (int e) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_accept() : catch exception e = %d. thread id : %d."); + formatter % e % boost::this_thread::get_id(); + putLogDebug(600048, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + status = FINALIZE; + } + catch (const std::exception& ex) + { + std::cerr << "protocol_module_ip::handle_accept() : exception : error = " << ex.what() << "." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_accept() : exception : error = %s. thread id : %d."); + formatter % ex.what() % boost::this_thread::get_id(); + putLogError(600034, formatter.str(), __FILE__, __LINE__ ); + status = FINALIZE; + } + catch (...) + { + std::cerr << "protocol_module_ip::handle_accept() : Unknown exception." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG " + "protocol_module_ip::handle_accept() : " + "Unknown exception. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(600035, formatter.str(), __FILE__, __LINE__ ); + status = FINALIZE; + } + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_accept(const boost::thread::id thread_id) : return_value = %d. thread id : %d."); + formatter % status % boost::this_thread::get_id(); + putLogDebug(600049, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + return status; + } + + //! called from after session recv in client socket. use in upstream thread. + //! @param[in] upstream thread id + //! @param[in] recive buffer refarence. + //! @param[in] recive length + //! @return session use EVENT mode. + protocol_module_base::EVENT_TAG protocol_module_ip::handle_client_recv(const boost::thread::id thread_id, + const boost::array& recvbuffer, const size_t recvlen) + { + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + size_t buffer_size = recvbuffer.size() < recvlen ? recvbuffer.size() : recvlen; + std::string buffer; + dump_memory(recvbuffer.data(), buffer_size, buffer); + boost::format formatter("in_function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_client_recv(const boost::thread::id thread_id, " + "const boost::array& recvbuffer, " + "const size_t recvlen) : thread_id = %d, recvbuffer = %s, recvlen = %d."); + formatter % thread_id % buffer % recvlen; + putLogDebug(600050, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + EVENT_TAG status = FINALIZE; + bool find_ret = false; + size_t http_header_offset = 0; + size_t http_header_len = 0; + size_t http_header_content_length_offset = 0; + size_t http_header_content_length_len = 0; + int content_length_value = 0; + const size_t CR_LF_LEN = 2; //length of "\r\n" + const size_t CR_LF_CR_LF_LEN = 4; //length of "\r\n\r\n" + session_thread_data_map_it session_thread_it; + thread_data_ptr session_data_ptr; + http_utility::CHECK_RESULT_TAG check_ret; + + std::string content_length; + cmatch regex_ret; + cregex content_length_regex = icase("Content-Length") >> ":" >> *~_d >> (s1 = +_d) >> *~_d; + + //parameter check + if (unlikely(recvlen > recvbuffer.size())) + { + std::cerr << "protocol_module_ip::handle_client_recv() : Data size bigger than buffer size." << std::endl; + boost::format formatter("Data size bigger than buffer size. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(600036, formatter.str(), __FILE__, __LINE__ ); + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_client_recv(const boost::thread::id thread_id, " + "const boost::array& recvbuffer, " + "const size_t recvlen) : return_value = %d. thread id : %d."); + formatter % FINALIZE % boost::this_thread::get_id(); + putLogDebug(600051, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + return status; + } + + try + { + { + boost::mutex::scoped_lock slock(session_thread_data_map_mutex); + + session_thread_it = session_thread_data_map.find(thread_id); + if (unlikely(session_thread_it == session_thread_data_map.end() || session_thread_it->second == NULL)) + { + + boost::format formatter("Invalid thread id. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(600037, formatter.str(), __FILE__, __LINE__ ); + throw -1; + } + + session_data_ptr = session_thread_it->second; + } + + //end flag on + if (session_data_ptr->end_flag == END_FLAG_ON) + { + //set return status + status = CLIENT_RECV; + } + //end flag off + else + { + //copy data from recvbuffer + if (!get_data_from_recvbuffer(session_data_ptr, recvbuffer, recvlen)) + { + //copy failed + std::cerr << "protocol_module_ip::handle_client_recv() : Data size bigger than buffer size." << std::endl; + boost::format formatter("Data size bigger than buffer size. thread id : % id."); + formatter % boost::this_thread::get_id(); + putLogError(600038, formatter.str(), __FILE__, __LINE__); + status = FINALIZE; + } + else + { + //data state is HTTP_START + if (session_data_ptr->data_state == HTTP_START) + { + //search http header + find_ret = http_utility::find_http_header_all(session_data_ptr->data_buffer + session_data_ptr->data_offset, + session_data_ptr->data_length, + http_header_offset, + http_header_len + ); + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_client_recv() : call find_http_header_all : " + "return_value = %d. thread id : %d."); + formatter % static_cast(find_ret) % boost::this_thread::get_id(); + putLogDebug(600052, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + //search http header result is NG + if (!find_ret) + { + //data size bigger than max buffer size + if (session_data_ptr->data_length >= MAX_IP_MODULE_BUFFER_SIZE - recvbuffer.size()) + { + //set data state UNKNOWN + session_data_ptr->data_state = UNKNOWN; + //set current message rest size + session_data_ptr->current_message_rest_size = session_data_ptr->data_length; + } + } + //search http header result is OK + else + { + //check http method and version + check_ret = http_utility::check_http_method_and_version(session_data_ptr->data_buffer, + session_data_ptr->data_length); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_client_recv() : call check_http_method_and_version : " + "return_value = %d. thread id : %d."); + formatter % check_ret % boost::this_thread::get_id(); + putLogDebug(600053, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + //check http method and version result is NG + if (check_ret == http_utility::CHECK_NG) + { + //set data state UNKNOWN + session_data_ptr->data_state = UNKNOWN; + //set current message rest size + session_data_ptr->current_message_rest_size = session_data_ptr->data_length; + } + //check http method and version result is OK + else + { + //search Content_Length header + find_ret = http_utility::find_http_header_content_length(session_data_ptr->data_buffer+session_data_ptr->data_offset, + session_data_ptr->data_length, + http_header_content_length_offset, + http_header_content_length_len); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_client_recv() : call find_http_header_content_length : " + "return_value = %d. thread id : %d."); + formatter % static_cast(find_ret) % boost::this_thread::get_id(); + putLogDebug(600054, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + //search Content_Length result is OK + if (find_ret) + { + //set content length string + content_length.assign(session_data_ptr->data_buffer+session_data_ptr->data_offset + http_header_content_length_offset, + http_header_content_length_len ); + find_ret = regex_search(content_length.c_str(), regex_ret, content_length_regex); + + //"content-length: ddd\r\n" + if ( find_ret) + { + content_length = content_length.substr( + regex_ret.position(1), + regex_ret.length(1)); + + //set content length value + content_length_value = boost::lexical_cast(content_length); + } + + //http_header context is "\r\n\r\n" only + if (http_header_len == 0) + { + //set current message rest size + session_data_ptr->current_message_rest_size = http_header_offset + http_header_len + content_length_value + CR_LF_LEN; + } + else + { + //set current message rest size + session_data_ptr->current_message_rest_size = http_header_offset + http_header_len + content_length_value + CR_LF_CR_LF_LEN; + } + } + //search Content_Length result is NG + else + { + //http_header context is "\r\n\r\n" only + if (http_header_len == 0) + { + //set current message rest size + session_data_ptr->current_message_rest_size = http_header_offset + http_header_len + CR_LF_LEN; + } + else + { + //set current message rest size + session_data_ptr->current_message_rest_size = http_header_offset + http_header_len + CR_LF_CR_LF_LEN; + } + + } + + //set data state HTTP_HEADER + session_data_ptr->data_state = HTTP_HEADER; + + } + } + } + //data state is UNKNOWN + else if (session_data_ptr->data_state == UNKNOWN) + { + //set current message rest size + session_data_ptr->current_message_rest_size = session_data_ptr->data_length; + } + else + { + //none + } + + //data state is HTTP_START + if (session_data_ptr->data_state == HTTP_START ) + { + status = CLIENT_RECV; + } + //data state is not HTTP_START + else + { + //sorry flag is on + if (session_data_ptr->sorry_flag == SORRY_FLAG_ON) + { + //set return status + status = SORRYSERVER_CONNECT; + } + //sorry flag is off + else + { + //set return status + status = REALSERVER_CONNECT; + } + } + } + } + + //set last status + session_data_ptr->last_status = status; + } + catch (int e) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_client_recv() : catch exception e = %d. thread id : %d."); + formatter % e % boost::this_thread::get_id(); + putLogDebug(600055, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + status = FINALIZE; + } + catch (const boost::bad_lexical_cast& ) + { + std::cerr << "protocol_module_ip::handle_client_recv() : exception : " << "Content_Length field's value is invalid." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::handle_client_recv() : " + "Content_Length field's value is invalid. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(600039, formatter.str(), __FILE__, __LINE__ ); + status = FINALIZE; + } + catch (const std::exception& ex) + { + std::cerr << "protocol_module_ip::handle_client_recv() : exception : error = " << ex.what() << "." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_client_recv() : exception : error = %s. thread id : %d."); + formatter % ex.what() % boost::this_thread::get_id(); + putLogError(600040, formatter.str(), __FILE__, __LINE__ ); + status = FINALIZE; + } + catch (...) + { + std::cerr << "protocol_module_ip::handle_client_recv() : Unknown exception." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG " + "protocol_module_ip::handle_client_recv() : " + "Unknown exception. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(600041, formatter.str(), __FILE__, __LINE__ ); + status = FINALIZE; + } + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_client_recv(const boost::thread::id thread_id, " + "const boost::array& recvbuffer, " + "const size_t recvlen) : return_value = %d. thread id : %d."); + formatter % status % boost::this_thread::get_id(); + putLogDebug(600056, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + return status; + } + + //! called from after realserver select.use in upstream thread. + //! @param[in] upstream thread id + //! @param[out] realserver TCP endpoint + //! @return session use EVENT mode. + protocol_module_base::EVENT_TAG protocol_module_ip::handle_realserver_select( + const boost::thread::id thread_id, boost::asio::ip::tcp::endpoint & rs_endpoint) + { + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("in_function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_realserver_select(const boost::thread::id thread_id, " + "boost::asio::ip::tcp::endpoint & rs_endpoint) : " + "thread_id = %d, rs_endpoint = [%s]:%d."); + formatter % thread_id % rs_endpoint.address().to_string() % rs_endpoint.port(); + putLogDebug(600057, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + EVENT_TAG status = FINALIZE; + boost::asio::ip::tcp::endpoint init_endpoint; + thread_data_ptr session_data_ptr; + session_thread_data_map_it session_thread_it; + session_thread_data_map_it session_thread_it_end; + realserverlist_type::iterator rs_list_itr; + + if (unlikely(schedule_tcp.empty())) + { + std::cerr << "protocol_module_ip::handle_realserver_select() : Schedule_tcp function is empty." << std::endl; + boost::format formatter("Schedule_tcp function is empty. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(600042, formatter.str(), __FILE__, __LINE__ ); + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_realserver_select(const boost::thread::id thread_id, " + "boost::asio::ip::tcp::endpoint & rs_endpoint)" + " : return_value = %d. thread id : %d."); + formatter % FINALIZE % boost::this_thread::get_id(); + putLogDebug(600058, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + return FINALIZE; + } + + + try + { + { + boost::mutex::scoped_lock slock(session_thread_data_map_mutex); + + session_thread_it = session_thread_data_map.find(thread_id); + if (unlikely(session_thread_it == session_thread_data_map.end() || session_thread_it->second == NULL)) + { + boost::format formatter("Invalid thread id. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(600043, formatter.str(), __FILE__, __LINE__ ); + throw -1; + } + + session_data_ptr = session_thread_it->second; + } + + //initialize realserver endpoint + rs_endpoint = init_endpoint; + + boost::mutex::scoped_lock lock(session_data_mutex); + //the first connection or connected successful + if (session_data_ptr->realserver_connect_failed_count <= 0) + { + //get endpoint data from the ip data + int ret = ip_data_processor->get_endpoint_from_session_data(session_data_ptr->ip_hash, + rs_endpoint); + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG " + "protocol_module_ip::handle_realserver_select() : " + "get_endpoint_from_session_data() end. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogDebug(600059, formatter.str(), __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + + //endpoint is matched + if (ret == 0) + { + //find the rs_endpoint in rs_list + rs_list_lock(); + + rs_list_itr = rs_list_begin(); + int is_match = 0; + + while ( rs_list_itr != rs_list_end()) + { + + if ( rs_list_itr->tcp_endpoint == rs_endpoint ) + { + is_match = 1; + break; + } + + rs_list_itr = rs_list_next( rs_list_itr ); + } + + rs_list_unlock(); + + //endpoint is matched in the list + if (is_match) + { + //data state is HTTP_START + if (session_data_ptr->data_state == HTTP_START) + { + //set return status + status = CLIENT_RECV; + } + //data state is not HTTP_START + else + { + //set return status + status = REALSERVER_CONNECT; + } + } + //endpoint is not matched in the list + else + { + //if reschedule is on then try multi times connect + if (reschedule == 1) + { + // init rs_endpoint + rs_endpoint = init_endpoint; + + schedule_tcp(thread_id, rs_list_begin, rs_list_end, rs_list_next, rs_endpoint); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_realserver_select() : call schedule_tcp : " + "rs_endpoint = [%s]:%d. thread id : %d."); + formatter % rs_endpoint.address().to_string() % rs_endpoint.port() % boost::this_thread::get_id(); + putLogDebug(600060, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + //get the endpoint by schedule successfully + if (init_endpoint != rs_endpoint) + { + time_t init_time = 0; + + //write data to session table + ip_data_processor->write_session_data(session_data_ptr->ip_hash, rs_endpoint, init_time); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG " + "protocol_module_ip::handle_realserver_select() : " + "write_session_data() end. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogDebug(600061, formatter.str(), __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + + //data state is HTTP_START + if (session_data_ptr->data_state == HTTP_START) + { + //set return status + status = CLIENT_RECV; + } + //data state is not HTTP_START + else + { + //set return status + status = REALSERVER_CONNECT; + } + } + //get the endpoint by schedule unsuccessfully + else + { + //set return status + status = CLIENT_DISCONNECT; + } + } + //reschedule is off + else + { + //set return status + status = CLIENT_DISCONNECT; + } + } + } + //endpoint is not matched + else + { + // init rs_endpoint + rs_endpoint = init_endpoint; + + //call schedule_module's schedule function, get realserver endpoint + schedule_tcp(thread_id, rs_list_begin, rs_list_end, rs_list_next, rs_endpoint); + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_realserver_select() : call schedule_tcp : " + "rs_endpoint = [%s]:%d. thread id : %d."); + formatter % rs_endpoint.address().to_string() % rs_endpoint.port() % boost::this_thread::get_id(); + putLogDebug(600062, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + //get the endpoint by schedule successfully + if (init_endpoint != rs_endpoint) + { + time_t init_time = 0; + + //write data to session table + ip_data_processor->write_session_data(session_data_ptr->ip_hash, rs_endpoint, init_time); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG " + "protocol_module_ip::handle_realserver_select() : " + "write_session_data() end. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogDebug(600063, formatter.str(), __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + + //data state is HTTP_START + if (session_data_ptr->data_state == HTTP_START) + { + //set return status + status = CLIENT_RECV; + } + //data state is not HTTP_START + else + { + //set return status + status = REALSERVER_CONNECT; + } + } + //get the endpoint by schedule unsuccessfully + else + { + //set return status + status = CLIENT_DISCONNECT; + } + } + } + //realserver connect failed count is less than the max failed count + else if (session_data_ptr->realserver_connect_failed_count < this->realserver_connect_failed_max_count) + { + //if reschedule is on then try multi times connect + if (reschedule == 1) + { + // init rs_endpoint + rs_endpoint = init_endpoint; + + //call schedule_module's schedule function, get realserver endpoint + schedule_tcp(thread_id, rs_list_begin, rs_list_end, rs_list_next, rs_endpoint); + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_realserver_select() : call schedule_tcp : " + "rs_endpoint = [%s]:%d. thread id : %d."); + formatter % rs_endpoint.address().to_string() % rs_endpoint.port() % boost::this_thread::get_id(); + putLogDebug(600064, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + //get the endpoint by schedule successfully + if (init_endpoint != rs_endpoint) + { + time_t init_time = 0; + + //write data to session table + ip_data_processor->write_session_data(session_data_ptr->ip_hash, rs_endpoint, init_time); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG " + "protocol_module_ip::handle_realserver_select() : " + "write_session_data() end. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogDebug(600065, formatter.str(), __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + + //data state is HTTP_START + if (session_data_ptr->data_state == HTTP_START) + { + //set return status + status = CLIENT_RECV; + } + //data state is not HTTP_START + else + { + //set return status + status = REALSERVER_CONNECT; + } + } + //get the endpoint by schedule successfully + else + { + //set return status + status = CLIENT_DISCONNECT; + } + } + //reschedule is off + else + { + //set return status + status = CLIENT_DISCONNECT; + } + } + //realserver connect failed count is more than 3 + else + { + //set return status + status = CLIENT_DISCONNECT; + } + + //set last status + session_data_ptr->last_status = status; + } + catch (int e) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_realserver_select() : catch exception e = %d. thread id : %d."); + formatter % e % boost::this_thread::get_id(); + putLogDebug(600066, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + status = FINALIZE; + } + catch (const std::exception& ex) + { + std::cerr << "protocol_module_ip::handle_realserver_select() : exception : error = " << ex.what() << "." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_realserver_select() : exception : error = %s. thread id : %d."); + formatter % ex.what() % boost::this_thread::get_id(); + putLogError(600044, formatter.str(), __FILE__, __LINE__ ); + status = FINALIZE; + } + catch (...) + { + std::cerr << "protocol_module_ip::handle_realserver_select() : Unknown exception." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG " + "protocol_module_ip::handle_realserver_select() : " + "Unknown exception. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(600045, formatter.str(), __FILE__, __LINE__ ); + status = FINALIZE; + } + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_realserver_select(const boost::thread::id thread_id, " + "boost::asio::ip::tcp::endpoint & rs_endpoint)" + " : return_value = %d. thread id : %d."); + formatter % status % boost::this_thread::get_id(); + putLogDebug(600067, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + return status; + } + + //! called from after realserver select + //! @param[in] upstream thread id + //! @param[out] realserver UDP endpoint + //! @param[out] sendbuffer reference + //! @param[out] send data length + //! @return session use EVENT mode. + protocol_module_base::EVENT_TAG protocol_module_ip::handle_realserver_select( + const boost::thread::id thread_id, boost::asio::ip::udp::endpoint& rs_endpoint, boost::array& sendbuffer, size_t& datalen) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("in/out_function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_realserver_select(const boost::thread::id thread_id, " + "boost::asio::ip::udp::endpoint& rs_endpoint, boost::array& sendbuffer, " + "size_t& datalen) : " + "return_value = %d. thread id : %d."); + formatter % STOP % boost::this_thread::get_id(); + putLogDebug(600068, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + return STOP; + } + //! called from after realserver connect + //! @param[in] upstream thread id + //! @param[out] sendbuffer reference + //! @param[out] send data length + //! @return session use EVENT mode. + protocol_module_base::EVENT_TAG protocol_module_ip::handle_realserver_connect( + const boost::thread::id thread_id, boost::array& sendbuffer, size_t& datalen) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("in_function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_realserver_connect(const boost::thread::id thread_id, " + "boost::array& sendbuffer, size_t& datalen) : " + "thread_id = %d."); + formatter % thread_id; + putLogDebug(600069, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + EVENT_TAG status = FINALIZE; + size_t send_possible_size = 0; + size_t x_forwarded_for_insert_pos = 0; + thread_data_ptr session_data_ptr; + session_thread_data_map_it session_thread_it; + std::pair buffer_element; + std::string x_forwarded_for_context; + + try + { + { + boost::mutex::scoped_lock slock(session_thread_data_map_mutex); + + //thread id check + session_thread_it = session_thread_data_map.find(thread_id); + if (unlikely(session_thread_it == session_thread_data_map.end() || session_thread_it->second == NULL)) + { + boost::format formatter("Invalid thread id. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(600046, formatter.str(), __FILE__, __LINE__ ); + throw -1; + } + + session_data_ptr = session_thread_it->second; + } + + send_possible_size = std::min(session_data_ptr->current_message_rest_size, + session_data_ptr->data_length + ); + + //buffer sequence is empty + if (session_data_ptr->buffer_sequence.empty()) + { + //data state is HTTP_HEADER + if (session_data_ptr->data_state == HTTP_HEADER) + { + //forwarded_for flag is on + if (forwarded_for == FORWARDED_FOR_ON) + { + //search X-Forwarded-For header + create_x_forwarded_for(session_data_ptr->client_endpoint.address().to_string(), + session_data_ptr->data_buffer + session_data_ptr->data_offset, + session_data_ptr->data_length, + x_forwarded_for_insert_pos, + x_forwarded_for_context); + + //put buffer data to buffer_sequence + buffer_element.first = session_data_ptr->data_buffer + session_data_ptr->data_offset; + buffer_element.second = x_forwarded_for_insert_pos; + session_data_ptr->buffer_sequence.push_back(buffer_element); + + session_data_ptr->forwarded_for_buffer.assign(0); + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + dump_memory(x_forwarded_for_context.c_str(), + x_forwarded_for_context.size(), datadump); + boost::format formatter( + "function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_realserver_connect() : before memcpy (data dump) : " + "data begin = 0, data_size = %d, data = %s"); + formatter % x_forwarded_for_context.size() % datadump; + putLogDebug(600070, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + memcpy(session_data_ptr->forwarded_for_buffer.data(), + x_forwarded_for_context.c_str(), + x_forwarded_for_context.size()); + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + dump_memory(x_forwarded_for_context.c_str(), + x_forwarded_for_context.size(), datadump); + boost::format formatter( + "function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_realserver_connect() : after memcpy (data dump) : " + "data begin = 0, data_size = %d, data = %s"); + formatter % x_forwarded_for_context.size() % datadump; + putLogDebug(600071, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + //set buffer's position + buffer_element.first = session_data_ptr->forwarded_for_buffer.data(); + buffer_element.second = x_forwarded_for_context.size(); + + //set data to buffer_sequence + session_data_ptr->buffer_sequence.push_back(buffer_element); + + //set buffer's position + buffer_element.first = session_data_ptr->data_buffer + session_data_ptr->data_offset + x_forwarded_for_insert_pos; + buffer_element.second = send_possible_size - x_forwarded_for_insert_pos; + + //set data to buffer_sequence + session_data_ptr->buffer_sequence.push_back(buffer_element); + } + //forwarded_for flag is off + else + { + //set buffer's position + buffer_element.first = session_data_ptr->data_buffer + session_data_ptr->data_offset; + buffer_element.second = send_possible_size; + + //set data to buffer_sequence + session_data_ptr->buffer_sequence.push_back(buffer_element); + } + session_data_ptr->data_state = HTTP_BODY; + } + //data state is not HTTP_HEADER + else + { + + buffer_element.first = session_data_ptr->data_buffer + session_data_ptr->data_offset; + buffer_element.second = send_possible_size; + + //set data to buffer_sequence + session_data_ptr->buffer_sequence.push_back(buffer_element); + + } + } + + //put buffer_sequence data into sendbuffer + put_data_into_sendbuffer(session_data_ptr, sendbuffer, datalen); + + session_data_ptr->realserver_connect_failed_count = 0; + //set return status + status = REALSERVER_SEND; + + //set last status + session_data_ptr->last_status = status; + } + catch (int e) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_realserver_connect() : catch exception e = %d. thread id : %d."); + formatter % e % boost::this_thread::get_id(); + putLogDebug(600072, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + //set return status + status = FINALIZE; + } + catch (std::exception& ex) + { + std::cerr << "protocol_module_ip::handle_realserver_connect() : exception : error = " << ex.what() << "." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_realserver_connect() : exception : error = %s. thread id : %d."); + formatter % ex.what() % boost::this_thread::get_id(); + putLogError(600047, formatter.str(), __FILE__, __LINE__ ); + + //set return status + status = FINALIZE; + } + catch (...) + { + std::cerr << "protocol_module_ip::handle_realserver_connect() : Unknown exception." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_realserver_connect() : Unknown exception. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(600048, formatter.str(), __FILE__, __LINE__ ); + + //set return status + status = FINALIZE; + } + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_realserver_connect(const boost::thread::id thread_id, " + "boost::array& sendbuffer, " + "size_t& datalen) : return_value = %d. thread id : %d."); + formatter % status % boost::this_thread::get_id(); + putLogDebug(600073, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + return status; + } + + //! called from after realserver connection fail + //! @param[in] upstream thread id + //! @param[in] fail realserver endpoint reference + //! @return session use EVENT mode. + protocol_module_base::EVENT_TAG protocol_module_ip::handle_realserver_connection_fail( + const boost::thread::id thread_id, const boost::asio::ip::tcp::endpoint & rs_endpoint) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("in_function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_realserver_connection_fail(const boost::thread::id thread_id, " + "const boost::asio::ip::tcp::endpoint & rs_endpoint) : " + "thread_id = %d, rs_endpoint = [%s]:%d."); + formatter % thread_id % rs_endpoint.address().to_string() % rs_endpoint.port(); + putLogDebug(600074, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + EVENT_TAG status = FINALIZE; + thread_data_ptr session_data_ptr; + session_thread_data_map_it session_thread_it; + + try + { + boost::mutex::scoped_lock slock(session_thread_data_map_mutex); + + session_thread_it = session_thread_data_map.find(thread_id); + if (unlikely(session_thread_it == session_thread_data_map.end() || session_thread_it->second == NULL)) + { + boost::format formatter("Invalid thread id. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(600049, formatter.str(), __FILE__, __LINE__ ); + throw -1; + } + + session_data_ptr = session_thread_it->second; + + if (reschedule == 1) + { + session_data_ptr->realserver_connect_failed_count++; + + //set return status + status = REALSERVER_SELECT; + } + else + { + //set end flag on + session_data_ptr->end_flag = END_FLAG_ON; + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_realserver_connection_fail(const boost::thread::id thread_id, " + "const boost::asio::ip::tcp::endpoint & rs_endpoint) : END_FLAG_ON. " + "thread_id = %d, rs_endpoint = [%s]:%d."); + formatter % thread_id % rs_endpoint.address().to_string() % rs_endpoint.port(); + putLogDebug(600075, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + //set return status + status = CLIENT_DISCONNECT; + } + + + //set last status + session_data_ptr->last_status = status; + } + catch (int e) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_realserver_connection_fail() : catch exception e = %d. thread id : %d."); + formatter % e % boost::this_thread::get_id(); + putLogDebug(600076, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + //set return status + status = FINALIZE; + } + catch (const std::exception& ex) + { + std::cerr << "protocol_module_ip::handle_realserver_connection_fail() : exception : error = " << ex.what() << "." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_realserver_connection_fail() : exception : error = %s. thread id : %d."); + formatter % ex.what() % boost::this_thread::get_id(); + putLogError(600050, formatter.str(), __FILE__, __LINE__ ); + + //set return status + status = FINALIZE; + } + catch (...) + { + std::cerr << "protocol_module_ip::handle_realserver_connection_fail() : Unknown exception." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG " + "protocol_module_ip::handle_realserver_connection_fail() : " + "Unknown exception. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(600051, formatter.str(), __FILE__, __LINE__ ); + + //set return status + status = FINALIZE; + } + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_realserver_connection_fail(const boost::thread::id thread_id, " + "const boost::asio::ip::tcp::endpoint & rs_endpoint) : return_value = %d. thread id : %d."); + formatter % status % boost::this_thread::get_id(); + putLogDebug(600077, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + return status; + } + //! called from after realserver send. + //! @param[in] upstream thread id + //! @return session use EVENT mode. + protocol_module_base::EVENT_TAG protocol_module_ip::handle_realserver_send( + const boost::thread::id thread_id) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("in_function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_realserver_send(const boost::thread::id thread_id) : thread_id = %d."); + formatter % thread_id; + putLogDebug(600078, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + EVENT_TAG status = FINALIZE; + size_t http_header_all_offset = 0; + size_t http_header_all_len = 0; + size_t http_header_content_length_offset = 0; + size_t http_header_content_length_len = 0; + const size_t CR_LF_LEN = 2; + const size_t CR_LF_CR_LF_LEN = 4; + int content_length_value = 0; + + std::string content_length; + cmatch regex_ret; + cregex content_length_regex = icase("Content-Length") >> ":" >> *~_d >> (s1 = +_d) >> *~_d; + + + bool find_ret = false; + http_utility::CHECK_RESULT_TAG check_ret; + + thread_data_ptr session_data_ptr; + session_thread_data_map_it session_thread_it; + + try + { + { + boost::mutex::scoped_lock slock(session_thread_data_map_mutex); + + //thread id check + session_thread_it = session_thread_data_map.find(thread_id); + if (unlikely(session_thread_it == session_thread_data_map.end() || session_thread_it->second == NULL)) + { + boost::format formatter("Invalid thread id. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(600052, formatter.str(), __FILE__, __LINE__ ); + throw -1; + } + + session_data_ptr = session_thread_it->second; + } + + //current_message_rest_size > 0 + if (session_data_ptr->current_message_rest_size > 0) + { + //data size > 0 + if (session_data_ptr->data_length > 0) + { + //set return status + status = REALSERVER_CONNECT; + } + //data size is 0 + else + { + //data offset is 0 + session_data_ptr->data_offset = 0; + + //set return status + status = CLIENT_RECV; + } + } + //current_message_rest_size is 0 + else + { + //data size > 0 + if (session_data_ptr->data_length > 0) + { + //data state is HTTP_BODY + if (session_data_ptr->data_state == HTTP_BODY) + { + //search whole http header, get whole http header's offset and length + find_ret = http_utility::find_http_header_all(session_data_ptr->data_buffer + session_data_ptr->data_offset, + session_data_ptr->data_length, + http_header_all_offset, + http_header_all_len + ); + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_realserver_send() : call find_http_header_all : " + "return_value = %d. thread id : %d."); + formatter % static_cast(find_ret) % boost::this_thread::get_id(); + putLogDebug(600079, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + //search http header result is NG + if (!find_ret) + { + //set data state HTTP_START + session_data_ptr->data_state = HTTP_START; + + //set return status + status = CLIENT_RECV; + } + //search http header result is OK + else + { + //check http method and version + check_ret = http_utility::check_http_method_and_version(session_data_ptr->data_buffer + session_data_ptr->data_offset, + session_data_ptr->data_length); + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_realserver_send() : call check_http_method_and_version : " + "return_value = %d. thread id : %d."); + formatter % check_ret % boost::this_thread::get_id(); + putLogDebug(600080, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + //check method and version result is NG + if (check_ret == http_utility::CHECK_NG) + { + //set current message rest size + session_data_ptr->current_message_rest_size = session_data_ptr->data_length; + + //set data state UNKNOWN + session_data_ptr->data_state = UNKNOWN; + } + //check method and version result is OK + else + { + //search Content_Length header + find_ret = http_utility::find_http_header_content_length(session_data_ptr->data_buffer+session_data_ptr->data_offset, + session_data_ptr->data_length, + http_header_content_length_offset, + http_header_content_length_len); + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_realserver_send() : call find_http_header_content_length : " + "return_value = %d. thread id : %d."); + formatter % static_cast(find_ret) % boost::this_thread::get_id(); + putLogDebug(600081, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + //search Content_Length result is OK + if (find_ret) + { + content_length.assign(session_data_ptr->data_buffer+session_data_ptr->data_offset + http_header_content_length_offset, + http_header_content_length_len ); + find_ret = regex_search(content_length.c_str(), regex_ret, content_length_regex); + + //"content-length: ddd\r\n" + if ( find_ret) + { + content_length = content_length.substr( + regex_ret.position(1), + regex_ret.length(1)); + + //set content length value + content_length_value = boost::lexical_cast(content_length); + } + + //http_header context is "\r\n\r\n" only + if (http_header_all_len == 0) + { + //set current message rest size + session_data_ptr->current_message_rest_size = http_header_all_offset + http_header_all_len + content_length_value + CR_LF_LEN; + } + else + { + //set current message rest size + session_data_ptr->current_message_rest_size = http_header_all_offset + http_header_all_len + content_length_value + CR_LF_CR_LF_LEN; + } + } + //search Content_Length result is OK + else + { + //http_header context is "\r\n\r\n" only + if (http_header_all_len == 0) + { + //set current message rest size + session_data_ptr->current_message_rest_size = http_header_all_offset + http_header_all_len + CR_LF_LEN; + } + else + { + //set current message rest size + session_data_ptr->current_message_rest_size = http_header_all_offset + http_header_all_len + CR_LF_CR_LF_LEN; + } + + } + + //set data state HTTP_HEADER + session_data_ptr->data_state = HTTP_HEADER; + } + + //set return status + status = REALSERVER_CONNECT; + } + } + //data state is UNKNOWN + else if (session_data_ptr->data_state == UNKNOWN) + { + //set return status + status = REALSERVER_CONNECT; + } + + } + //data size is 0 + else + { + //data state is HTTP_BODY + if (session_data_ptr->data_state == HTTP_BODY) + { + //set data state HTTP_START + session_data_ptr->data_state = HTTP_START; + } + + //set data offset 0 + session_data_ptr->data_offset = 0; + + //set return status + status = CLIENT_RECV; + } + } + //set last status + session_data_ptr->last_status = status; + } + catch (int e) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_realserver_send() : catch exception e = %d. thread id : %d."); + formatter % e % boost::this_thread::get_id(); + putLogDebug(600082, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + //set return status + status = FINALIZE; + } + catch (const boost::bad_lexical_cast& ) + { + std::cerr << "protocol_module_ip::handle_realserver_send() : exception : " << "Content_Length field's value is invalid." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::handle_realserver_send() : " + "Content_Length field's value is invalid. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(600053, formatter.str(), __FILE__, __LINE__ ); + + //set return status + status = FINALIZE; + } + catch (const std::exception& ex) + { + std::cerr << "protocol_module_ip::handle_realserver_send() : exception : error = " << ex.what() << "." << std::endl; //set data state HTTP_HEADER + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_realserver_send() : exception : error = %s. thread id : %d."); + formatter % ex.what() % boost::this_thread::get_id(); + putLogError(600054, formatter.str(), __FILE__, __LINE__ ); + + //set return status + status = FINALIZE; + } + catch (...) + { + std::cerr << "protocol_module_ip::handle_realserver_send() : Unknown exception." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG " + "protocol_module_ip::handle_realserver_send() : " + "Unknown exception. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(600055, formatter.str(), __FILE__, __LINE__ ); + + //set return status + status = FINALIZE; + } + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_realserver_send(const boost::thread::id thread_id) : return_value = %d. thread id : %d."); + formatter % status % boost::this_thread::get_id(); + putLogDebug(600083, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + return status; + } + + //! called from after sorryserver select + //! @param[in] upstream thread id + //! @param[in] sorryserver endpiont reference + //! @return session use EVENT mode. + protocol_module_base::EVENT_TAG protocol_module_ip::handle_sorryserver_select( + const boost::thread::id thread_id, boost::asio::ip::tcp::endpoint& sorry_endpoint) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("in_function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_sorryserver_select(const boost::thread::id thread_id, " + "boost::asio::ip::tcp::endpoint & sorry_endpoint) : " + "thread_id = %d, sorry_endpoint = [%s]:%d."); + formatter % thread_id % sorry_endpoint.address().to_string() % sorry_endpoint.port(); + putLogDebug(600084, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + EVENT_TAG status = FINALIZE; + boost::asio::ip::tcp::endpoint tmp_endpoint; + thread_data_ptr session_data_ptr; + session_thread_data_map_it session_thread_it; + session_thread_data_map_it session_thread_it_end; + + try + { + { + boost::mutex::scoped_lock slock(session_thread_data_map_mutex); + + session_thread_it = session_thread_data_map.find(thread_id); + if (unlikely(session_thread_it == session_thread_data_map.end() || session_thread_it->second == NULL)) + { + boost::format formatter("Invalid thread id. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(600056, formatter.str(), __FILE__, __LINE__ ); + throw -1; + } + + session_data_ptr = session_thread_it->second; + } + + //data state is HTTP_START + if (session_data_ptr->data_state == HTTP_START) + { + //set return status + status = CLIENT_RECV; + } + //data state is not HTTP_START + else + { + //set return status + status = SORRYSERVER_CONNECT; + } + + //set last status + session_data_ptr->last_status = status; + } + catch (int e) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_sorryserver_select() : catch exception e = %d. thread id : %d."); + formatter % e % boost::this_thread::get_id(); + putLogDebug(600085, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + //set return status + status = FINALIZE; + } + catch (const std::exception& ex) + { + std::cerr << "protocol_module_ip::handle_sorryserver_select() : exception : error = " << ex.what() << "." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_sorryserver_select() : exception : error = %s. thread id : %d."); + formatter % ex.what() % boost::this_thread::get_id(); + putLogError(600057, formatter.str(), __FILE__, __LINE__ ); + + //set return status + status = FINALIZE; + } + catch (...) + { + std::cerr << "protocol_module_ip::handle_sorryserver_select() : Unknown exception." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG " + "protocol_module_ip::handle_sorryserver_select() : " + "Unknown exception. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(600058, formatter.str(), __FILE__, __LINE__ ); + + //set return status + status = FINALIZE; + } + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_sorryserver_select(const boost::thread::id thread_id, " + "boost::asio::ip::tcp::endpoint & sorry_endpoint)" + " : return_value = %d. thread id : %d."); + formatter % status % boost::this_thread::get_id(); + putLogDebug(600086, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + return status; + } + + //! called from after sorryserver connect + //! @param[in] upstream thread id + //! @param[out] send buffer reference. + //! @param[out] send length + //! @return session use EVENT mode. + protocol_module_base::EVENT_TAG protocol_module_ip::handle_sorryserver_connect( + const boost::thread::id thread_id, boost::array& sendbuffer, size_t& datalen) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("in_function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_sorryserver_connect(const boost::thread::id thread_id, " + "boost::array& sendbuffer, size_t& datalen) : " + "thread_id = %d."); + formatter % thread_id; + putLogDebug(600087, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + EVENT_TAG status = FINALIZE; + size_t send_possible_size = 0; + size_t uri_offset = 0; + size_t uri_len = 0; + size_t x_forwarded_for_insert_pos = 0; + thread_data_ptr session_data_ptr; + session_thread_data_map_it session_thread_it; + std::pair buffer_element; + std::string x_forwarded_for_context; + + try + { + { + boost::mutex::scoped_lock slock(session_thread_data_map_mutex); + + //thread id check + session_thread_it = session_thread_data_map.find(thread_id); + if (unlikely(session_thread_it == session_thread_data_map.end() || session_thread_it->second == NULL)) + { + boost::format formatter("Invalid thread id. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(600059, formatter.str(), __FILE__, __LINE__ ); + throw -1; + } + + session_data_ptr = session_thread_it->second; + } + //set send possible data size + send_possible_size = std::min(session_data_ptr->current_message_rest_size, + session_data_ptr->data_length + ); + + if (session_data_ptr->buffer_sequence.empty()) + { + //data state is HTTP_HEADER + if (session_data_ptr->data_state == HTTP_HEADER) + { + //search uri + http_utility::find_uri(session_data_ptr->data_buffer + session_data_ptr->data_offset, + session_data_ptr->data_length, uri_offset, uri_len); + + //set buffer's position + buffer_element.first = session_data_ptr->data_buffer + session_data_ptr->data_offset; + buffer_element.second = uri_offset; + + //put buffer data to buffer_sequence + session_data_ptr->buffer_sequence.push_back(buffer_element); + + //set buffer's position + buffer_element.first = sorry_uri.data(); + buffer_element.second = strlen(sorry_uri.data()); + + //put buffer data to buffer_sequence + session_data_ptr->buffer_sequence.push_back(buffer_element); + + //forwarded_for flag is on + if (forwarded_for == FORWARDED_FOR_ON) + { + create_x_forwarded_for(session_data_ptr->client_endpoint.address().to_string(), + session_data_ptr->data_buffer + session_data_ptr->data_offset, + session_data_ptr->data_length, + x_forwarded_for_insert_pos, + x_forwarded_for_context); + + //set buffer's position + buffer_element.first = session_data_ptr->data_buffer + + session_data_ptr->data_offset + + uri_offset + + uri_len; + buffer_element.second = x_forwarded_for_insert_pos - uri_offset - uri_len; + + //put buffer data to buffer_sequence + session_data_ptr->buffer_sequence.push_back(buffer_element); + + session_data_ptr->forwarded_for_buffer.assign(0); + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + dump_memory(x_forwarded_for_context.c_str(), + x_forwarded_for_context.size(), datadump); + boost::format formatter( + "function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_sorryserver_connect() : before memcpy (data dump) : " + "data begin = 0, data_size = %d, data = %s"); + formatter % x_forwarded_for_context.size() % datadump; + putLogDebug(600088, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + memcpy(session_data_ptr->forwarded_for_buffer.data(), + x_forwarded_for_context.c_str(), + x_forwarded_for_context.size()); + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + dump_memory(x_forwarded_for_context.c_str(), + x_forwarded_for_context.size(), datadump); + boost::format formatter( + "function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_sorryserver_connect() : after memcpy (data dump) : " + "data begin = 0, data_size = %d, data = %s"); + formatter % x_forwarded_for_context.size() % datadump; + putLogDebug(600089, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + //set buffer's position + buffer_element.first = session_data_ptr->forwarded_for_buffer.data(); + buffer_element.second = x_forwarded_for_context.size(); + //put buffer data to buffer_sequence + session_data_ptr->buffer_sequence.push_back(buffer_element); + + //set buffer's position + buffer_element.first = session_data_ptr->data_buffer + session_data_ptr->data_offset + x_forwarded_for_insert_pos; + buffer_element.second = send_possible_size - x_forwarded_for_insert_pos; + //put buffer data to buffer_sequence + session_data_ptr->buffer_sequence.push_back(buffer_element); + } + //forwarded_for flag is on + else + { + //set buffer's position + buffer_element.first = session_data_ptr->data_buffer + + session_data_ptr->data_offset + + uri_offset + + uri_len; + buffer_element.second = send_possible_size - uri_offset - uri_len; + //put buffer data to buffer_sequence + session_data_ptr->buffer_sequence.push_back(buffer_element); + } + + //set data state HTTP_BODY + session_data_ptr->data_state = HTTP_BODY; + } + //data state is not HTTP_HEADER + else + { + //set buffer's position + buffer_element.first = session_data_ptr->data_buffer + session_data_ptr->data_offset; + buffer_element.second = send_possible_size; + //put buffer data to buffer_sequence + session_data_ptr->buffer_sequence.push_back(buffer_element); + } + } + + //put buffer_sequence data into sendbuffer + put_data_into_sendbuffer(session_data_ptr, sendbuffer, datalen); + + //set return status + status = SORRYSERVER_SEND; + + //set last status + session_data_ptr->last_status = status; + + } + catch (int e) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_sorryserver_connect() : catch exception e = %d. thread id : %d."); + formatter % e % boost::this_thread::get_id(); + putLogDebug(600090, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + //set return status + status = FINALIZE; + } + catch (const std::exception& ex) + { + std::cerr << "protocol_module_ip::handle_sorryserver_connect() : exception : error = " << ex.what() << "." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_sorryserver_connect() : exception : error = %s. thread id : %d."); + formatter % ex.what() % boost::this_thread::get_id(); + putLogError(600060, formatter.str(), __FILE__, __LINE__ ); + + //set return status + status = FINALIZE; + } + catch (...) + { + std::cerr << "protocol_module_ip::handle_sorryserver_connect() : Unknown exception." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_sorryserver_connect() : Unknown exception. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(600061, formatter.str(), __FILE__, __LINE__ ); + + //set return status + status = FINALIZE; + } + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_sorryserver_connect(const boost::thread::id thread_id, " + "boost::array& sendbuffer, " + "size_t& datalen) : return_value = %d. thread id : %d."); + formatter % status % boost::this_thread::get_id(); + putLogDebug(600091, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + return status; + } + //! called from after sorryserver connection fail + //! @param[in] upstream thread id + //! @param[in] sorryserver endpoint reference. + //! @return session use EVENT mode. + protocol_module_base::EVENT_TAG protocol_module_ip::handle_sorryserver_connection_fail( + const boost::thread::id thread_id, const boost::asio::ip::tcp::endpoint & sorry_endpoint) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("in_function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_sorryserver_connection_fail(const boost::thread::id thread_id, " + "const boost::asio::ip::tcp::endpoint & sorry_endpoint) : " + "thread_id = %d, sorry_endpoint = [%s]:%d."); + formatter % thread_id % sorry_endpoint.address().to_string() % sorry_endpoint.port(); + putLogDebug(600092, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + EVENT_TAG status = FINALIZE; + thread_data_ptr session_data_ptr; + session_thread_data_map_it session_thread_it; + + try + { + boost::mutex::scoped_lock slock(session_thread_data_map_mutex); + + session_thread_it = session_thread_data_map.find(thread_id); + if (unlikely(session_thread_it == session_thread_data_map.end() || session_thread_it->second == NULL)) + { + boost::format formatter("Invalid thread id. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(600062, formatter.str(), __FILE__, __LINE__ ); + throw -1; + } + + session_data_ptr = session_thread_it->second; + + //set return status + status = CLIENT_DISCONNECT; + + //set last status + session_data_ptr->last_status = status; + } + catch (int e) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_sorryserver_connection_fail() : catch exception e = %d. thread id : %d."); + formatter % e % boost::this_thread::get_id(); + putLogDebug(600093, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + //set return status + status = FINALIZE; + } + catch (const std::exception& ex) + { + std::cerr << "protocol_module_ip::handle_sorryserver_connection_fail() : exception : error = " << ex.what() << "." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_sorryserver_connection_fail() : exception : error = %s. thread id : %d."); + formatter % ex.what() % boost::this_thread::get_id(); + putLogError(600063, formatter.str(), __FILE__, __LINE__ ); + + //set return status + status = FINALIZE; + } + catch (...) + { + std::cerr << "protocol_module_ip::handle_sorryserver_connection_fail() : Unknown exception." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG " + "protocol_module_ip::handle_sorryserver_connection_fail() : " + "Unknown exception. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(600064, formatter.str(), __FILE__, __LINE__ ); + + //set return status + status = FINALIZE; + } + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_sorryserver_connection_fail(const boost::thread::id thread_id, " + "const boost::asio::ip::tcp::endpoint & sorry_endpoint) : return_value = %d. thread id : %d."); + formatter % status % boost::this_thread::get_id(); + putLogDebug(600094, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + return status; + } + + //! called from after sorryserver send + //! @param[in] upstream thread id + //! @return session use EVENT mode. + protocol_module_base::EVENT_TAG protocol_module_ip::handle_sorryserver_send( + const boost::thread::id thread_id) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("in_function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_sorryserver_send(const boost::thread::id thread_id) : thread_id = %d."); + formatter % thread_id; + putLogDebug(600095, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + EVENT_TAG status = FINALIZE; + size_t http_header_all_offset = 0; + size_t http_header_all_len = 0; + size_t http_header_content_length_offset = 0; + size_t http_header_content_length_len = 0; + const size_t CR_LF_LEN = 2; + const size_t CR_LF_CR_LF_LEN = 4; + int content_length_value = 0; + + std::string content_length; + cmatch regex_ret; + cregex content_length_regex = icase("Content-Length") >> ":" >> *~_d >> (s1 = +_d) >> *~_d; + + + bool find_ret = false; + http_utility::CHECK_RESULT_TAG check_ret; + + thread_data_ptr session_data_ptr; + session_thread_data_map_it session_thread_it; + + try + { + { + boost::mutex::scoped_lock slock(session_thread_data_map_mutex); + + //thread id check + session_thread_it = session_thread_data_map.find(thread_id); + if (unlikely(session_thread_it == session_thread_data_map.end() || session_thread_it->second == NULL)) + { + boost::format formatter("Invalid thread id. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(600065, formatter.str(), __FILE__, __LINE__ ); + throw -1; + } + + session_data_ptr = session_thread_it->second; + } + + //current_message_rest_size > 0 + if (session_data_ptr->current_message_rest_size > 0) + { + //data size > 0 + if (session_data_ptr->data_length > 0) + { + //set return status + status = SORRYSERVER_CONNECT; + } + //data size is 0 + else + { + //data offset is 0 + session_data_ptr->data_offset = 0; + + //set return status + status = CLIENT_RECV; + } + } + //current_message_rest_size is 0 + else + { + //data size > 0 + if (session_data_ptr->data_length> 0) + { + //data state is HTTP_BODY + if (session_data_ptr->data_state == HTTP_BODY) + { + //search whole http header, get whole http header's offset and length + find_ret = http_utility::find_http_header_all(session_data_ptr->data_buffer + session_data_ptr->data_offset, + session_data_ptr->data_length, + http_header_all_offset, + http_header_all_len + ); + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_sorryserver_send() : call find_http_header_all : " + "return_value = %d. thread id : %d."); + formatter % static_cast(find_ret) % boost::this_thread::get_id(); + putLogDebug(600096, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + //search http header result is NG + if (!find_ret) + { + //set data state HTTP_START + session_data_ptr->data_state = HTTP_START; + + //set return status + status = CLIENT_RECV; + } + //check method and version result is OK + else + { + //search Content_Length header + check_ret = http_utility::check_http_method_and_version(session_data_ptr->data_buffer + session_data_ptr->data_offset, + session_data_ptr->data_length); + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_sorryserver_send() : call check_http_method_and_version : " + "return_value = %d. thread id : %d."); + formatter % check_ret % boost::this_thread::get_id(); + putLogDebug(600097, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + //check method and version result is NG + if (check_ret == http_utility::CHECK_NG) + { + //set current message rest size + session_data_ptr->current_message_rest_size = session_data_ptr->data_length; + + //set data state UNKNOWN + session_data_ptr->data_state = UNKNOWN; + } + //check method and version result is OK + else + { + //search Content_Length header + find_ret = http_utility::find_http_header_content_length(session_data_ptr->data_buffer+session_data_ptr->data_offset, + session_data_ptr->data_length, + http_header_content_length_offset, + http_header_content_length_len); + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_sorryserver_send() : call find_http_header_content_length : " + "return_value = %d. thread id : %d."); + formatter % static_cast(find_ret) % boost::this_thread::get_id(); + putLogDebug(600098, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + //search Content_Length result is OK + if (find_ret) + { + content_length.assign(session_data_ptr->data_buffer+session_data_ptr->data_offset + http_header_content_length_offset, + http_header_content_length_len ); + find_ret = regex_search(content_length.c_str(), regex_ret, content_length_regex); + + //"content-length: ddd\r\n" + if ( find_ret) + { + content_length = content_length.substr( + regex_ret.position(1), + regex_ret.length(1)); + + //set content length value + content_length_value = boost::lexical_cast(content_length); + } + + //http_header context is "\r\n\r\n" only + if (http_header_all_len == 0) + { + //set current message rest size + session_data_ptr->current_message_rest_size = http_header_all_offset + http_header_all_len + content_length_value + CR_LF_LEN; + } + else + { + //set current message rest size + session_data_ptr->current_message_rest_size = http_header_all_offset + http_header_all_len + content_length_value + CR_LF_CR_LF_LEN; + } + } + //search Content_Length result is OK + else + { + //http_header context is "\r\n\r\n" only + if (http_header_all_len == 0) + { + //set current message rest size + session_data_ptr->current_message_rest_size = http_header_all_offset + http_header_all_len + CR_LF_LEN; + } + else + { + //set current message rest size + session_data_ptr->current_message_rest_size = http_header_all_offset + http_header_all_len + CR_LF_CR_LF_LEN; + } + + } + + //set data state HTTP_HEADER + session_data_ptr->data_state = HTTP_HEADER; + + } + //set return status + status = SORRYSERVER_CONNECT; + } + } + //data state is UNKNOWN + else if (session_data_ptr->data_state == UNKNOWN) + { + //set return status + status = SORRYSERVER_CONNECT; + } + + } + //data size is 0 + else + { + //data state is HTTP_BODY + if (session_data_ptr->data_state == HTTP_BODY) + { + //set data state HTTP_START + session_data_ptr->data_state = HTTP_START; + } + + //set data offset 0 + session_data_ptr->data_offset = 0; + + //set return status + status = CLIENT_RECV; + } + } + + //set last status + session_data_ptr->last_status = status; + } + catch (int e) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_sorryserver_send() : catch exception e = %d. thread id : %d."); + formatter % e % boost::this_thread::get_id(); + putLogDebug(600099, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + //set return status + status = FINALIZE; + } + catch (const boost::bad_lexical_cast& ) + { + std::cerr << "protocol_module_ip::handle_sorryserver_send() : exception : " << "Content_Length field's value is invalid." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::handle_sorryserver_send() : " + "Content_Length field's value is invalid. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(600066, formatter.str(), __FILE__, __LINE__ ); + + //set return status + status = FINALIZE; + } + catch (const std::exception& ex) + { + std::cerr << "protocol_module_ip::handle_sorryserver_send() : exception : error = " << ex.what() << "." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_sorryserver_send() : exception : error = %s. thread id : %d."); + formatter % ex.what() % boost::this_thread::get_id(); + putLogError(600067, formatter.str(), __FILE__, __LINE__ ); + + //set return status + status = FINALIZE; + } + catch (...) + { + std::cerr << "protocol_module_ip::handle_sorryserver_send() : Unknown exception." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG " + "protocol_module_ip::handle_sorryserver_send() : " + "Unknown exception. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(600068, formatter.str(), __FILE__, __LINE__ ); + + //set return status + status = FINALIZE; + } + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_sorryserver_send(const boost::thread::id thread_id) : return_value = %d. thread id : %d."); + formatter % status % boost::this_thread::get_id(); + putLogDebug(600100, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + return status; + } + + //! called from after realserver recive.for UDP + //! @param[in] downstream thread id + //! @param[in] realserver UDP endpoint reference + //! @param[in] recive from realserver buffer reference + //! @param[in] recv data length + //! @return session use EVENT mode. + protocol_module_base::EVENT_TAG protocol_module_ip::handle_realserver_recv( + const boost::thread::id thread_id, const boost::asio::ip::udp::endpoint& rs_endpoint, const boost::array& recvbuffer, const size_t recvlen) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("in/out_function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_realserver_recv(const boost::thread::id thread_id, " + "const boost::asio::ip::udp::endpoint& rs_endpoint, const boost::array& recvbuffer, " + "const size_t& recvlen) : " + "return_value = %d. thread id : %d."); + formatter % STOP % boost::this_thread::get_id(); + putLogDebug(600101, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + return STOP; + } + + //! called from after realserver recvive for TCP/IP + //! @param[in] downstream thread id + //! @param[in] realserver TCP/IP endpoint reference + //! @param[in] realserver recive buffer reference. + //! @param[in] recv data length + //! @return session use EVENT mode. + protocol_module_base::EVENT_TAG protocol_module_ip::handle_realserver_recv( + const boost::thread::id thread_id, const boost::asio::ip::tcp::endpoint& rs_endpoint, const boost::array& recvbuffer, const size_t recvlen) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + size_t buffer_size = recvbuffer.size() < recvlen ? recvbuffer.size() : recvlen; + std::string buffer; + dump_memory(recvbuffer.data(), buffer_size, buffer); + boost::format formatter("in_function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_realserver_recv(const boost::thread::id thread_id, " + "const boost::asio::ip::tcp::endpoint& rs_endpoint, " + "const boost::array& recvbuffer, " + "const size_t recvlen) : thread_id = %d, rs_endpoint = [%s]:%d, recvbuffer = %s, recvlen = %d."); + formatter % thread_id % rs_endpoint.address().to_string() % rs_endpoint.port() + % buffer % recvlen; + putLogDebug(600102, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + EVENT_TAG status = FINALIZE; + + bool find_ret = false; + size_t http_header_offset = 0; + size_t http_header_len = 0; + size_t http_header_content_length_offset = 0; + size_t http_header_content_length_len = 0; + int content_length_value = 0; + const size_t CR_LF_LEN = 2; //length of "\r\n" + const size_t CR_LF_CR_LF_LEN = 4; //length of "\r\n\r\n" + + session_thread_data_map_it session_thread_it; + thread_data_ptr session_data_ptr; + http_utility::CHECK_RESULT_TAG check_ret; + + std::string content_length; + cmatch regex_ret; + cregex content_length_regex = icase("Content-Length") >> ":" >> *~_d >> (s1 = +_d) >> *~_d; + + if (unlikely(recvlen > recvbuffer.size())) + { + std::cerr << "protocol_module_ip::handle_realserver_recv() : Data size bigger than buffer size." << std::endl; + boost::format formatter("Data size bigger than buffer size. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(600069, formatter.str(), __FILE__, __LINE__ ); + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_realserver_recv(const boost::thread::id thread_id, " + "const boost::asio::ip::tcp::endpoint& rs_endpoint, " + "const boost::array& recvbuffer, " + "const size_t recvlen) : return_value = %d. thread id : %d."); + formatter % FINALIZE % boost::this_thread::get_id(); + putLogDebug(600103, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + return status; + } + + try + { + { + boost::mutex::scoped_lock slock(session_thread_data_map_mutex); + + session_thread_it = session_thread_data_map.find(thread_id); + if (unlikely(session_thread_it == session_thread_data_map.end() || session_thread_it->second == NULL)) + { + boost::format formatter("Invalid thread id. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(600070, formatter.str(), __FILE__, __LINE__ ); + throw -1; + } + + session_data_ptr = session_thread_it->second; + } + + //set switch flag off + session_data_ptr->switch_flag = SWITCH_FLAG_OFF; + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_realserver_recv(const boost::thread::id thread_id, " + "const boost::asio::ip::tcp::endpoint& rs_endpoint, " + "const boost::array& recvbuffer, " + "const size_t recvlen) : SWITCH_FLAG_OFF. " + "thread_id = %d, rs_endpoint = [%s]:%d."); + formatter % thread_id % rs_endpoint.address().to_string() % rs_endpoint.port(); + putLogDebug(600104, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + //copy data from recvbuffer + if (!get_data_from_recvbuffer(session_data_ptr, recvbuffer, recvlen)) + { + //copy failed + std::cerr << "protocol_module_ip::handle_realserver_recv() : Data size bigger than buffer size." << std::endl; + boost::format formatter("Data size bigger than buffer size. thread id : % id."); + formatter % boost::this_thread::get_id(); + putLogError(600071, formatter.str(), __FILE__, __LINE__); + status = FINALIZE; + } + else + { + //data state is HTTP_START + if (session_data_ptr->data_state == HTTP_START) + { + //search http header + find_ret = http_utility::find_http_header_all(session_data_ptr->data_buffer + session_data_ptr->data_offset, + session_data_ptr->data_length, + http_header_offset, + http_header_len + ); + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_realserver_recv() : call find_http_header_all : " + "return_value = %d. thread id : %d."); + formatter % static_cast(find_ret) % boost::this_thread::get_id(); + putLogDebug(600105, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + //search http header result is NG + if (!find_ret) + { + //data size bigger than max buffer size + if (session_data_ptr->data_length >= MAX_IP_MODULE_BUFFER_SIZE - recvbuffer.size()) + { + //set data state UNKNOWN + session_data_ptr->data_state = UNKNOWN; + //set current message rest size + session_data_ptr->current_message_rest_size = session_data_ptr->data_length; + } + } + //search http header result is OK + else + { + //check http version and status code + check_ret = http_utility::check_http_version_and_status_code(session_data_ptr->data_buffer, + session_data_ptr->data_length); + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_realserver_recv() : call check_http_version_and_status_code : " + "return_value = %d. thread id : %d."); + formatter % check_ret % boost::this_thread::get_id(); + putLogDebug(600106, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + //check http version and status code result is NG + if (check_ret == http_utility::CHECK_NG) + { + //set data state UNKNOWN + session_data_ptr->data_state = UNKNOWN; + //set current message rest size + session_data_ptr->current_message_rest_size = session_data_ptr->data_length; + } + //check http version and status code result is OK + else + { + //search Content_Length header + find_ret = http_utility::find_http_header_content_length(session_data_ptr->data_buffer+session_data_ptr->data_offset, + session_data_ptr->data_length, + http_header_content_length_offset, + http_header_content_length_len); + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_realserver_recv() : call find_http_header_content_length : " + "return_value = %d. thread id : %d."); + formatter % static_cast(find_ret) % boost::this_thread::get_id(); + putLogDebug(600107, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + //search Content_Length result is OK + if (find_ret) + { + //set content length string + content_length.assign(session_data_ptr->data_buffer+session_data_ptr->data_offset + http_header_content_length_offset, + http_header_content_length_len ); + find_ret = regex_search(content_length.c_str(), regex_ret, content_length_regex); + + //"content-length: ddd\r\n" + if ( find_ret) + { + content_length = content_length.substr( + regex_ret.position(1), + regex_ret.length(1)); + + //set content length value + content_length_value = boost::lexical_cast(content_length); + } + + //http_header context is "\r\n\r\n" only + if (http_header_len == 0) + { + //set current message rest size + session_data_ptr->current_message_rest_size = http_header_offset + http_header_len + content_length_value + CR_LF_LEN; + } + else + { + //set current message rest size + session_data_ptr->current_message_rest_size = http_header_offset + http_header_len + content_length_value + CR_LF_CR_LF_LEN; + } + } + //search Content_Length result is NG + else + { + //http_header context is "\r\n\r\n" only + if (http_header_len == 0) + { + //set current message rest size + session_data_ptr->current_message_rest_size = http_header_offset + http_header_len + CR_LF_LEN; + } + else + { + //set current message rest size + session_data_ptr->current_message_rest_size = http_header_offset + http_header_len + CR_LF_CR_LF_LEN; + } + + } + + //set data state HTTP_HEADER + session_data_ptr->data_state = HTTP_HEADER; + } + } + } + //data state is UNKNOWN + else if (session_data_ptr->data_state == UNKNOWN) + { + //set current message rest size + session_data_ptr->current_message_rest_size = session_data_ptr->data_length; + } + else + { + //none + } + + //data state is HTTP_START + if (session_data_ptr->data_state == HTTP_START) + { + //set return status + status = REALSERVER_RECV; + } + //data state is not HTTP_START + else + { + //set return status + status = CLIENT_CONNECTION_CHECK; + } + } + + //set last status + session_data_ptr->last_status = status; + } + catch (int e) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_realserver_recv() : catch exception e = %d. thread id : %d."); + formatter % e % boost::this_thread::get_id(); + putLogDebug(600108, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + //set return status + status = FINALIZE; + } + catch (const boost::bad_lexical_cast& ) + { + std::cerr << "protocol_module_ip::handle_realserver_recv() : exception : " << "Content_Length field's value is invalid." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::handle_realserver_recv() : " + "Content_Length field's value is invalid. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(600072, formatter.str(), __FILE__, __LINE__ ); + + //set return status + status = FINALIZE; + } + catch (const std::exception& ex) + { + std::cerr << "protocol_module_ip::handle_realserver_recv() : exception : error = " << ex.what() << "." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_realserver_recv() : exception : error = %s. thread id : %d."); + formatter % ex.what() % boost::this_thread::get_id(); + putLogError(600073, formatter.str(), __FILE__, __LINE__ ); + + //set return status + status = FINALIZE; + } + catch (...) + { + std::cerr << "protocol_module_ip::handle_realserver_recv() : Unknown exception." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG " + "protocol_module_ip::handle_realserver_recv() : " + "Unknown exception. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(600074, formatter.str(), __FILE__, __LINE__ ); + + //set return status + status = FINALIZE; + } + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_realserver_recv(const boost::thread::id thread_id, " + "const boost::asio::ip::tcp::endpoint& rs_endpoint, " + "const boost::array& recvbuffer, " + "const size_t recvlen) : return_value = %d. thread id : %d."); + formatter % FINALIZE % boost::this_thread::get_id(); + putLogDebug(600109, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + return status; + } + + + + //! called from after sorryserver recive + //! @param[in] downstream thread id + //! @param[in] sorryserver endpoint reference + //! @param[in] recive from realserver buffer reference. + //! @param[in] recv data length + //! @return session use EVENT mode + protocol_module_base::EVENT_TAG protocol_module_ip::handle_sorryserver_recv( + const boost::thread::id thread_id, const boost::asio::ip::tcp::endpoint& sorry_endpoint, const boost::array< + char, MAX_BUFFER_SIZE>& recvbuffer, const size_t recvlen) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + size_t buffer_size = recvbuffer.size() < recvlen ? recvbuffer.size() : recvlen; + std::string buffer; + dump_memory(recvbuffer.data(), buffer_size, buffer); + boost::format formatter("in_function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_sorryserver_recv(const boost::thread::id thread_id, " + "const boost::asio::ip::tcp::endpoint& sorry_endpoint, " + "const boost::array& recvbuffer, " + "const size_t recvlen) : thread_id = %d, sorry_endpoint = [%s]:%d, recvbuffer = %s, recvlen = %d."); + formatter % thread_id % sorry_endpoint.address().to_string() % sorry_endpoint.port() + % buffer % recvlen; + putLogDebug(600110, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + EVENT_TAG status = FINALIZE; + bool find_ret = false; + size_t http_header_offset = 0; + size_t http_header_len = 0; + size_t http_header_content_length_offset = 0; + size_t http_header_content_length_len = 0; + int content_length_value = 0; + const size_t CR_LF_LEN = 2; //length of "\r\n" + const size_t CR_LF_CR_LF_LEN = 4; //length of "\r\n\r\n" + + session_thread_data_map_it session_thread_it; + thread_data_ptr session_data_ptr; + http_utility::CHECK_RESULT_TAG check_ret; + std::string content_length; + cmatch regex_ret; + cregex content_length_regex = icase("Content-Length") >> ":" >> *~_d >> (s1 = +_d) >> *~_d; + + if (unlikely(recvlen > recvbuffer.size())) + { + std::cerr << "protocol_module_ip::handle_sorryserver_recv() : Data size bigger than buffer size." << std::endl; + boost::format formatter("Data size bigger than buffer size. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(600075, formatter.str(), __FILE__, __LINE__ ); + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_sorryserver_recv(const boost::thread::id thread_id, " + "const boost::asio::ip::tcp::endpoint& sorry_endpoint, " + "const boost::array& recvbuffer, " + "const size_t recvlen) : return_value = %d. thread id : %d."); + formatter % FINALIZE % boost::this_thread::get_id(); + putLogDebug(600111, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + return status; + } + + try + { + { + boost::mutex::scoped_lock slock(session_thread_data_map_mutex); + + session_thread_it = session_thread_data_map.find(thread_id); + if (unlikely(session_thread_it == session_thread_data_map.end() || session_thread_it->second == NULL)) + { + boost::format formatter("Invalid thread id. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(600076, formatter.str(), __FILE__, __LINE__ ); + throw -1; + } + + session_data_ptr = session_thread_it->second; + } + + //set switch flag off + session_data_ptr->switch_flag = SWITCH_FLAG_OFF; + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_sorryserver_recv(const boost::thread::id thread_id, " + "const boost::asio::ip::tcp::endpoint& sorry_endpoint, " + "const boost::array& recvbuffer, " + "const size_t recvlen) : SWITCH_FLAG_OFF. " + "thread_id = %d, rs_endpoint = [%s]:%d."); + formatter % thread_id % sorry_endpoint.address().to_string() % sorry_endpoint.port(); + putLogDebug(600112, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + //copy data from recvbuffer + if (!get_data_from_recvbuffer(session_data_ptr, recvbuffer, recvlen)) + { + //copy failed + std::cerr << "protocol_module_ip::handle_sorryserver_recv() : Data size bigger than buffer size." << std::endl; + boost::format formatter("Data size bigger than buffer size. thread id : % id."); + formatter % boost::this_thread::get_id(); + putLogError(600077, formatter.str(), __FILE__, __LINE__); + + status = FINALIZE; + } + else + { + //data state is HTTP_START + if (session_data_ptr->data_state == HTTP_START) + { + //search http header + find_ret = http_utility::find_http_header_all(session_data_ptr->data_buffer + session_data_ptr->data_offset, + session_data_ptr->data_length, + http_header_offset, + http_header_len + ); + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_sorryserver_recv() : call find_http_header_all : " + "return_value = %d. thread id : %d."); + formatter % static_cast(find_ret) % boost::this_thread::get_id(); + putLogDebug(600113, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + //search http header result is NG + if (!find_ret) + { + //data size bigger than max buffer size + if (session_data_ptr->data_length >= MAX_IP_MODULE_BUFFER_SIZE - recvbuffer.size()) + { + //set data state UNKNOWN + session_data_ptr->data_state = UNKNOWN; + //set current message rest size + session_data_ptr->current_message_rest_size = session_data_ptr->data_length; + } + } + //search http header result is OK + else + { + //check http version and status code + check_ret = http_utility::check_http_version_and_status_code(session_data_ptr->data_buffer, + session_data_ptr->data_length); + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_sorryserver_recv() : call check_http_version_and_status_code : " + "return_value = %d. thread id : %d."); + formatter % check_ret % boost::this_thread::get_id(); + putLogDebug(600114, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + //check http version and status code result is NG + if (check_ret == http_utility::CHECK_NG) + { + //set data state UNKNOWN + session_data_ptr->data_state = UNKNOWN; + //set current message rest size + session_data_ptr->current_message_rest_size = session_data_ptr->data_length; + } + //check http version and status code result is OK + else + { + //search Content_Length header + find_ret = http_utility::find_http_header_content_length(session_data_ptr->data_buffer+session_data_ptr->data_offset, + session_data_ptr->data_length, + http_header_content_length_offset, + http_header_content_length_len); + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_sorryserver_recv() : call find_http_header_content_length : " + "return_value = %d. thread id : %d."); + formatter % static_cast(find_ret) % boost::this_thread::get_id(); + putLogDebug(600115, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + //search Content_Length result is OK + if (find_ret) + { + ////set content length string + content_length.assign(session_data_ptr->data_buffer+session_data_ptr->data_offset + http_header_content_length_offset, + http_header_content_length_len ); + find_ret = regex_search(content_length.c_str(), regex_ret, content_length_regex); + + //"content-length: ddd\r\n" + if ( find_ret) + { + content_length = content_length.substr( + regex_ret.position(1), + regex_ret.length(1)); + + //set content length value + content_length_value = boost::lexical_cast(content_length); + } + + //http_header context is "\r\n\r\n" only + if (http_header_len == 0) + { + //set current message rest size + session_data_ptr->current_message_rest_size = http_header_offset + http_header_len + content_length_value + CR_LF_LEN; + } + else + { + //set current message rest size + session_data_ptr->current_message_rest_size = http_header_offset + http_header_len + content_length_value + CR_LF_CR_LF_LEN; + } + } + //search Content_Length result is NG + else + { + //http_header context is "\r\n\r\n" only + if (http_header_len == 0) + { + //set current message rest size + session_data_ptr->current_message_rest_size = http_header_offset + http_header_len + CR_LF_LEN; + } + else + { + //set current message rest size + session_data_ptr->current_message_rest_size = http_header_offset + http_header_len + CR_LF_CR_LF_LEN; + } + + } + + //set data state HTTP_HEADER + session_data_ptr->data_state = HTTP_HEADER; + + } + } + } + //data state is UNKNOWN + else if (session_data_ptr->data_state == UNKNOWN) + { + //set current message rest size + session_data_ptr->current_message_rest_size = session_data_ptr->data_length; + } + else + { + //none + } + + //data state is HTTP_START + if (session_data_ptr->data_state == HTTP_START) + { + //set return status + status = SORRYSERVER_RECV; + } + //data state is not HTTP_START + else + { + //set return status + status = CLIENT_CONNECTION_CHECK; + } + } + + //set last status + session_data_ptr->last_status = status; + } + catch (int e) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_sorryserver_recv() : catch exception e = %d. thread id : %d."); + formatter % e % boost::this_thread::get_id(); + putLogDebug(600116, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + //set return status + status = FINALIZE; + } + catch (const boost::bad_lexical_cast& ) + { + std::cerr << "protocol_module_ip::handle_sorryserver_recv() : exception : " << "Content_Length field's value is invalid." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::handle_sorryserver_recv() : " + "Content_Length field's value is invalid. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(600078, formatter.str(), __FILE__, __LINE__ ); + + //set return status + status = FINALIZE; + } + catch (const std::exception& ex) + { + std::cerr << "protocol_module_ip::handle_sorryserver_recv() : exception : error = " << ex.what() << "." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_sorryserver_recv() : exception : error = %s. thread id : %d."); + formatter % ex.what() % boost::this_thread::get_id(); + putLogError(600079, formatter.str(), __FILE__, __LINE__ ); + + //set return status + status = FINALIZE; + } + catch (...) + { + std::cerr << "protocol_module_ip::handle_sorryserver_recv() : Unknown exception." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG " + "protocol_module_ip::handle_sorryserver_recv() : " + "Unknown exception. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(600080, formatter.str(), __FILE__, __LINE__ ); + + //set return status + status = FINALIZE; + } + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_sorryserver_recv(const boost::thread::id thread_id, " + "const boost::asio::ip::tcp::endpoint& sorry_endpoint, " + "const boost::array& recvbuffer, " + "const size_t recvlen) : return_value = %d. thread id : %d."); + formatter % FINALIZE % boost::this_thread::get_id(); + putLogDebug(600117, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + return status; + + } + + //! called from UPSTEEARM thread. make module original message. + //! @param[in] downstream thread id. + //! @return session use EVENT mode + protocol_module_base::EVENT_TAG protocol_module_ip::handle_response_send_inform( + const boost::thread::id thread_id) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("in/out_function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_response_send_inform(const boost::thread::id thread_id) : " + "return_value = %d. thread id : %d."); + formatter % STOP % boost::this_thread::get_id(); + putLogDebug(600118, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + return STOP; + } + + //! called from after client connection check. use TCP/IP only. create client send message. + //! @param[in] downstream thread id + //! @param[out] send budffer reference + //! @param[out] send data length + //! @return session use EVENT mode + protocol_module_base::EVENT_TAG protocol_module_ip::handle_client_connection_check( + const boost::thread::id thread_id, boost::array& sendbuffer, size_t& datalen) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("in_function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_client_connection_check(const boost::thread::id thread_id, " + "boost::array& sendbuffer, size_t& datalen) : " + "thread_id = %d."); + formatter % thread_id; + putLogDebug(600119, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + EVENT_TAG status = FINALIZE; + thread_data_ptr session_data_ptr; + size_t send_possible_size = 0; + + try + { + { + boost::mutex::scoped_lock sclock(session_thread_data_map_mutex); + + session_thread_data_map_it session_thread_it = session_thread_data_map.find(thread_id); + if (unlikely(session_thread_it == session_thread_data_map.end() || session_thread_it->second == NULL)) + { + boost::format formatter("Invalid thread id. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(600081, formatter.str(), __FILE__, __LINE__ ); + throw -1; + } + + session_data_ptr = session_thread_it->second; + } + + //data state is HTTP_HEADER + if (session_data_ptr->data_state == HTTP_HEADER) + { + //set data HTTP_BODY + session_data_ptr->data_state = HTTP_BODY; + } + + //set send possible data size + send_possible_size = std::min(std::min(sendbuffer.size(), session_data_ptr->current_message_rest_size), + session_data_ptr->data_length + ); + //set send data size + datalen = send_possible_size; + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + dump_memory(session_data_ptr->data_buffer + session_data_ptr->data_offset, send_possible_size, datadump); + + boost::format formatter( + "function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_client_connection_check() : before memcpy (data dump) : " + "data begin = %d, data_size = %d, data = %s"); + formatter % session_data_ptr->data_offset % send_possible_size % datadump; + putLogDebug(600120, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + //copy send possible data to sendbuffer + memcpy(sendbuffer.data(), session_data_ptr->data_buffer + session_data_ptr->data_offset, + send_possible_size); + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + dump_memory(sendbuffer.data(), send_possible_size, datadump); + + boost::format formatter( + "function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_client_connection_check() : after memcpy (data dump) : " + "data begin = 0, data_size = %d, data = %s"); + formatter % send_possible_size % datadump; + putLogDebug(600121, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + //set current message rest size + session_data_ptr->current_message_rest_size -= send_possible_size; + + //set buffer's position + session_data_ptr->data_offset += send_possible_size; + session_data_ptr->data_length -= send_possible_size; + + //current message rest size is 0 + if (session_data_ptr->current_message_rest_size == 0) + { + boost::mutex::scoped_lock lock(session_data_mutex); + time_t now; + time(&now); + boost::asio::ip::tcp::endpoint init_endpoint; + + //write session data to session table + ip_data_processor->write_session_data(session_data_ptr->ip_hash, + init_endpoint, + now); + + } + + //set return status + status = CLIENT_SEND; + + //set last status + session_data_ptr->last_status = status; + } + catch (int e) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_client_connection_check() : catch exception e = %d. thread id : %d."); + formatter % e % boost::this_thread::get_id(); + putLogDebug(600122, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + //set return status + status = FINALIZE; + } + catch (const std::exception& ex) + { + std::cerr << "protocol_module_ip::handle_client_connection_check() : exception : error = " << ex.what() << "." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_client_connection_check() : exception : error = %s. thread id : %d."); + formatter % ex.what() % boost::this_thread::get_id(); + putLogError(600082, formatter.str(), __FILE__, __LINE__ ); + + //set return status + status = FINALIZE; + } + catch (...) + { + std::cerr << "protocol_module_ip::handle_client_connection_check() : Unknown exception." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_client_connection_check() : Unknown exception. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(600083, formatter.str(), __FILE__, __LINE__ ); + + //set return status + status = FINALIZE; + } + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_client_connection_check(const boost::thread::id thread_id, " + "boost::array& sendbuffer, size_t& datalen) : return_value = %d. thread id : %d."); + formatter % status % boost::this_thread::get_id(); + putLogDebug(600123, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + return status; + } + + //! called from after client select. use UDP only + //! @param[in] downstream thread id + //! @param[in] client udp endpoint + //! @param[out] send buffer reference + //! @param[out] send data length + //! @return session use EVENT mode + protocol_module_base::EVENT_TAG protocol_module_ip::handle_client_select( + const boost::thread::id thread_id, boost::asio::ip::udp::endpoint& cl_endpoint, boost::array& sendbuffer, size_t& datalen) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("in/out_function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_client_select(const boost::thread::id thread_id, " + "boost::asio::ip::udp::endpoint& cl_endpoint, boost::array& sendbuffer, " + "const size_t& datalen) : " + "return_value = %d. thread id : %d."); + formatter % STOP % boost::this_thread::get_id(); + putLogDebug(600124, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + return STOP; + } + + //! called from after client send + //! @param[in] downstream thread id + //! @return session use EVENT mode + protocol_module_base::EVENT_TAG protocol_module_ip::handle_client_send( + const boost::thread::id thread_id) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("in_function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_client_send(const boost::thread::id thread_id) : thread_id = %d."); + formatter % thread_id; + putLogDebug(600125, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + EVENT_TAG status = FINALIZE; + size_t http_header_all_offset = 0; + size_t http_header_all_len = 0; + size_t http_header_content_length_offset= 0; + size_t http_header_content_length_len = 0; + const size_t CR_LF_LEN = 2; + const size_t CR_LF_CR_LF_LEN = 4; + int content_length_value = 0; + + std::string content_length; + cmatch regex_ret; + cregex content_length_regex = icase("Content-Length") >> ":" >> *~_d >> (s1 = +_d) >> *~_d; + + + bool find_ret = false; + http_utility::CHECK_RESULT_TAG check_ret; + + thread_data_ptr session_data_ptr; + session_thread_data_map_it session_thread_it; + + try + { + { + boost::mutex::scoped_lock slock(session_thread_data_map_mutex); + + //thread id check + session_thread_it = session_thread_data_map.find(thread_id); + if (unlikely(session_thread_it == session_thread_data_map.end() || session_thread_it->second == NULL)) + { + boost::format formatter("Invalid thread id. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(600084, formatter.str(), __FILE__, __LINE__ ); + throw -1; + } + + session_data_ptr = session_thread_it->second; + } + + //current_message_rest_size > 0 + if (session_data_ptr->current_message_rest_size > 0) + { + //data size > 0 + if (session_data_ptr->data_length > 0) + { + //set return status + status = CLIENT_CONNECTION_CHECK; + } + //data size is 0 + else + { + //data offset is 0 + session_data_ptr->data_offset = 0; + + //set return status + status = REALSERVER_RECV; + } + } + //current_message_rest_size is 0 + else + { + //data size > 0 + if (session_data_ptr->data_length > 0) + { + //data state is HTTP_BODY + if (session_data_ptr->data_state == HTTP_BODY) + { + //search whole http header, get whole http header's offset and length + find_ret = http_utility::find_http_header_all(session_data_ptr->data_buffer + session_data_ptr->data_offset, + session_data_ptr->data_length, + http_header_all_offset, + http_header_all_len + ); + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_client_send() : call find_http_header_all : " + "return_value = %d. thread id : %d."); + formatter % static_cast(find_ret) % boost::this_thread::get_id(); + putLogDebug(600126, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + //search http header result is NG + if (!find_ret) + { + //set data state HTTP_START + session_data_ptr->data_state = HTTP_START; + + //set return status + status = REALSERVER_RECV; + } + //search http header result is OK + else + { + //check http version and status code + check_ret = http_utility::check_http_version_and_status_code(session_data_ptr->data_buffer + session_data_ptr->data_offset, + session_data_ptr->data_length); + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_client_send() : call check_http_version_and_status_code : " + "return_value = %d. thread id : %d."); + formatter % check_ret % boost::this_thread::get_id(); + putLogDebug(600127, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + //check version and status code result is NG + if (check_ret == http_utility::CHECK_NG) + { + //set current message rest size + session_data_ptr->current_message_rest_size = session_data_ptr->data_length; + + //set data state UNKNOWN + session_data_ptr->data_state = UNKNOWN; + } + //check version and status code result is OK + else + { + //search Content_Length header + find_ret = http_utility::find_http_header_content_length(session_data_ptr->data_buffer+session_data_ptr->data_offset, + session_data_ptr->data_length, + http_header_content_length_offset, + http_header_content_length_len); + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_client_send() : call find_http_header_content_length : " + "return_value = %d. thread id : %d."); + formatter % static_cast(find_ret) % boost::this_thread::get_id(); + putLogDebug(600128, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + //search Content_Length result is OK + if (find_ret) + { + content_length.assign(session_data_ptr->data_buffer+session_data_ptr->data_offset + http_header_content_length_offset, + http_header_content_length_len ); + find_ret = regex_search(content_length.c_str(), regex_ret, content_length_regex); + + //"content-length: ddd\r\n" + if ( find_ret) + { + content_length = content_length.substr( + regex_ret.position(1), + regex_ret.length(1)); + + //set content length value + content_length_value = boost::lexical_cast(content_length); + } + + //http_header context is "\r\n\r\n" only + if (http_header_all_len == 0) + { + //set current message rest size + session_data_ptr->current_message_rest_size = http_header_all_offset + http_header_all_len + content_length_value + CR_LF_LEN; + } + else + { + //set current message rest size + session_data_ptr->current_message_rest_size = http_header_all_offset + http_header_all_len + content_length_value + CR_LF_CR_LF_LEN; + } + } + //search Content_Length result is OK + else + { + //http_header context is "\r\n\r\n" only + if (http_header_all_len == 0) + { + //set current message rest size + session_data_ptr->current_message_rest_size = http_header_all_offset + http_header_all_len + CR_LF_LEN; + } + else + { + //set current message rest size + session_data_ptr->current_message_rest_size = http_header_all_offset + http_header_all_len + CR_LF_CR_LF_LEN; + } + + } + + //set data state HTTP_HEADER + session_data_ptr->data_state = HTTP_HEADER; + } + + //set return status + status = CLIENT_CONNECTION_CHECK; + } + } + //data state is UNKNOWN + else if (session_data_ptr->data_state == UNKNOWN) + { + //set return status + status = CLIENT_CONNECTION_CHECK; + } + } + //data size is 0 + else + { + //data state is HTTP_BODY + if (session_data_ptr->data_state == HTTP_BODY) + { + //set data state HTTP_START + session_data_ptr->data_state = HTTP_START; + } + + //set data offset 0 + session_data_ptr->data_offset = 0; + + //set return status + status = REALSERVER_RECV; + } + } + + //switch flag is on and status is REALSERVER_RECV + if (session_data_ptr->switch_flag == SWITCH_FLAG_ON + && status == REALSERVER_RECV) + { + //set return status + status = CLIENT_DISCONNECT; + } + //sorry flag is on and and status is REALSERVER_RECV + else if (session_data_ptr->sorry_flag == SORRY_FLAG_ON + && status == REALSERVER_RECV) + { + //set return status + status = SORRYSERVER_RECV; + } + else + { + //none + } + + //set last status + session_data_ptr->last_status = status; + } + catch (int e) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_client_send() : catch exception e = %d. thread id : %d."); + formatter % e % boost::this_thread::get_id(); + putLogDebug(600129, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + //set last status + status = FINALIZE; + } + catch (const boost::bad_lexical_cast& ) + { + std::cerr << "protocol_module_ip::handle_client_send() : exception : " << "Content_Length field's value is invalid." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::handle_client_send() : " + "Content_Length field's value is invalid. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(600085, formatter.str(), __FILE__, __LINE__ ); + + //set last status + status = FINALIZE; + } + catch (const std::exception& ex) + { + std::cerr << "protocol_module_ip::handle_client_send() : exception : error = " << ex.what() << "." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_client_send() : exception : error = %s. thread id : %d."); + formatter % ex.what() % boost::this_thread::get_id(); + putLogError(600086, formatter.str(), __FILE__, __LINE__ ); + + //set last status + status = FINALIZE; + } + catch (...) + { + std::cerr << "protocol_module_ip::handle_client_send() : Unknown exception." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG " + "protocol_module_ip::handle_client_send() : " + "Unknown exception. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(600087, formatter.str(), __FILE__, __LINE__ ); + + //set last status + status = FINALIZE; + } + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_client_send(const boost::thread::id thread_id) : return_value = %d. thread id : %d."); + formatter % status % boost::this_thread::get_id(); + putLogDebug(600130, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + return status; + } + + //! call from client disconnect event. use upstream thread and downstream thread. + //! @param[in] upstream and downstream thread id( check! one thread one event! ) + //! @return session use EVENT mode + protocol_module_base::EVENT_TAG protocol_module_ip::handle_client_disconnect( + const boost::thread::id thread_id) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("in/out_function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_client_disconnect(const boost::thread::id thread_id) : return_value = %d. thread id : %d."); + formatter % FINALIZE % boost::this_thread::get_id(); + putLogDebug(600131, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + return FINALIZE; + } + + //! call from sorry mode event. use upstream thread and downstream thread + //! @param[in] upstream and downstream thread id( check! one thread one event and first time call pattern ) + //! @return session use EVENT mode + protocol_module_base::EVENT_TAG protocol_module_ip::handle_sorry_enable( + const boost::thread::id thread_id) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("in_function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_sorry_enable(const boost::thread::id thread_id) : thread_id = %d."); + formatter % boost::this_thread::get_id(); + putLogDebug(600132, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + EVENT_TAG status = FINALIZE; + thread_data_ptr session_data_ptr; + + try + { + { + boost::mutex::scoped_lock sclock(session_thread_data_map_mutex); + + session_thread_data_map_it session_thread_it = session_thread_data_map.find(thread_id); + if (unlikely(session_thread_it == session_thread_data_map.end() || session_thread_it->second == NULL)) + { + boost::format formatter("Invalid thread id. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(600088, formatter.str(), __FILE__, __LINE__ ); + throw -1; + } + + session_data_ptr = session_thread_it->second; + } + + + //up thread + if (session_data_ptr->thread_division == THREAD_DIVISION_UP_STREAM) + { + //accept_end_flag is off + if (session_data_ptr->accept_end_flag == ACCEPT_END_FLAG_OFF) + { + //set return status + status = ACCEPT; + } + //accept_end_flag is on + else + { + //sorry flag is on + if (session_data_ptr->sorry_flag == SORRY_FLAG_ON) + { + //data state is HTTP_START or HTTP_HEADER + if (session_data_ptr->data_state == HTTP_START + || session_data_ptr->data_state ==HTTP_HEADER) + { + //set switch flag on + session_data_ptr->switch_flag = SWITCH_FLAG_ON; + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_sorry_enable(const boost::thread::id thread_id) : SWITCH_FLAG_ON. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogDebug(600133, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + //set return status + status = SORRYSERVER_DISCONNECT; + } + //data state is HTTP_BODY or UNKNOWN + else + { + //set return status + status = session_data_ptr->last_status; + } + } + //sorry flag is off + else + { + //data state is HTTP_START or HTTP_HEADER + if (session_data_ptr->data_state == HTTP_START + || session_data_ptr->data_state ==HTTP_HEADER) + { + //set switch flag on + session_data_ptr->switch_flag = SWITCH_FLAG_ON; + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_sorry_enable(const boost::thread::id thread_id) : SWITCH_FLAG_ON. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogDebug(600134, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + } + //data state is HTTP_BODY or UNKNOWN + else + { + //set ebd flag on + session_data_ptr->end_flag = END_FLAG_ON; + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_sorry_enable(const boost::thread::id thread_id) : END_FLAG_ON. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogDebug(600135, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + } + + //set return status + status = REALSERVER_DISCONNECT; + } + } + } + //down thread + else + { + //sorry flag is on + if (session_data_ptr->sorry_flag == SORRY_FLAG_ON) + { + //set return status + status = session_data_ptr->last_status; + } + //sorry flag is off + else + { + //data state is HTTP_START and data size is 0 + if (session_data_ptr->data_state == HTTP_START + && session_data_ptr->data_length == 0) + { + //set return status + status = SORRYSERVER_RECV; + } + //data state is HTTP_START and data size > 0 + else if (session_data_ptr->data_state == HTTP_START + && session_data_ptr->data_length > 0) + { + //set return status + status = REALSERVER_DISCONNECT; + } + //data state is HTTP_HEADER or HTTP_BODY + else if (session_data_ptr->data_state == HTTP_HEADER + || session_data_ptr->data_state == HTTP_BODY) + { + //set switch flag on + session_data_ptr->switch_flag = SWITCH_FLAG_ON; + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_sorry_enable(const boost::thread::id thread_id) : SWITCH_FLAG_ON. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogDebug(600136, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + //set return status + status = session_data_ptr->last_status; + } + //other + else + { + //set return status + status = REALSERVER_DISCONNECT; + } + } + } + + //set sorry flag on + session_data_ptr->sorry_flag = SORRY_FLAG_ON; + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_sorry_enable(const boost::thread::id thread_id) : SORRY_FLAG_ON. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogDebug(600137, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + //set last status + session_data_ptr->last_status = status; + + } + catch (int e) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_sorry_enable() : catch exception e = %d. thread id : %d."); + formatter % e % boost::this_thread::get_id(); + putLogDebug(600138, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + //set return status + status = FINALIZE; + } + catch (std::exception& ex) + { + std::cerr << "protocol_module_ip::handle_sorry_enable() : exception : error = " << ex.what() << "." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_sorry_enable() : exception : error = %s. thread id : %d."); + formatter % ex.what() % boost::this_thread::get_id(); + putLogError(600089, formatter.str(), __FILE__, __LINE__ ); + + //set return status + status = FINALIZE; + } + catch (...) + { + std::cerr << "protocol_module_ip::handle_sorry_enable() : Unknown exception." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG " + "protocol_module_ip::handle_sorry_enable() : " + "Unknown exception. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(600090, formatter.str(), __FILE__, __LINE__ ); + + //set return status + status = FINALIZE; + } + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_sorry_enable(const boost::thread::id thread_id) : return_value = %d. thread id : %d."); + formatter % status % boost::this_thread::get_id(); + putLogDebug(600139, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + return status; + } + + //! call from sorry mode disable. use upstream thread and downstream thread. + //! @param[in] upstream and downstream thread id( check! one thread one event ) + //! @return session use EVENT mode + protocol_module_base::EVENT_TAG protocol_module_ip::handle_sorry_disable( + const boost::thread::id thread_id) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("in_function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_sorry_disable(const boost::thread::id thread_id) : thread_id = %d."); + formatter % boost::this_thread::get_id(); + putLogDebug(600140, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + EVENT_TAG status = FINALIZE; + thread_data_ptr session_data_ptr; + + try + { + { + boost::mutex::scoped_lock sclock(session_thread_data_map_mutex); + + session_thread_data_map_it session_thread_it = session_thread_data_map.find(thread_id); + if (unlikely(session_thread_it == session_thread_data_map.end() || session_thread_it->second == NULL)) + { + boost::format formatter("Invalid thread id. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(600091, formatter.str(), __FILE__, __LINE__ ); + throw -1; + } + + session_data_ptr = session_thread_it->second; + } + + //up thread + if (session_data_ptr->thread_division == THREAD_DIVISION_UP_STREAM) + { + //accept_end_flag is off + if (session_data_ptr->accept_end_flag == ACCEPT_END_FLAG_OFF) + { + //set return status + status =ACCEPT; + } + //accept_end_flag is on + else + { + //sorry flag is on + if (session_data_ptr->sorry_flag == SORRY_FLAG_ON) + { + ///data state is HTTP_START or HTTP_HEADER + if (session_data_ptr->data_state == HTTP_START + || session_data_ptr->data_state ==HTTP_HEADER) + { + //set switch flag on + session_data_ptr->switch_flag = SWITCH_FLAG_ON; + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_sorry_disable(const boost::thread::id thread_id) : SWITCH_FLAG_ON. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogDebug(600141, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + } + //data state is HTTP_BODY or UNKNOWN + else + { + //set end flag on + session_data_ptr->end_flag = END_FLAG_ON; + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_sorry_disable(const boost::thread::id thread_id) : END_FLAG_ON. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogDebug(600142, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + } + + //set return status + status = SORRYSERVER_DISCONNECT; + + } + //sorry flag is off + else + { + //data state is HTTP_START or HTTP_HEADER + if (session_data_ptr->data_state == HTTP_START + || session_data_ptr->data_state ==HTTP_HEADER) + { + //set switch flag on + session_data_ptr->switch_flag = SWITCH_FLAG_ON; + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_sorry_disable(const boost::thread::id thread_id) : SWITCH_FLAG_ON. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogDebug(600143, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + //set return status + status = REALSERVER_DISCONNECT; + } + //data state is HTTP_BODY or UNKNOWN + else + { + //set return status + status = session_data_ptr->last_status; + } + } + } + } + //down thread + else + { + //sorry flag is off + if (session_data_ptr->sorry_flag == SORRY_FLAG_OFF) + { + //set return status + status = session_data_ptr->last_status; + } + //sorry flag is on + else + { + //data state is HTTP_START and data size is 0 + if (session_data_ptr->data_state == HTTP_START + && session_data_ptr->data_length == 0) + { + //set return status + status = REALSERVER_RECV; + } + //data state is HTTP_START and data size > 0 + else if (session_data_ptr->data_state == HTTP_START + && session_data_ptr->data_length > 0) + { + //set return status + status = SORRYSERVER_DISCONNECT; + } + //data state is HTTP_HEADER or HTTP_BODY + else if (session_data_ptr->data_state == HTTP_HEADER + || session_data_ptr->data_state == HTTP_BODY) + { + //set switch flag on + session_data_ptr->switch_flag = SWITCH_FLAG_ON; + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_sorry_disable(const boost::thread::id thread_id) : SWITCH_FLAG_ON. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogDebug(600144, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + //set return status + status = session_data_ptr->last_status; + } + //other + else + { + //set return status + status = SORRYSERVER_DISCONNECT; + } + } + } + + //set sorry flag off + session_data_ptr->sorry_flag = SORRY_FLAG_OFF; + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_sorry_disable(const boost::thread::id thread_id) : SORRY_FLAG_OFF. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogDebug(600145, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + //set last status + session_data_ptr->last_status = status; + } + catch (int e) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_sorry_disable() : catch exception e = %d. thread id : %d."); + formatter % e % boost::this_thread::get_id(); + putLogDebug(600146, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + //set last status + status = FINALIZE; + } + catch (std::exception& ex) + { + std::cerr << "protocol_module_ip::handle_sorry_disable() : exception : error = " << ex.what() << "." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_sorry_disable() : exception : error = %s. thread id : %d."); + formatter % ex.what() % boost::this_thread::get_id(); + putLogError(600092, formatter.str(), __FILE__, __LINE__ ); + + //set last status + status = FINALIZE; + } + catch (...) + { + std::cerr << "protocol_module_ip::handle_sorry_disable() : Unknown exception." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG " + "protocol_module_ip::handle_sorry_disable() : " + "Unknown exception. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(600093, formatter.str(), __FILE__, __LINE__ ); + + //set last status + status = FINALIZE; + } + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_sorry_disable(const boost::thread::id thread_id) : return_value = %d. thread id : %d."); + formatter % status % boost::this_thread::get_id(); + putLogDebug(600147, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + return status; + } + + //! call from realserver disconnect. use upstream thread and downstream thread + //! @param[in] upstream and downstream thread id( check! one thread one event ) + //! @param[in] disconnected realserver endpoint. + //! @return session use EVENT mode + protocol_module_base::EVENT_TAG protocol_module_ip::handle_realserver_disconnect( + const boost::thread::id thread_id, const boost::asio::ip::tcp::endpoint & rs_endpoint) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("in_function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_realserver_disconnect(const boost::thread::id thread_id, const boost::asio::ip::tcp::endpoint & rs_endpoint) : " + "thread_id = %d, rs_endpoint = [%s]:%d."); + formatter % thread_id % rs_endpoint.address().to_string() % rs_endpoint.port(); + putLogDebug(600148, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + EVENT_TAG status = FINALIZE; + thread_data_ptr session_data_ptr; + + try + { + { + boost::mutex::scoped_lock sclock(session_thread_data_map_mutex); + + session_thread_data_map_it session_thread_it = session_thread_data_map.find(thread_id); + if (unlikely(session_thread_it == session_thread_data_map.end() || session_thread_it->second == NULL)) + { + boost::format formatter("Invalid thread id. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(600094, formatter.str(), __FILE__, __LINE__ ); + throw -1; + } + + session_data_ptr = session_thread_it->second; + } + + + //up thread + if (session_data_ptr->thread_division == THREAD_DIVISION_UP_STREAM) + { + //end flag is on + if (session_data_ptr->end_flag == END_FLAG_ON) + { + //set return status + status = CLIENT_RECV; + } + //end flag is off + else + { + //switch flag is on + if (session_data_ptr->switch_flag == SWITCH_FLAG_ON) + { + //sorry flag is on + if (session_data_ptr->sorry_flag == SORRY_FLAG_ON) + { + //set return status + status = SORRYSERVER_SELECT; + } + //sorry flag is off + else + { + //set return status + status = CLIENT_RECV; + } + + //set switch flag off + session_data_ptr->switch_flag = SWITCH_FLAG_OFF; + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_realserver_disconnect(const boost::thread::id thread_id, const boost::asio::ip::tcp::endpoint &" "rs_endpoint) : SWITCH_FLAG_OFF. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogDebug(600149, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + } + //switch flag is off + else + { + //set return status + status = CLIENT_RECV; + } + } + } + //down thread + else + { + //set return status + status = CLIENT_DISCONNECT; + } + + //set last status + session_data_ptr->last_status = status; + } + catch (int e) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_realserver_disconnect() : catch exception e = %d. thread id : %d."); + formatter % e % boost::this_thread::get_id(); + putLogDebug(600150, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + //set return status + status = FINALIZE; + } + catch (std::exception& ex) + { + std::cerr << "protocol_module_ip::handle_realserver_disconnect() : exception : error = " << ex.what() << "." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_realserver_disconnect() : exception : error = %s. thread id : %d."); + formatter % ex.what() % boost::this_thread::get_id(); + putLogError(600095, formatter.str(), __FILE__, __LINE__ ); + + //set return status + status = FINALIZE; + } + catch (...) + { + std::cerr << "protocol_module_ip::handle_realserver_disconnect() : Unknown exception." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG " + "protocol_module_ip::handle_realserver_disconnect() : " + "Unknown exception. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(600096, formatter.str(), __FILE__, __LINE__ ); + + //set return status + status = FINALIZE; + } + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_realserver_disconnect(const boost::thread::id thread_id, " + "const boost::asio::ip::tcp::endpoint & rs_endpoint) : return_value = %d. thread id : %d."); + formatter % status % boost::this_thread::get_id(); + putLogDebug(600151, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + return status; + } + + //! call from sorry server disconnect. use upstraem thread and downstream thread + //! @param[in] upstream and downstream thread id( check! one thread one event ) + //! @param[in] disconnect sorryserver endpoint + //! @return session use EVENT mode + //! @return session use EVENT mode + protocol_module_base::EVENT_TAG protocol_module_ip::handle_sorryserver_disconnect( + const boost::thread::id thread_id, const boost::asio::ip::tcp::endpoint & sorry_endpoint) + { + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("in_function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_sorryserver_disconnect(const boost::thread::id thread_id, const boost::asio::ip::tcp::endpoint & sorry_endpoint) : " + "thread_id = %d, sorry_endpoint = [%s]:%d."); + formatter % thread_id % sorry_endpoint.address().to_string() % sorry_endpoint.port(); + putLogDebug(600152, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + EVENT_TAG status = FINALIZE; + thread_data_ptr session_data_ptr; + + try + { + { + boost::mutex::scoped_lock sclock(session_thread_data_map_mutex); + + session_thread_data_map_it session_thread_it = session_thread_data_map.find(thread_id); + if (unlikely(session_thread_it == session_thread_data_map.end() || session_thread_it->second == NULL)) + { + boost::format formatter("Invalid thread id. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(600097, formatter.str(), __FILE__, __LINE__ ); + throw -1; + } + + session_data_ptr = session_thread_it->second; + } + + //up thread + if (session_data_ptr->thread_division == THREAD_DIVISION_UP_STREAM) + { + //end flag is on + if (session_data_ptr->end_flag == END_FLAG_ON) + { + //set return status + status = CLIENT_RECV; + } + //end flag is off + else + { + //switch flag is on + if (session_data_ptr->switch_flag == SWITCH_FLAG_ON) + { + //sorry flag is on + if (session_data_ptr->sorry_flag == SORRY_FLAG_ON) + { + //set return status + status = SORRYSERVER_SELECT; + } + //sorry flag is off + else + { + //set return status + status = CLIENT_RECV; + } + + //set switch flag off + session_data_ptr->switch_flag = SWITCH_FLAG_OFF; + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_sorryserver_disconnect(const boost::thread::id thread_id, const boost::asio::ip::tcp::endpoint &" "sorry_endpoint) : SWITCH_FLAG_OFF. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogDebug(600153, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + } + //switch flag is off + else + { + //set return status + status = CLIENT_RECV; + } + } + } + //down thread + else + { + //set return status + status = CLIENT_DISCONNECT; + } + + //set last status + session_data_ptr->last_status = status; + + } + catch (int e) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_sorryserver_disconnect() : catch exception e = %d. thread id : %d."); + formatter % e % boost::this_thread::get_id(); + putLogDebug(600154, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + //set return status + status = FINALIZE; + } + + catch (std::exception& ex) + { + std::cerr << "protocol_module_ip::handle_sorryserver_disconnect() : exception : error = " << ex.what() << "." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_sorryserver_disconnect() : exception : error = %s. thread id : %d."); + formatter % ex.what() % boost::this_thread::get_id(); + putLogError(600098, formatter.str(), __FILE__, __LINE__ ); + + //set return status + status = FINALIZE; + } + catch (...) + { + std::cerr << "protocol_module_ip::handle_sorryserver_disconnect() : Unknown exception." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG " + "protocol_module_ip::handle_sorryserver_disconnect() : " + "Unknown exception. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(600099, formatter.str(), __FILE__, __LINE__ ); + + //set return status + status = FINALIZE; + } + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_sorryserver_disconnect(const boost::thread::id thread_id, " + "const boost::asio::ip::tcp::endpoint & sorry_endpoint) : return_value = %d. thread id : %d."); + formatter % status % boost::this_thread::get_id(); + putLogDebug(600155, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + return status; + } + + //! call from realserver disconnect. use upstream thread and downstream thread. + //! @param[in] upstream and downstream thread id( check! one thread one event ) + //! @param[in] disconnect realserver endpoint + //! @return session use EVENT mode. + protocol_module_base::EVENT_TAG protocol_module_ip::handle_realserver_close( + const boost::thread::id thread_id, const boost::asio::ip::udp::endpoint & rs_endpoint) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("in/out_function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "handle_realserver_close(const boost::thread::id thread_id, " + "boost::asio::ip::udp::endpoint& rs_endpoint) : " + "return_value = %d. thread id : %d."); + formatter % STOP % boost::this_thread::get_id(); + putLogDebug(600156, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + return STOP; + } + + + bool protocol_module_ip::get_data_from_recvbuffer( + thread_data_ptr data_ptr, const boost::array& recvbuffer, const size_t recvlen) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("in_function : bool protocol_module_ip::get_data_from_recvbuffer(" + "thread_data_ptr data_ptr, const boost::array& recvbuffer, " + "const size_t& recvlen) : thread_id = %d."); + formatter % boost::this_thread::get_id(); + putLogDebug(600157, formatter.str(), __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + + char* tmpbuffer = NULL; + + //pointer volidate check + if (unlikely(data_ptr == NULL || data_ptr->data_buffer == NULL)) + { + boost::format formatter("Invalid pointer. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(600100, formatter.str(), __FILE__, __LINE__ ); + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("out_function : bool protocol_module_ip::get_data_from_recvbuffer(" + "thread_data_ptr data_ptr, const boost::array& recvbuffer, " + "const size_t& recvlen) : return_value = false. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogDebug(600158, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + return false; + } + + + //the new data can append to buffer directly + if (data_ptr->data_buffer_size - data_ptr->data_length - data_ptr->data_offset >= recvlen) + { + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + dump_memory(recvbuffer.data(), recvlen, datadump); + boost::format formatter( + "function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "get_data_from_recvbuffer() : before memcpy (data dump) : " + "data begin = 0, data_size = %d, data = %s"); + formatter % recvlen % datadump; + putLogDebug(600159, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + memcpy(data_ptr->data_buffer + data_ptr->data_offset + data_ptr->data_length, recvbuffer.data(), recvlen); + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + dump_memory(data_ptr->data_buffer + data_ptr->data_offset + data_ptr->data_length, recvlen, datadump); + boost::format formatter( + "function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "get_data_from_recvbuffer() : after memcpy (data dump) : " + "data begin = 0, data_size = %d, data = %s"); + formatter % recvlen % datadump; + putLogDebug(600160, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + data_ptr->data_length += recvlen; + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("out_function : bool protocol_module_ip::get_data_from_recvbuffer(" + "thread_data_ptr data_ptr, const boost::array& recvbuffer, " + "const size_t& recvlen) : return_value = true. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogDebug(600161, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + return true; + } + else + { + //the new data can append to buffer through moving orignal data + if (data_ptr->data_buffer_size - data_ptr->data_length >= recvlen) + { + memmove(data_ptr->data_buffer, data_ptr->data_buffer + data_ptr->data_offset, data_ptr->data_length); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + dump_memory(recvbuffer.data(), recvlen, datadump); + boost::format formatter( + "function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "get_data_from_recvbuffer() : before memcpy (data dump) : " + "data begin = 0, data_size = %d, data = %s"); + formatter % recvlen % datadump; + putLogDebug(600162, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + memcpy(data_ptr->data_buffer + data_ptr->data_length, recvbuffer.data(), recvlen); + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + dump_memory(data_ptr->data_buffer + data_ptr->data_length, recvlen, datadump); + boost::format formatter( + "function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "get_data_from_recvbuffer() : after memcpy (data dump) : " + "data begin = 0, data_size = %d, data = %s"); + formatter % recvlen % datadump; + putLogDebug(600163, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + data_ptr->data_offset = 0; + data_ptr->data_length += recvlen; + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("out_function : bool protocol_module_ip::get_data_from_recvbuffer(" + "thread_data_ptr data_ptr, const boost::array& recvbuffer, " + "const size_t& recvlen) : return_value = true. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogDebug(600164, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + return true; + } + else + { + //not allowed to realloc new buffer who's size is larger than the max size + if (data_ptr->data_buffer_size >= MAX_IP_MODULE_BUFFER_SIZE + || data_ptr->data_buffer_size + recvlen >= MAX_IP_MODULE_BUFFER_SIZE) + { + boost::format formatter("Buffer size is bigger than Max size. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(600101, formatter.str(), __FILE__, __LINE__ ); + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("out_function : bool protocol_module_ip::get_data_from_recvbuffer(" + "thread_data_ptr data_ptr, const boost::array& recvbuffer, " + "const size_t& recvlen) : return_value = false. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogDebug(600165, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + return false; + } + else + { + try + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("new : address = &(%d), size = %lu."); + formatter % static_cast(tmpbuffer) % MAX_IP_MODULE_BUFFER_SIZE; + putLogDebug(600166, formatter.str(), __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + + //alloc a new buffer who's size is max + tmpbuffer = new char[MAX_IP_MODULE_BUFFER_SIZE]; + } + catch (const std::bad_alloc&) //memory alloc fail + { + std::cerr << "protocol_module_ip::get_data_from_recvbuffer() : exception : Could not allocate memory." << std::endl; + boost::format formatter("Could not allocate memory. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(600102, formatter.str(), __FILE__, __LINE__); + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("out_function : bool protocol_module_ip::get_data_from_recvbuffer(" + "thread_data_ptr data_ptr, const boost::array& recvbuffer, " + "const size_t& recvlen) : return_value = false. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogDebug(600167, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + return false; + } + + memset(tmpbuffer, 0, MAX_IP_MODULE_BUFFER_SIZE); + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + dump_memory(data_ptr->data_buffer+data_ptr->data_offset, data_ptr->data_length, datadump); + boost::format formatter( + "function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "get_data_from_recvbuffer() : before memcpy (data dump) : " + "data begin = 0, data_size = %d, data = %s"); + formatter % data_ptr->data_length % datadump; + putLogDebug(600168, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + //copy old data to new buffer + memcpy(tmpbuffer, data_ptr->data_buffer+data_ptr->data_offset, data_ptr->data_length); + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + dump_memory(tmpbuffer, data_ptr->data_length, datadump); + boost::format formatter( + "function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "get_data_from_recvbuffer() : after memcpy (data dump) : " + "data begin = 0, data_size = %d, data = %s"); + formatter % data_ptr->data_length % datadump; + putLogDebug(600169, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("delete : address = &(%d)."); + formatter % static_cast(data_ptr->data_buffer); + putLogDebug(600170, formatter.str(), __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + + //release old memory + delete [] data_ptr->data_buffer; + data_ptr->data_buffer = tmpbuffer; + data_ptr->data_offset = 0; + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + dump_memory(recvbuffer.data(), recvlen, datadump); + boost::format formatter( + "function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "get_data_from_recvbuffer() : before memcpy (data dump) : " + "data begin = 0, data_size = %d, data = %s"); + formatter % recvlen % datadump; + putLogDebug(600171, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + //append new data + memcpy(data_ptr->data_buffer+data_ptr->data_length, recvbuffer.data(), recvlen); + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + dump_memory(data_ptr->data_buffer+data_ptr->data_length, recvlen, datadump); + boost::format formatter( + "function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "get_data_from_recvbuffer() : after memcpy (data dump) : " + "data begin = 0, data_size = %d, data = %s"); + formatter % recvlen % datadump; + putLogDebug(600172, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + data_ptr->data_length += recvlen; + data_ptr->data_buffer_size = MAX_IP_MODULE_BUFFER_SIZE ; + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("out_function : bool protocol_module_ip::get_data_from_recvbuffer(" + "thread_data_ptr data_ptr, const boost::array& recvbuffer, " + "const size_t& recvlen) : return_value = true. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogDebug(600173, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + return true; + + } + } + } + } + + bool protocol_module_ip::put_data_into_sendbuffer( + thread_data_ptr data_ptr, boost::array& sendbuffer, size_t& datalen) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("in_function : bool protocol_module_ip::put_data_to_sendbuffer(" + "thread_data_ptr data_ptr, boost::array& sendbuffer, " + "size_t& datalen) : thread_id = %d."); + formatter % boost::this_thread::get_id(); + putLogDebug(600174, formatter.str(), __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + + size_t sendbuffer_rest_size = 0; + size_t new_offset = 0; + + if (unlikely(data_ptr == NULL || data_ptr->data_buffer == NULL || data_ptr->buffer_sequence.empty())) + { + boost::format formatter("Invalid pointer. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(600103, formatter.str(), __FILE__, __LINE__ ); + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("out_function : bool protocol_module_ip::put_data_to_sendbuffer(" + "thread_data_ptr data_ptr, boost::array& sendbuffer, " + "size_t& datalen) : return_value = false. thread_id = %d."); + formatter % boost::this_thread::get_id(); + putLogDebug(600175, formatter.str(), __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + + return false; + } + + sendbuffer_rest_size = sendbuffer.size(); + datalen = 0; + + //buffer_sequence loop + //copy data to send buffer until send buffer is full + while (data_ptr->buffer_sequence.size() > 0) + { + std::pair buffer_element = data_ptr->buffer_sequence.front(); + //sendbuffer rest size id bigger than copy possible size + if (buffer_element.second <= sendbuffer_rest_size) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + dump_memory(buffer_element.first, buffer_element.second, datadump); + boost::format formatter( + "function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "put_data_to_sendbuffer() : before memcpy (data dump) : " + "data begin = 0, data_size = %d, data = %s"); + formatter % buffer_element.second % datadump; + putLogDebug(600176, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + //copy data to send buffer + memcpy(sendbuffer.c_array() + datalen, buffer_element.first, buffer_element.second); + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + dump_memory(sendbuffer.c_array() + datalen, buffer_element.second, datadump); + boost::format formatter( + "function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "put_data_to_sendbuffer() : after memcpy (data dump) : " + "data begin = 0, data_size = %d, data = %s"); + formatter % buffer_element.second % datadump; + putLogDebug(600177, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + datalen += buffer_element.second; + sendbuffer_rest_size -= buffer_element.second; + + //it is the last item of the sequence + if (data_ptr->buffer_sequence.size() == 1) + { + //set data position + new_offset = buffer_element.first + buffer_element.second - data_ptr->data_buffer; + data_ptr->current_message_rest_size -= (new_offset - data_ptr->data_offset); + data_ptr->data_length -= (new_offset - data_ptr->data_offset); + data_ptr->data_offset = new_offset; + } + + + //delete the item + data_ptr->buffer_sequence.pop_front(); + } + //sendbuffer rest size is too small + else + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + dump_memory(buffer_element.first, sendbuffer_rest_size, datadump); + boost::format formatter( + "function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "put_data_to_sendbuffer() : before memcpy (data dump) : " + "data begin = 0, data_size = %d, data = %s"); + formatter % sendbuffer_rest_size % datadump; + putLogDebug(600178, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + //copy data to send buffer + memcpy(sendbuffer.c_array() + datalen, buffer_element.first, sendbuffer_rest_size); + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + dump_memory(sendbuffer.c_array() + datalen, sendbuffer_rest_size, datadump); + boost::format formatter( + "function : protocol_module_base::EVENT_TAG protocol_module_ip::" + "put_data_to_sendbuffer() : after memcpy (data dump) : " + "data begin = 0, data_size = %d, data = %s"); + formatter % sendbuffer_rest_size % datadump; + putLogDebug(600179, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + datalen += sendbuffer_rest_size; + + //set item position + buffer_element.first += sendbuffer_rest_size; + buffer_element.second -= sendbuffer_rest_size; + sendbuffer_rest_size = 0; + break; + } + } + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("out_function : bool protocol_module_ip::put_data_to_sendbuffer(" + "thread_data_ptr data_ptr, boost::array& sendbuffer, " + "size_t& datalen) : return_value = true. thread_id = %d."); + formatter % boost::this_thread::get_id(); + putLogDebug(600180, formatter.str(), __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + + return true; + } + + + + + //! call from put_data_to_buffer_with_x_forwarded_for(). get x_forwarded_for header's offset and length + //! if the buffer isn't include x_forwarded_for header, create a new one + //! @param[in] buffer + //! @param[in] buffer_len + //! @param[out] x_forwarded_for_insert_pos + //! @param[out] x_forwarded_for_context + //! @return true:create a new x_forwarded_for header + //! false: edit old one + bool protocol_module_ip::create_x_forwarded_for(const std::string& client_endpoint, + const char* buffer, + const size_t buffer_len, + size_t& x_forwarded_for_insert_pos, + std::string& x_forwarded_for_context) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("in_function : bool protocol_module_ip::create_x_forwarded_for(" + "const std::string& client_endpoint, const char* buffer, const size_t buffer_len, " + "size_t& x_forwarded_for_insert_pos, std::string& x_forwarded_for_context) : thread_id = %d."); + formatter % boost::this_thread::get_id(); + putLogDebug(600181, formatter.str(), __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + + bool find_ret = false; + size_t x_forwarded_for_offset = 0; + size_t x_forwarded_for_len = 0; + size_t http_header_all_offset = 0; + size_t http_header_all_len = 0; + const char* X_FORWARDED_FOR = "X-Forwarded-For"; + + //search "X-Forwared-For" header + find_ret = http_utility::find_http_header_x_forwarded_for(buffer, buffer_len, + x_forwarded_for_offset, x_forwarded_for_len); + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : bool protocol_module_ip::create_x_forwarded_for() : " + "call find_http_header_x_forwarded_for : " + "return_value = %d. thread id : %d."); + formatter % static_cast(find_ret) % boost::this_thread::get_id(); + putLogDebug(600182, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + //search "X-Forwared-For" result is OK + if (find_ret) + { + //create "X-Forwared-For" string + x_forwarded_for_insert_pos = x_forwarded_for_offset + x_forwarded_for_len; + x_forwarded_for_context = ", "; + x_forwarded_for_context += client_endpoint; + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("out_function : bool protocol_module_ip::create_x_forwarded_for(" + "const std::string& client_endpoint, const char* buffer, const size_t buffer_len, " + "size_t& x_forwarded_for_insert_pos, std::string& x_forwarded_for_context) : return_value = false. thread_id = %d."); + formatter % boost::this_thread::get_id(); + putLogDebug(600183, formatter.str(), __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + + return false; + } + + //create a new one + //because state is HTTP_HEADER, find_http_header_all must be return true + http_utility::find_http_header_all(buffer, buffer_len, http_header_all_offset, http_header_all_len); + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : bool protocol_module_ip::create_x_forwarded_for() : " + "call find_http_header_all : " + "return_value = true. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogDebug(600184, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + //create "X-Forwared-For" string + x_forwarded_for_insert_pos = http_header_all_offset; + x_forwarded_for_context = X_FORWARDED_FOR; + x_forwarded_for_context += ": "; + x_forwarded_for_context += client_endpoint; + x_forwarded_for_context += "\r\n"; + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("out_function : bool protocol_module_ip::create_x_forwarded_for(" + "const std::string& client_endpoint, const char* buffer, const size_t buffer_len, " + "size_t& x_forwarded_for_insert_pos, std::string& x_forwarded_for_context) : return_value = true. thread_id = %d."); + formatter % boost::this_thread::get_id(); + putLogDebug(600185, formatter.str(), __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + + return true; + } + + + +}//namesapce l7vsd + +extern "C" l7vs::protocol_module_base* + create_module() +{ + return dynamic_cast(new l7vs::protocol_module_ip()); +} + +extern "C" void + destroy_module( l7vs::protocol_module_base* in ) +{ + delete in; +} diff --git a/module/protocol/protocol_module_ip.h b/module/protocol/protocol_module_ip.h new file mode 100644 index 00000000..cd19432c --- /dev/null +++ b/module/protocol/protocol_module_ip.h @@ -0,0 +1,193 @@ +/* + * @file protocol_module_ip.h + * @brief protocol module ip header file. + * + * L7VSD: Linux Virtual Server for Layer7 Load Balancing + * Copyright (C) 2009 NTT COMWARE Corporation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + *register_replication_area_unlock + **********************************************************************/ + +#include +#include "ip_protocol_module_base.h" +#include "ip_session_data_processor.h" +#include "ip_replication_data_processor.h" + +#ifndef PROTOCOL_MODULE_IP_H +#define PROTOCOL_MODULE_IP_H + +#define MAX_FORWARD_FOR_SIZE 36 +#define MAX_OPTION_SIZE 128 +#define REALSERVER_CONNECT_FAILED_COUNT (3) +#define MAX_IP_MODULE_BUFFER_SIZE (4 * 1024* 1024 + MAX_BUFFER_SIZE) +/* 2^31 + 2^29 - 2^25 + 2^22 - 2^19 - 2^16 + 1 */ +#define GOLDEN_RATIO_PRIME 0x9e370001UL + +namespace l7vs +{ + + class protocol_module_ip : public ip_protocol_module_base + { + public: + enum DATA_STATE_TAG + { + HTTP_START = 0, + HTTP_HEADER, + HTTP_BODY, + UNKNOWN + }; + + typedef std::deque > buffer_deque; + struct session_thread_data_ip + { + boost::thread::id thread_id; + boost::thread::id pair_thread_id; + int thread_division; + int end_flag; + int accept_end_flag; + int sorry_flag; + int switch_flag; + size_t data_buffer_size; + size_t data_length; + size_t data_offset; + size_t current_message_rest_size; + char* data_buffer; + boost::array forwarded_for_buffer; + int realserver_connect_failed_count; + int ip_hash; + boost::asio::ip::tcp::endpoint client_endpoint; + DATA_STATE_TAG data_state; + EVENT_TAG last_status; + buffer_deque buffer_sequence; + }; + + typedef boost::shared_ptr thread_data_ptr; + typedef std::map::iterator session_thread_data_map_it; + protected: + int forwarded_for; + int reschedule; + int timeout; + int realserver_connect_failed_max_count; + boost:: array sorry_uri ; + std::map session_thread_data_map; + boost::mutex session_data_mutex; + boost::mutex session_thread_data_map_mutex; + + ip_replication_data_processor* replication_data_processor; + ip_session_data_processor* ip_data_processor; + + unsigned int l7vs_ip_service_calc_hash(const boost::asio::ip::tcp::endpoint& cl_endpoint) + { + unsigned int hash = 0; + if (cl_endpoint.address().is_v4()) + { + hash= cl_endpoint.address().to_v4().to_ulong() * GOLDEN_RATIO_PRIME; + } + else + { + boost::asio::ip::address_v6::bytes_type v6_bytes = cl_endpoint.address().to_v6().to_bytes(); + boost::asio::ip::address_v4::bytes_type v4_bytes = {{v6_bytes[12],v6_bytes[13],v6_bytes[14],v6_bytes[15]}}; + boost::asio::ip::address_v4::address_v4 v4_address = boost::asio::ip::address_v4::address_v4(v4_bytes); + hash= v4_address.to_ulong() * GOLDEN_RATIO_PRIME; + + } + return hash >> 32 - HASH_TABLE_BITS; + } + + + public: + static const std::string MODULE_NAME; + + static const int THREAD_DIVISION_UP_STREAM; + static const int THREAD_DIVISION_DOWN_STREAM; + + static const int END_FLAG_OFF; + static const int END_FLAG_ON; + + static const int ACCEPT_END_FLAG_OFF; + static const int ACCEPT_END_FLAG_ON; + + static const int SORRY_FLAG_ON; + static const int SORRY_FLAG_OFF; + + static const int SWITCH_FLAG_OFF; + static const int SWITCH_FLAG_ON; + + static const int FORWARDED_FOR_OFF; + static const int FORWARDED_FOR_ON; + + public: + protocol_module_ip(); + ~protocol_module_ip(); + bool is_tcp(); + bool is_udp(); + void replication_interrupt(); + void initialize(rs_list_itr_func_type inlist_begin, + rs_list_itr_func_type inlist_end, + rs_list_itr_next_func_type inlist_next, + boost::function< void( void ) > inlist_lock, + boost::function< void( void ) > inlist_unlock); + void finalize(); + bool is_use_sorry(); + check_message_result check_parameter(const std::vector& args); + check_message_result set_parameter(const std::vector& args); + check_message_result add_parameter(const std::vector& args); + void handle_rslist_update(); + void register_schedule(tcp_schedule_func_type inschedule); + void register_schedule(udp_schedule_func_type inschedule); + EVENT_TAG handle_session_initialize(const boost::thread::id up_thread_id, const boost::thread::id down_thread_id, const boost::asio::ip::tcp::endpoint& client_endpoint_tcp, const boost::asio::ip::udp::endpoint& client_endpoint_udp); + EVENT_TAG handle_session_finalize(const boost::thread::id up_thread_id, const boost::thread::id down_thread_id); + EVENT_TAG handle_accept(const boost::thread::id thread_id); + EVENT_TAG handle_client_recv(const boost::thread::id thread_id, const boost::array& recvbuffer, const size_t recvlen); + EVENT_TAG handle_realserver_select(const boost::thread::id thread_id, boost::asio::ip::tcp::endpoint& rs_endpoint); + EVENT_TAG handle_realserver_select(const boost::thread::id thread_id, boost::asio::ip::udp::endpoint& rs_endpoint, boost::array& sendbuffer, size_t& datalen); + EVENT_TAG handle_realserver_connect(const boost::thread::id thread_id, boost::array& sendbuffer, size_t& datalen); + EVENT_TAG handle_realserver_connection_fail(const boost::thread::id thread_id, const boost::asio::ip::tcp::endpoint& rs_endpoint); + EVENT_TAG handle_realserver_send(const boost::thread::id thread_id); + EVENT_TAG handle_sorryserver_select(const boost::thread::id thread_id, boost::asio::ip::tcp::endpoint& sorry_endpoint); + EVENT_TAG handle_sorryserver_connect(const boost::thread::id thread_id, boost::array& sendbuffer, size_t& datalen); + EVENT_TAG handle_sorryserver_connection_fail(const boost::thread::id thread_id, const boost::asio::ip::tcp::endpoint& sorry_endpoint); + EVENT_TAG handle_sorryserver_send(const boost::thread::id thread_id); + EVENT_TAG handle_realserver_recv(const boost::thread::id thread_id, const boost::asio::ip::tcp::endpoint& rs_endpoint, const boost::array& recvbuffer, const size_t recvlen); + EVENT_TAG handle_realserver_recv(const boost::thread::id thread_id, const boost::asio::ip::udp::endpoint& rs_endpoint, const boost::array& recvbuffer, const size_t recvlen); + EVENT_TAG handle_sorryserver_recv(const boost::thread::id thread_id, const boost::asio::ip::tcp::endpoint& sorry_endpoint, const boost::array& recvbuffer, const size_t recvlen); + EVENT_TAG handle_response_send_inform(const boost::thread::id thread_id); + EVENT_TAG handle_client_connection_check(const boost::thread::id thread_id, boost::array& sendbuffer, size_t& datalen); + EVENT_TAG handle_client_select(const boost::thread::id thread_id, boost::asio::ip::udp::endpoint& cl_endpoint, boost::array& sendbuffer, size_t& datalen); + EVENT_TAG handle_client_send(const boost::thread::id thread_id); + EVENT_TAG handle_client_disconnect(const boost::thread::id thread_id); + EVENT_TAG handle_sorry_enable(const boost::thread::id thread_id); + EVENT_TAG handle_sorry_disable(const boost::thread::id thread_id); + EVENT_TAG handle_realserver_disconnect(const boost::thread::id thread_id, const boost::asio::ip::tcp::endpoint& rs_endpoint); + EVENT_TAG handle_sorryserver_disconnect(const boost::thread::id thread_id, const boost::asio::ip::tcp::endpoint& sorry_endpoint); + EVENT_TAG handle_realserver_close(const boost::thread::id thread_id, const boost::asio::ip::udp::endpoint& rs_endpoint); + bool get_data_from_recvbuffer(thread_data_ptr data_ptr, const boost::array& recvbuffer, const size_t recvlen); + bool put_data_into_sendbuffer(thread_data_ptr data_ptr, boost::array& sendbuffer, size_t& datalen); + bool create_x_forwarded_for(const std::string& client_endpoint, const char* buffer, + const size_t buffer_len, size_t& x_forwarded_for_insert_pos, + std::string& x_forwarded_for_context); + + }; + +}//namespace l7vs + + + + + +#endif //PROTOCOL_MODULE_IP_H + diff --git a/module/protocol/protocol_module_sessionless.cpp b/module/protocol/protocol_module_sessionless.cpp index 06304201..65a41172 100644 --- a/module/protocol/protocol_module_sessionless.cpp +++ b/module/protocol/protocol_module_sessionless.cpp @@ -22,7 +22,7 @@ * 02110-1301 USA * **********************************************************************/ - +#include #include #include #include @@ -30,1484 +30,1345 @@ #include #include #include "protocol_module_sessionless.h" +#include "utility.h" namespace l7vs { -const std::string protocol_module_sessionless::MODULE_NAME = "sessionless"; -const int protocol_module_sessionless::THREAD_DIVISION_UP_STREAM = 0; -const int protocol_module_sessionless::THREAD_DIVISION_DOWN_STREAM = 1; - -const int protocol_module_sessionless::END_FLAG_OFF = 0; -const int protocol_module_sessionless::END_FLAG_ON = 1; + const std::string protocol_module_sessionless::MODULE_NAME = "sessionless"; + const int protocol_module_sessionless::THREAD_DIVISION_UP_STREAM = 0; + const int protocol_module_sessionless::THREAD_DIVISION_DOWN_STREAM = 1; -const int protocol_module_sessionless::ACCEPT_END_FLAG_OFF = 0; -const int protocol_module_sessionless::ACCEPT_END_FLAG_ON = 1; + const int protocol_module_sessionless::END_FLAG_OFF = 0; + const int protocol_module_sessionless::END_FLAG_ON = 1; -const int protocol_module_sessionless::SORRY_FLAG_ON = 1; -const int protocol_module_sessionless::SORRY_FLAG_OFF = 0; + const int protocol_module_sessionless::ACCEPT_END_FLAG_OFF = 0; + const int protocol_module_sessionless::ACCEPT_END_FLAG_ON = 1; -const int protocol_module_sessionless::SORRYSERVER_SWITCH_FLAG_OFF = 0; -const int protocol_module_sessionless::SORRYSERVER_SWITCH_FLAG_ON = 1; + const int protocol_module_sessionless::SORRY_FLAG_ON = 1; + const int protocol_module_sessionless::SORRY_FLAG_OFF = 0; -const int protocol_module_sessionless::REALSERVER_SWITCH_FLAG_OFF = 0; -const int protocol_module_sessionless::REALSERVER_SWITCH_FLAG_ON = 1; + const int protocol_module_sessionless::SORRYSERVER_SWITCH_FLAG_OFF = 0; + const int protocol_module_sessionless::SORRYSERVER_SWITCH_FLAG_ON = 1; -const int protocol_module_sessionless::EDIT_DIVISION_NO_EDIT = 0; -const int protocol_module_sessionless::EDIT_DIVISION_EDIT = 1; - -const int protocol_module_sessionless::FORWARDED_FOR_OFF = 0; -const int protocol_module_sessionless::FORWARDED_FOR_ON = 1; -//! constractor -protocol_module_sessionless::protocol_module_sessionless() : - http_protocol_module_base(MODULE_NAME), forwarded_for(FORWARDED_FOR_OFF) -{ - sorry_uri.assign('\0'); -} -//! destractor -protocol_module_sessionless::~protocol_module_sessionless() -{ -} -//! tcp protocol support check -//! @return tcp support is true -//! @return tcp not-support is false -bool protocol_module_sessionless::is_tcp() -{ - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - putLogDebug(10000, "in/out_function : bool protocol_module_sessionless::is_tcp() : " - "return_value = true.", __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - return true; -} + const int protocol_module_sessionless::REALSERVER_SWITCH_FLAG_OFF = 0; + const int protocol_module_sessionless::REALSERVER_SWITCH_FLAG_ON = 1; -//! udp protocol support check -//! @return udp support is true -//! @return udp not-support is false -bool protocol_module_sessionless::is_udp() -{ - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - putLogDebug(10001, "in/out_function : bool protocol_module_sessionless::is_udp() : " - "return_value = false.", __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - return false; -} + const int protocol_module_sessionless::EDIT_DIVISION_NO_EDIT = 0; + const int protocol_module_sessionless::EDIT_DIVISION_EDIT = 1; -//! replication interval interrrupt -//! timer thread call this function. from virtualservice. -void protocol_module_sessionless::replication_interrupt() -{ - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + const int protocol_module_sessionless::FORWARDED_FOR_OFF = 0; + const int protocol_module_sessionless::FORWARDED_FOR_ON = 1; + //! constractor + protocol_module_sessionless::protocol_module_sessionless() : + http_protocol_module_base(MODULE_NAME), forwarded_for(FORWARDED_FOR_OFF) { - putLogDebug(10002, "in/out_function : void protocol_module_sessionless::" - "replication_interrupt().", __FILE__, __LINE__ ); + sorry_uri.assign('\0'); } - /*------DEBUG LOG END------*/ -} -//! initialize function. called from module control. module loaded call -//! @param[in] realserver list iterator begin function object type -//! @param[in] realserver list iterator end function object type -//! @param[in] realserver list iterator next function object type -//! @param[in] realserver list mutex lock function object type. -//! @param[in] realserver list mutex unlock function object type -void protocol_module_sessionless::initialize(rs_list_itr_func_type inlist_begin, - rs_list_itr_func_type inlist_end, - rs_list_itr_next_func_type inlist_next, - boost::function< void( void ) > inlist_lock, - boost::function< void( void ) > inlist_unlock) -{ - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + //! destractor + protocol_module_sessionless::~protocol_module_sessionless() { - putLogDebug(10003, "in_function : void protocol_module_sessionless::initialize(" - "rs_list_itr_func_type inlist_begin, rs_list_itr_func_type inlist_end, " - "rs_list_itr_next_func_type inlist_next, boost::function< void( void ) > " - "inlist_lock, boost::function< void( void ) > inlist_unlock).", __FILE__, __LINE__ ); } - /*------DEBUG LOG END------*/ - - //RealServer list begin function - rs_list_begin = inlist_begin; - //RealServer list end function - rs_list_end = inlist_end; - //RealServer list next function - rs_list_next = inlist_next; - //RealServer list lock funtion - rs_list_lock = inlist_lock; - //RealServer list unlock funtion - rs_list_unlock = inlist_unlock; - - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + //! tcp protocol support check + //! @return tcp support is true + //! @return tcp not-support is false + bool protocol_module_sessionless::is_tcp() { - putLogDebug(10004, "out_function : void protocol_module_sessionless::initialize(" - "rs_list_itr_func_type inlist_begin, rs_list_itr_func_type inlist_end, " - "rs_list_itr_next_func_type inlist_next, boost::function< void( void ) > " - "inlist_lock, boost::function< void( void ) > inlist_unlock).", __FILE__, __LINE__ ); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + putLogDebug(100000, "in/out_function : bool protocol_module_sessionless::is_tcp() : " + "return_value = true.", __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + return true; } - /*-------- DEBUG LOG --------*/ -} -//! finalize called from module control. module unloaded call. -void protocol_module_sessionless::finalize() -{ - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + //! udp protocol support check + //! @return udp support is true + //! @return udp not-support is false + bool protocol_module_sessionless::is_udp() { - putLogDebug(10005, "in_function : void protocol_module_sessionless::finalize().", __FILE__, - __LINE__ ); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + putLogDebug(100001, "in/out_function : bool protocol_module_sessionless::is_udp() : " + "return_value = false.", __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + return false; } - /*------DEBUG LOG END------*/ - - //RealServer list functions initializtion - //RealServer list begin function - rs_list_begin.clear(); - //RealServer list end function - rs_list_end.clear(); - //RealServer list next function - rs_list_next.clear(); - //RealServer list lock function - rs_list_lock.clear(); - //RealServer list unlock function - rs_list_unlock.clear(); - - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + + //! replication interval interrrupt + //! timer thread call this function. from virtualservice. + void protocol_module_sessionless::replication_interrupt() { - putLogDebug(10006, "function : void protocol_module_sessionless::finalize() : " - "rs_list_begin.clear(), rs_list_end.clear(), rs_list_next.clear(), rs_list_lock.clear(), rs_list_unlock.clear() end.", __FILE__, - __LINE__ ); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + putLogDebug(100002, "in/out_function : void protocol_module_sessionless::" + "replication_interrupt().", __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ } - /*------DEBUG LOG END------*/ - - //Replication functions initializtion - //component memory allcate function - replication_pay_memory.clear(); - //component memory lock function - replication_area_lock.clear(); - //component memory unlock function - replication_area_unlock.clear(); - - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + //! initialize function. called from module control. module loaded call + //! @param[in] realserver list iterator begin function object type + //! @param[in] realserver list iterator end function object type + //! @param[in] realserver list iterator next function object type + //! @param[in] realserver list mutex lock function object type. + //! @param[in] realserver list mutex unlock function object type + void protocol_module_sessionless::initialize(rs_list_itr_func_type inlist_begin, + rs_list_itr_func_type inlist_end, + rs_list_itr_next_func_type inlist_next, + boost::function< void( void ) > inlist_lock, + boost::function< void( void ) > inlist_unlock) { - putLogDebug(10007, "function : void protocol_module_sessionless::finalize() : " - "replication_pay_memory.clear(), replication_area_lock.clear(), replication_area_unlock.clear() end.", __FILE__, - __LINE__ ); - } - /*------DEBUG LOG END------*/ + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + putLogDebug(100003, "in_function : void protocol_module_sessionless::initialize(" + "rs_list_itr_func_type inlist_begin, rs_list_itr_func_type inlist_end, " + "rs_list_itr_next_func_type inlist_next, boost::function< void( void ) > " + "inlist_lock, boost::function< void( void ) > inlist_unlock).", __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ - //ScheduleModule's functions initializtion - schedule_tcp.clear(); + //RealServer list begin function + rs_list_begin = inlist_begin; + //RealServer list end function + rs_list_end = inlist_end; + //RealServer list next function + rs_list_next = inlist_next; + //RealServer list lock funtion + rs_list_lock = inlist_lock; + //RealServer list unlock funtion + rs_list_unlock = inlist_unlock; - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - putLogDebug(10008, "function : void protocol_module_sessionless::finalize() : " - "schedule_tcp.clear(), schedule_udp.clear() end.", __FILE__, - __LINE__ ); - } - /*------DEBUG LOG END------*/ - - //Module's option initializtion - //forwarded_for - forwarded_for = FORWARDED_FOR_OFF; - //sorry-uri - sorry_uri.assign('\0'); - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - putLogDebug(10009, "function : void protocol_module_sessionless::finalize() : " - "forwarded_for = 0, sorry_uri.assign('\\0') end.", __FILE__, - __LINE__ ); - } - /*------DEBUG LOG END------*/ - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - putLogDebug(10010, "out_function : void protocol_module_sessionless::finalize().", __FILE__, - __LINE__ ); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + putLogDebug(100004, "out_function : void protocol_module_sessionless::initialize(" + "rs_list_itr_func_type inlist_begin, rs_list_itr_func_type inlist_end, " + "rs_list_itr_next_func_type inlist_next, boost::function< void( void ) > " + "inlist_lock, boost::function< void( void ) > inlist_unlock).", __FILE__, __LINE__ ); + } + /*-------- DEBUG LOG --------*/ } - /*------DEBUG LOG END------*/ - - - //logger functions initializtion - //log level getting function - getloglevel.clear(); - //logger(Fatal) - putLogFatal.clear(); - //logger(Error) - putLogError.clear(); - //logger(Warn) - putLogWarn.clear(); - //logger(Info) - putLogInfo.clear(); - //logger(Debug) - putLogDebug.clear(); -} -//! sorry support check -//! @return true sorry mode is supported. -//! @return false sorry mode is unsupported. -bool protocol_module_sessionless::is_use_sorry() -{ - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + //! finalize called from module control. module unloaded call. + void protocol_module_sessionless::finalize() { - putLogDebug(10011, "in/out_function : bool protocol_module_sessionless::is_use_sorry() : " - "return_value = true.", __FILE__, __LINE__ ); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + putLogDebug(100005, "in_function : void protocol_module_sessionless::finalize().", __FILE__, + __LINE__ ); + } + /*------DEBUG LOG END------*/ + + //RealServer list functions initializtion + //RealServer list begin function + rs_list_begin.clear(); + //RealServer list end function + rs_list_end.clear(); + //RealServer list next function + rs_list_next.clear(); + //RealServer list lock function + rs_list_lock.clear(); + //RealServer list unlock function + rs_list_unlock.clear(); + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + putLogDebug(100006, "function : void protocol_module_sessionless::finalize() : " + "rs_list_begin.clear(), rs_list_end.clear(), rs_list_next.clear(), rs_list_lock.clear(), rs_list_unlock.clear() end.", __FILE__, + __LINE__ ); + } + /*------DEBUG LOG END------*/ + + //Replication functions initializtion + //component memory allcate function + replication_pay_memory.clear(); + //component memory lock function + replication_area_lock.clear(); + //component memory unlock function + replication_area_unlock.clear(); + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + putLogDebug(100007, "function : void protocol_module_sessionless::finalize() : " + "replication_pay_memory.clear(), replication_area_lock.clear(), replication_area_unlock.clear() end.", __FILE__, + __LINE__ ); + } + /*------DEBUG LOG END------*/ + + //ScheduleModule's functions initializtion + schedule_tcp.clear(); + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + putLogDebug(100008, "function : void protocol_module_sessionless::finalize() : " + "schedule_tcp.clear(), schedule_udp.clear() end.", __FILE__, + __LINE__ ); + } + /*------DEBUG LOG END------*/ + + //Module's option initializtion + //forwarded_for + forwarded_for = FORWARDED_FOR_OFF; + //sorry-uri + sorry_uri.assign('\0'); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + putLogDebug(100009, "function : void protocol_module_sessionless::finalize() : " + "forwarded_for = 0, sorry_uri.assign('\\0') end.", __FILE__, + __LINE__ ); + } + /*------DEBUG LOG END------*/ + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + putLogDebug(100010, "out_function : void protocol_module_sessionless::finalize().", __FILE__, + __LINE__ ); + } + /*------DEBUG LOG END------*/ + + + //logger functions initializtion + //log level getting function + getloglevel.clear(); + //logger(Fatal) + putLogFatal.clear(); + //logger(Error) + putLogError.clear(); + //logger(Warn) + putLogWarn.clear(); + //logger(Info) + putLogInfo.clear(); + //logger(Debug) + putLogDebug.clear(); } - /*------DEBUG LOG END------*/ - return true; -} -//! realserver list update event -void protocol_module_sessionless::handle_rslist_update() -{ - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + //! sorry support check + //! @return true sorry mode is supported. + //! @return false sorry mode is unsupported. + bool protocol_module_sessionless::is_use_sorry() { - putLogDebug(10012, "in/out_function : void protocol_module_sessionless::handle_rslist_update().", __FILE__, - __LINE__ ); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + putLogDebug(100011, "in/out_function : bool protocol_module_sessionless::is_use_sorry() : " + "return_value = true.", __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + return true; } - /*------DEBUG LOG END------*/ -} -//! module parameter check.used by l7vsadm -//! @param[in] module paramter string list -//! @return result.flag true is parameter is noproblem. -//! @return result.flag false is paramter is problem. -protocol_module_base::check_message_result protocol_module_sessionless::check_parameter(const std::vector< - std::string>& args) -{ - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + //! realserver list update event + void protocol_module_sessionless::handle_rslist_update() { - boost::format formatter("in_function : protocol_module_base::check_message_result " - "protocol_module_sessionless::check_parameter(" - "const std::vector& args) : args = %s."); - std::string argsdump; - for (std::vector::const_iterator it = args.begin(); it != args.end(); ++it) + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - argsdump += *it; - argsdump += " "; + putLogDebug(100012, "in/out_function : void protocol_module_sessionless::handle_rslist_update().", __FILE__, + __LINE__ ); } - formatter % argsdump; - putLogDebug(10013, formatter.str(), __FILE__, __LINE__ ); + /*------DEBUG LOG END------*/ } - /*------DEBUG LOG END------*/ - //set check result true - check_message_result check_result; - check_result.flag = true; - bool forward_checked = false; - bool sorryuri_checked = false; - const std::string regex_match_str = "(/([[:digit:][:alpha:]$\\-_.+!*'(),;:@&=]|%[:xdigit:]{2})*)+"; - typedef std::vector::const_iterator vec_str_it; - - try + //! module parameter check.used by l7vsadm + //! @param[in] module paramter string list + //! @return result.flag true is parameter is noproblem. + //! @return result.flag false is paramter is problem. + protocol_module_base::check_message_result protocol_module_sessionless::check_parameter(const std::vector< + std::string>& args) { - vec_str_it it = args.begin(); - vec_str_it it_end = args.end(); - //loop option strings - for (; it != it_end; ++it) + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - //option string = "-F" - if (*it == "-F" || *it == "--forwarded-for") + boost::format formatter("in_function : protocol_module_base::check_message_result " + "protocol_module_sessionless::check_parameter(" + "const std::vector& args) : args = %s."); + std::string argsdump; + for (std::vector::const_iterator it = args.begin(); it != args.end(); ++it) { - //set forward flag ON - forward_checked = true; + argsdump += *it; + argsdump += " "; } - //option string = "-S" - else if (*it == "-S" || *it == "--sorry-uri") + formatter % argsdump; + putLogDebug(100013, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + using namespace boost::xpressive; + //set check result true + check_message_result check_result; + check_result.flag = true; + bool forward_checked = false; + bool sorryuri_checked = false; + sregex sorry_uri_regex + = +( '/' >> + *( alpha | + digit | + ( set = ';', ':', '@', '&', '=' ) | + ( set = '$', '-', '_', '.', '+' ) | + ( set = '!', '*', '\'', '\(', ')', ',' ) | + '%' >> repeat<2>(xdigit))); + typedef std::vector::const_iterator vec_str_it; + + try + { + vec_str_it it = args.begin(); + vec_str_it it_end = args.end(); + //loop option strings + for (; it != it_end; ++it) { - //set sorryURI flag OFF - if (!sorryuri_checked) + //option string = "-F" + if (*it == "-F" || *it == "--forwarded-for") + { + //set forward flag ON + forward_checked = true; + } + //option string = "-S" + else if (*it == "-S" || *it == "--sorry-uri") { - //next item exist - if (++it != it_end) + //set sorryURI flag OFF + if (!sorryuri_checked) { - if (!it->empty() && (it->substr(0, 1) == "-" || it->substr(0, 2) == "--")) - { - //set check result flag false - check_result.flag = false; - //set check result message - check_result.message = "You have to set option value '-S/--sorry-uri'."; - putLogError(17000, check_result.message, __FILE__, __LINE__ ); - //loop break; - break; - } - //next option string's length > 127 - if (it->size() > MAX_OPTION_SIZE - 1) - { - std::ostringstream ostr; - ostr << "'-S/--sorry-uri' option value '" << *it << "' is too long."; - - //set check result flag false - check_result.flag = false; - //set check result message - check_result.message = ostr.str(); - - putLogError(17001, check_result.message, __FILE__, __LINE__ ); - //loop break; - break; - } - //next option string's length <= 127 - else + //next item exist + if (++it != it_end) { - //regex check - boost::regex uri(regex_match_str); - boost::cmatch what; - if (boost::regex_match(it->c_str(), what, uri)) + if (!it->empty() && (it->substr(0, 1) == "-" || it->substr(0, 2) == "--")) { - //check OK - //set sorryURI flag ON - sorryuri_checked = true; + //set check result flag false + check_result.flag = false; + //set check result message + check_result.message = "You have to set option value '-S/--sorry-uri'."; + putLogError(100000, check_result.message, __FILE__, __LINE__ ); + //loop break; + break; } - //check NG - else + //next option string's length > 127 + if (it->size() > MAX_OPTION_SIZE - 1) { std::ostringstream ostr; - ostr << "'-S/--sorry-uri' option value '" << *it << "' is not a valid URI."; + ostr << "'-S/--sorry-uri' option value '" << *it << "' is too long."; //set check result flag false check_result.flag = false; //set check result message check_result.message = ostr.str(); - putLogError(17002, check_result.message, __FILE__, __LINE__ ); - //loop break + + putLogError(100001, check_result.message, __FILE__, __LINE__ ); + //loop break; break; } + //next option string's length <= 127 + else + { + //regex check + if (regex_match(*it, sorry_uri_regex )) + { + //check OK + //set sorryURI flag ON + sorryuri_checked = true; + } + //check NG + else + { + std::ostringstream ostr; + ostr << "'-S/--sorry-uri' option value '" << *it << "' is not a valid URI."; + + //set check result flag false + check_result.flag = false; + //set check result message + check_result.message = ostr.str(); + putLogError(100002, check_result.message, __FILE__, __LINE__ ); + //loop break + break; + } + } + } + //next item is not exist + else + { + //set check flag false + check_result.flag = false; + //set check result message + check_result.message = "You have to set option value '-S/--sorry-uri'."; + putLogError(100003, check_result.message, __FILE__, + __LINE__ ); + //loop break + break; } } - //next item is not exist + //sorryURI flag = ON else { - //set check flag false + //set check result flag false check_result.flag = false; //set check result message - check_result.message = "You have to set option value '-S/--sorry-uri'."; - putLogError(17003, check_result.message, __FILE__, + check_result.message = "Cannot set multiple option '-S/--sorry-uri'."; + putLogError(100004, check_result.message, __FILE__, __LINE__ ); //loop break break; } } - //sorryURI flag = ON + //other option string else { //set check result flag false check_result.flag = false; //set check result message - check_result.message = "Cannot set multiple option '-S/--sorry-uri'."; - putLogError(17004, check_result.message, __FILE__, - __LINE__ ); + check_result.message = "Option error."; + putLogError(100005, check_result.message, __FILE__, __LINE__ ); //loop break break; } } - //other option string - else - { - //set check result flag false - check_result.flag = false; - //set check result message - check_result.message = "Option error."; - putLogError(17005, check_result.message, __FILE__, __LINE__ ); - //loop break - break; - } } - } - catch (const std::exception& ex) - { - check_result.flag = false; - std::cerr << "protocol_module_sessionless::check_parameter() : exception : error = " << ex.what() << "." << std::endl; - boost::format formatter("function : protocol_module_base::check_message_result " - "protocol_module_sessionless::check_parameter() exception : " - "error = %s."); - formatter % ex.what(); - putLogError(17006, formatter.str(), __FILE__, __LINE__ ); - } - catch (...) - { - check_result.flag = false; - std::cerr << "protocol_module_sessionless::check_parameter() : Unknown exception." << std::endl; - putLogError(17007, "function : protocol_module_base::check_message_result " - "protocol_module_sessionless::check_parameter() : " - "Unknown exception.", __FILE__, __LINE__ ); - } - - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - boost::format formatter("out_function : protocol_module_base::check_message_result " - "protocol_module_sessionless::check_parameter(" - "const std::vector& args) : return_value = (" - "check_message_result.flag = %d, check_message_result.message = %s)."); - formatter % check_result.flag % check_result.message; - putLogDebug(10014, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - return check_result; -} + catch (const std::exception& ex) + { + check_result.flag = false; + std::cerr << "protocol_module_sessionless::check_parameter() : exception : error = " << ex.what() << "." << std::endl; + boost::format formatter("function : protocol_module_base::check_message_result " + "protocol_module_sessionless::check_parameter() exception : " + "error = %s."); + formatter % ex.what(); + putLogError(100006, formatter.str(), __FILE__, __LINE__ ); + } + catch (...) + { + check_result.flag = false; + std::cerr << "protocol_module_sessionless::check_parameter() : Unknown exception." << std::endl; + putLogError(100007, "function : protocol_module_base::check_message_result " + "protocol_module_sessionless::check_parameter() : " + "Unknown exception.", __FILE__, __LINE__ ); + } -//! parameter set -//! @param[in] module paramter string list -//! @return result.flag true is parameter is noproblem. -//! @return result.flag false is paramter is problem. -protocol_module_base::check_message_result protocol_module_sessionless::set_parameter(const std::vector< - std::string>& args) -{ - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - boost::format formatter("in_function : protocol_module_base::check_message_result " - "protocol_module_sessionless::set_parameter(" - "const std::vector& args) : args = %s."); - std::string argsdump; - for (std::vector::const_iterator it = args.begin(); it != args.end(); ++it) + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - argsdump += *it; - argsdump += " "; + boost::format formatter("out_function : protocol_module_base::check_message_result " + "protocol_module_sessionless::check_parameter(" + "const std::vector& args) : return_value = (" + "check_message_result.flag = %d, check_message_result.message = %s)."); + formatter % check_result.flag % check_result.message; + putLogDebug(100014, formatter.str(), __FILE__, __LINE__ ); } - formatter % argsdump; - putLogDebug(10015, formatter.str(), __FILE__, __LINE__ ); + /*------DEBUG LOG END------*/ + return check_result; } - /*------DEBUG LOG END------*/ - //set check result flag true - check_message_result check_result; - check_result.flag = true; - bool forward_checked = false; - bool sorryuri_checked = false; - const std::string regex_match_str = "(/([[:digit:][:alpha:]$\\-_.+!*'(),;:@&=]|%[:xdigit:]{2})*)+"; - - typedef std::vector::const_iterator vec_str_it; - //set forwarded flag true - forwarded_for = 1; - - try + //! parameter set + //! @param[in] module paramter string list + //! @return result.flag true is parameter is noproblem. + //! @return result.flag false is paramter is problem. + protocol_module_base::check_message_result protocol_module_sessionless::set_parameter(const std::vector< + std::string>& args) { - vec_str_it it = args.begin(); - vec_str_it it_end = args.end(); - for (; it != it_end; ++it) + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - //option string = "-F" - if (*it == "-F" || *it == "--forwarded-for") + boost::format formatter("in_function : protocol_module_base::check_message_result " + "protocol_module_sessionless::set_parameter(" + "const std::vector& args) : args = %s."); + std::string argsdump; + for (std::vector::const_iterator it = args.begin(); it != args.end(); ++it) { - //set forwarded flag ON - forward_checked = true; + argsdump += *it; + argsdump += " "; } - //option string = "-S" - else if (*it == "-S" || *it == "--sorry-uri") + formatter % argsdump; + putLogDebug(100015, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + using namespace boost::xpressive; + //set check result flag true + check_message_result check_result; + check_result.flag = true; + bool forward_checked = false; + bool sorryuri_checked = false; + sregex sorry_uri_regex + = +( '/' >> + *( alpha | + digit | + ( set = ';', ':', '@', '&', '=' ) | + ( set = '$', '-', '_', '.', '+' ) | + ( set = '!', '*', '\'', '\(', ')', ',' ) | + '%' >> repeat<2>(xdigit))); + + typedef std::vector::const_iterator vec_str_it; + + //set forwarded flag true + forwarded_for = 1; + + try + { + vec_str_it it = args.begin(); + vec_str_it it_end = args.end(); + for (; it != it_end; ++it) { - //sorryURI flag = OFF - if (!sorryuri_checked) + //option string = "-F" + if (*it == "-F" || *it == "--forwarded-for") + { + //set forwarded flag ON + forward_checked = true; + } + //option string = "-S" + else if (*it == "-S" || *it == "--sorry-uri") { - //next item exist - if (++it != it_end) + //sorryURI flag = OFF + if (!sorryuri_checked) { - if (!it->empty() && (it->substr(0, 1) == "-" || it->substr(0, 2) == "--")) - { - //set check result flag false - check_result.flag = false; - //set check result message - check_result.message = "You have to set option value '-S/--sorry-uri'."; - putLogError(17008, check_result.message, __FILE__, - __LINE__ ); - //loop break - break; - } - //next option string's length > 127 - if (it->size() > MAX_OPTION_SIZE - 1) - { - std::ostringstream ostr; - ostr << "'-S/--sorry-uri' option value '" << *it << "' is too long."; - - //set check result flag false - check_result.flag = false; - //set check result message - check_result.message = ostr.str(); - putLogError(17009, check_result.message, __FILE__, - __LINE__ ); - //loop break - break; - } - //next option string's length <= 127 - else + //next item exist + if (++it != it_end) { - //regex check - boost::regex uri(regex_match_str); - boost::cmatch what; - //check OK - if (boost::regex_match(it->c_str(), what, uri)) + if (!it->empty() && (it->substr(0, 1) == "-" || it->substr(0, 2) == "--")) { - sorryuri_checked = true; + //set check result flag false + check_result.flag = false; + //set check result message + check_result.message = "You have to set option value '-S/--sorry-uri'."; + putLogError(100008, check_result.message, __FILE__, + __LINE__ ); + //loop break + break; } - //check NG - else + //next option string's length > 127 + if (it->size() > MAX_OPTION_SIZE - 1) { std::ostringstream ostr; - ostr << "'-S/--sorry-uri' option value '" << *it << "' is not a valid URI."; + ostr << "'-S/--sorry-uri' option value '" << *it << "' is too long."; //set check result flag false check_result.flag = false; //set check result message check_result.message = ostr.str(); - putLogError(17010, check_result.message, __FILE__, + putLogError(100009, check_result.message, __FILE__, __LINE__ ); - + //loop break break; } + //next option string's length <= 127 + else + { + //regex check + //check OK + if (regex_match(*it, sorry_uri_regex)) + { + sorryuri_checked = true; + strcpy(sorry_uri.data(), it->c_str()); + } + //check NG + else + { + std::ostringstream ostr; + ostr << "'-S/--sorry-uri' option value '" << *it << "' is not a valid URI."; + + //set check result flag false + check_result.flag = false; + //set check result message + check_result.message = ostr.str(); + putLogError(100010, check_result.message, __FILE__, + __LINE__ ); + + break; + } + } + } + //next item not exist + else + { + //set check result flag false + check_result.flag = false; + //set check result message + check_result.message = "You have to set option value '-S/--sorry-uri'."; + putLogError(100011, check_result.message, __FILE__, + __LINE__ ); + + break; } } - //next item not exist + //sorryURI flag = ON else { //set check result flag false check_result.flag = false; //set check result message - check_result.message = "You have to set option value '-S/--sorry-uri'."; - putLogError(17011, check_result.message, __FILE__, + check_result.message = "Cannot set multiple option '-S/--sorry-uri'."; + putLogError(100012, check_result.message, __FILE__, __LINE__ ); break; } } - //sorryURI flag = ON + //others else { //set check result flag false check_result.flag = false; //set check result message - check_result.message = "Cannot set multiple option '-S/--sorry-uri'."; - putLogError(17012, check_result.message, __FILE__, + check_result.message = "Option error."; + + putLogError(100013, check_result.message, __FILE__, __LINE__ ); break; } } - //others - else - { - //set check result flag false - check_result.flag = false; - //set check result message - check_result.message = "Option error."; - putLogError(17013, check_result.message, __FILE__, - __LINE__ ); - - break; + if (check_result.flag == true) + { + //forward flag = OFF + if (!forward_checked) + { + forwarded_for = 0; + } } + + } + catch (const std::exception& ex) + { + check_result.flag = false; + std::cerr << "protocol_module_sessionless::set_parameter() : exception : error = " << ex.what() << "." << std::endl; + boost::format formatter("function : protocol_module_base::check_message_result " + "protocol_module_sessionless::set_parameter() : exception : " + "error = %s."); + formatter % ex.what(); + putLogError(100014, formatter.str(), __FILE__, __LINE__ ); + } + catch (...) + { + check_result.flag = false; + std::cerr << "protocol_module_sessionless::set_parameter() : Unknown exception." << std::endl; + putLogError(100015, "function : protocol_module_base::check_message_result " + "protocol_module_sessionless::set_parameter() : " + "Unknown exception.", __FILE__, __LINE__ ); } - if (check_result.flag == true) + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - //forward flag = OFF - if (!forward_checked) - { - forwarded_for = 0; - } + boost::format formatter("out_function : protocol_module_base::check_message_result " + "protocol_module_sessionless::set_parameter(" + "const std::vector& args) : return_value = (" + "check_message_result.flag = %d, check_message_result.message = %s)."); + formatter % check_result.flag % check_result.message; + putLogDebug(100016, formatter.str(), __FILE__, __LINE__ ); } + /*-------- DEBUG LOG END--------*/ - } - catch (const std::exception& ex) - { - check_result.flag = false; - std::cerr << "protocol_module_sessionless::set_parameter() : exception : error = " << ex.what() << "." << std::endl; - boost::format formatter("function : protocol_module_base::check_message_result " - "protocol_module_sessionless::set_parameter() : exception : " - "error = %s."); - formatter % ex.what(); - putLogError(17014, formatter.str(), __FILE__, __LINE__ ); - } - catch (...) - { - check_result.flag = false; - std::cerr << "protocol_module_sessionless::set_parameter() : Unknown exception." << std::endl; - putLogError(17015, "function : protocol_module_base::check_message_result " - "protocol_module_sessionless::set_parameter() : " - "Unknown exception.", __FILE__, __LINE__ ); + return check_result; } - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + //! parameter add + //! @param[in] module paramter string list + //! @return result.flag true is parameter is noproblem. + //! @return result.flag false is paramter is problem. + protocol_module_base::check_message_result protocol_module_sessionless::add_parameter(const std::vector< + std::string>& args) { - boost::format formatter("out_function : protocol_module_base::check_message_result " - "protocol_module_sessionless::set_parameter(" - "const std::vector& args) : return_value = (" - "check_message_result.flag = %d, check_message_result.message = %s)."); - formatter % check_result.flag % check_result.message; - putLogDebug(10016, formatter.str(), __FILE__, __LINE__ ); - } - /*-------- DEBUG LOG END--------*/ - - return check_result; -} + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("in_function : protocol_module_base::check_message_result " + "protocol_module_sessionless::add_parameter(" + "const std::vector& args) : args = %s."); + std::string argsdump; + for (std::vector::const_iterator it = args.begin(); it != args.end(); ++it) + { + argsdump += *it; + argsdump += " "; + } + formatter % argsdump; + putLogDebug(100017, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + check_message_result check_result; + //set check result flag true + check_result.flag = true; -//! parameter add -//! @param[in] module paramter string list -//! @return result.flag true is parameter is noproblem. -//! @return result.flag false is paramter is problem. -protocol_module_base::check_message_result protocol_module_sessionless::add_parameter(const std::vector< - std::string>& args) -{ - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - boost::format formatter("in_function : protocol_module_base::check_message_result " - "protocol_module_sessionless::add_parameter(" - "const std::vector& args) : args = %s."); - std::string argsdump; - for (std::vector::const_iterator it = args.begin(); it != args.end(); ++it) + //param list is not empty + if (!args.empty()) { - argsdump += *it; - argsdump += " "; + //set check result flag false + check_result.flag = false; + //set check result message + check_result.message = "Cannot add option."; + putLogError(100016, check_result.message, __FILE__, __LINE__ ); } - formatter % argsdump; - putLogDebug(10017, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - check_message_result check_result; - //set check result flag true - check_result.flag = true; - //param list is not empty - if (!args.empty()) - { - //set check result flag false - check_result.flag = false; - //set check result message - check_result.message = "Cannot add option."; - putLogError(17016, check_result.message, __FILE__, __LINE__ ); - } + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("out_function : protocol_module_base::check_message_result " + "protocol_module_sessionless::add_parameter(" + "const std::vector& args) : return_value = (" + "check_message_result.flag = %d, check_message_result.message = %s)."); + formatter % check_result.flag % check_result.message; + putLogDebug(100018, formatter.str(), __FILE__, __LINE__ ); + } + /*-------- DEBUG LOG --------*/ - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - boost::format formatter("out_function : protocol_module_base::check_message_result " - "protocol_module_sessionless::add_parameter(" - "const std::vector& args) : return_value = (" - "check_message_result.flag = %d, check_message_result.message = %s)."); - formatter % check_result.flag % check_result.message; - putLogDebug(10018, formatter.str(), __FILE__, __LINE__ ); + return check_result; } - /*-------- DEBUG LOG --------*/ - return check_result; -} - -//! TCP/IP scheduled function registation. -//! @param[in] schedule module TCP/IP scheduled function object type -void protocol_module_sessionless::register_schedule(tcp_schedule_func_type inschedule) -{ - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - putLogDebug(10019, "in_function : void protocol_module_sessionless::register_schedule(" - "tcp_schedule_func_type inschedule).", __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - schedule_tcp = inschedule; - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - putLogDebug(10020, "out_function : void protocol_module_sessionless::register_schedule(" - "tcp_schedule_func_type inschedule).", __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ -} - -//! UDP scheduled function registation -//! @param[in] schedule module UDP scheduled funtion object type -void protocol_module_sessionless::register_schedule(udp_schedule_func_type inschedule) -{ - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - putLogDebug(10021, - "in/out_function : void protocol_module_sessionless::register_schedule(udp_schedule_func_type inschedule).", - __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ -} - -//! called from session initialzie use in upstream_thread -//! @param[in] upstream thread id. -//! @param[in] downstream thread id -//! @return session use EVENT mode. -protocol_module_base::EVENT_TAG protocol_module_sessionless::handle_session_initialize( - const boost::thread::id up_thread_id, const boost::thread::id down_thread_id, - const boost::asio::ip::tcp::endpoint& client_endpoint_tcp, - const boost::asio::ip::udp::endpoint& client_endpoint_udp) -{ - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - boost::format formatter("in_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_session_initialize(const boost::thread::id up_thread_id, " - "const boost::thread::id down_thread_id, const boost::asio::ip::tcp::endpoint& client_endpoint_tcp, " - "const boost::asio::ip::udp::endpoint& client_endpoint_udp) : " - "up_thread_id = %d, down_thread_id = %d, client_endpoint_tcp = [%s]:%d."); - formatter % up_thread_id % down_thread_id % client_endpoint_tcp.address().to_string() % client_endpoint_tcp.port() ; - putLogDebug(10022, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - EVENT_TAG status = FINALIZE; - - //session thread initialization - try + //! TCP/IP scheduled function registation. + //! @param[in] schedule module TCP/IP scheduled function object type + void protocol_module_sessionless::register_schedule(tcp_schedule_func_type inschedule) { - thread_data_ptr p_up(new session_thread_data_sessionless); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - boost::format formatter("new : address = &(%d), size = %lu."); - formatter % static_cast(p_up.get()) % sizeof(session_thread_data_sessionless); - putLogDebug(10023, formatter.str(), __FILE__, __LINE__ ); + putLogDebug(100019, "in_function : void protocol_module_sessionless::register_schedule(" + "tcp_schedule_func_type inschedule).", __FILE__, __LINE__ ); } /*------DEBUG LOG END------*/ - p_up->thread_id = up_thread_id; - p_up->thread_division = THREAD_DIVISION_UP_STREAM; - p_up->pair_thread_id = down_thread_id; - p_up->accept_end_flag = ACCEPT_END_FLAG_OFF; - p_up->end_flag = END_FLAG_OFF; - p_up->sorry_flag = SORRY_FLAG_OFF; - p_up->sorryserver_switch_flag = SORRYSERVER_SWITCH_FLAG_OFF; - p_up->realserver_switch_flag = REALSERVER_SWITCH_FLAG_OFF; - p_up->last_status = INITIALIZE; - p_up->client_endpoint_tcp = client_endpoint_tcp; - - recive_data recv_data; - p_up->recive_data_map[client_endpoint_tcp] = recv_data; - + schedule_tcp = inschedule; /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - // data dump - boost::format - formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_session_initialize() : session_thread_data_sessionless(up_thread_id) : " - "thread_id = %d, thread_division = %d, " - "pair_thread_id = %d, accept_end_flag = %d, end_flag = %d, " - "sorry_flag = %d, sorryserver_switch_flag = %d, realserver_switch_flag = %d, last_status = %d, client_endpoint_tcp = [%s]:%d."); - formatter % p_up->thread_id % p_up->thread_division % p_up->pair_thread_id % p_up->accept_end_flag - % p_up->end_flag % p_up->sorry_flag % p_up->sorryserver_switch_flag % p_up->realserver_switch_flag - % p_up->last_status % client_endpoint_tcp.address().to_string() % client_endpoint_tcp.port(); - putLogDebug(10024, formatter.str(), __FILE__, __LINE__ ); + putLogDebug(100020, "out_function : void protocol_module_sessionless::register_schedule(" + "tcp_schedule_func_type inschedule).", __FILE__, __LINE__ ); } /*------DEBUG LOG END------*/ + } - thread_data_ptr p_down(new session_thread_data_sessionless); + //! UDP scheduled function registation + //! @param[in] schedule module UDP scheduled funtion object type + void protocol_module_sessionless::register_schedule(udp_schedule_func_type inschedule) + { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - boost::format formatter("new : address = &(%d), size = %lu."); - formatter % static_cast(p_down.get()) % sizeof(session_thread_data_sessionless); - putLogDebug(10025, formatter.str(), __FILE__, __LINE__ ); + putLogDebug(100021, + "in/out_function : void protocol_module_sessionless::register_schedule(udp_schedule_func_type inschedule).", + __FILE__, __LINE__ ); } /*------DEBUG LOG END------*/ - p_down->thread_id = down_thread_id; - p_down->thread_division = THREAD_DIVISION_DOWN_STREAM; - p_down->pair_thread_id = up_thread_id; - p_down->accept_end_flag = ACCEPT_END_FLAG_OFF; - p_down->end_flag = END_FLAG_OFF; - p_down->sorry_flag = SORRY_FLAG_OFF; - p_down->sorryserver_switch_flag = SORRYSERVER_SWITCH_FLAG_OFF; - p_down->realserver_switch_flag = REALSERVER_SWITCH_FLAG_OFF; - p_down->last_status = INITIALIZE; - p_down->client_endpoint_tcp = client_endpoint_tcp; + } + + //! called from session initialzie use in upstream_thread + //! @param[in] upstream thread id. + //! @param[in] downstream thread id + //! @return session use EVENT mode. + protocol_module_base::EVENT_TAG protocol_module_sessionless::handle_session_initialize( + const boost::thread::id up_thread_id, const boost::thread::id down_thread_id, + const boost::asio::ip::tcp::endpoint& client_endpoint_tcp, + const boost::asio::ip::udp::endpoint& client_endpoint_udp) + { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - // data dump - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_session_initialize() : session_thread_data_sessionless(down_thread_id) : " - "thread_id = %d, thread_division = %d, pair_thread_id = %d, accept_end_flag = %d, end_flag = %d, " - "sorry_flag = %d, sorryserver_switch_flag = %d, realserver_switch_flag = %d, " - "last_status = %d, client_endpoint_tcp = [%s]:%d."); - formatter % p_down->thread_id % p_down->thread_division % p_down->pair_thread_id % p_down->accept_end_flag - % p_down->end_flag % p_down->sorry_flag % p_down->sorryserver_switch_flag - % p_down->realserver_switch_flag % p_down->last_status % client_endpoint_tcp.address().to_string() % client_endpoint_tcp.port(); - putLogDebug(10026, formatter.str(), __FILE__, __LINE__ ); + boost::format formatter("in_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_session_initialize(const boost::thread::id up_thread_id, " + "const boost::thread::id down_thread_id, const boost::asio::ip::tcp::endpoint& client_endpoint_tcp, " + "const boost::asio::ip::udp::endpoint& client_endpoint_udp) : " + "up_thread_id = %d, down_thread_id = %d, client_endpoint_tcp = [%s]:%d."); + formatter % up_thread_id % down_thread_id % client_endpoint_tcp.address().to_string() % client_endpoint_tcp.port() ; + putLogDebug(100022, formatter.str(), __FILE__, __LINE__ ); } /*------DEBUG LOG END------*/ + EVENT_TAG status = FINALIZE; - boost::mutex::scoped_lock slock(session_thread_data_map_mutex); - - session_thread_data_map[up_thread_id] = p_up; - session_thread_data_map[down_thread_id] = p_down; - - status = ACCEPT; - } - catch (const std::bad_alloc&) - { - std::cerr << "protocol_module_sessionless::handle_session_initialize() : exception : Could not allocate memory." << std::endl; - boost::format formatter("Could not allocate memory. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogError(17017, formatter.str(), __FILE__, __LINE__ ); - status = FINALIZE; - } - catch (const std::exception& ex) - { - std::cerr << "protocol_module_sessionless::handle_session_initialize() : exception : error = " << ex.what() << "." << std::endl; - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_session_initialize() : exception : error = %s. thread id : %d."); - formatter % ex.what() % boost::this_thread::get_id(); - putLogError(17018, formatter.str(), __FILE__, __LINE__ ); - status = FINALIZE; - } - catch (...) - { - std::cerr << "protocol_module_sessionless::handle_session_initialize() : Unknown exception." << std::endl; - boost::format formatter("function : protocol_module_base::check_message_result " - "protocol_module_sessionless::handle_session_initialize() : " - "Unknown exception. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogError(17019, formatter.str(), __FILE__, __LINE__ ); - - status = FINALIZE; - } - - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_session_initialize(const boost::thread::id up_thread_id, " - "const boost::thread::id down_thread_id, const boost::asio::ip::tcp::endpoint& client_endpoint_tcp, " - "const boost::asio::ip::udp::endpoint& client_endpoint_udp) : return_value = %d. thread id : %d."); - formatter % status % boost::this_thread::get_id(); - putLogDebug(10027, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ + //session thread initialization + try + { + thread_data_ptr p_up(new session_thread_data_sessionless); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("new : address = &(%d), size = %lu."); + formatter % static_cast(p_up.get()) % sizeof(session_thread_data_sessionless); + putLogDebug(100023, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + p_up->thread_id = up_thread_id; + p_up->thread_division = THREAD_DIVISION_UP_STREAM; + p_up->pair_thread_id = down_thread_id; + p_up->accept_end_flag = ACCEPT_END_FLAG_OFF; + p_up->end_flag = END_FLAG_OFF; + p_up->sorry_flag = SORRY_FLAG_OFF; + p_up->sorryserver_switch_flag = SORRYSERVER_SWITCH_FLAG_OFF; + p_up->realserver_switch_flag = REALSERVER_SWITCH_FLAG_OFF; + p_up->last_status = INITIALIZE; + p_up->client_endpoint_tcp = client_endpoint_tcp; - return status; -} -//! called from session finalize use in upstream thread. -//! @param[in] upstream thread id. -//! @param[in] downstream thread id -//! @return session use EVENT mode. -protocol_module_base::EVENT_TAG protocol_module_sessionless::handle_session_finalize( - const boost::thread::id up_thread_id, const boost::thread::id down_thread_id) -{ + recive_data recv_data; + p_up->recive_data_map[client_endpoint_tcp] = recv_data; - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - boost::format formatter("in_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_session_finalize(const boost::thread::id up_thread_id, " - "const boost::thread::id down_thread_id) : " - "up_thread_id = %d, down_thread_id = %d."); - formatter % up_thread_id % down_thread_id; - putLogDebug(10028, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - EVENT_TAG status = STOP; - thread_data_ptr p_up; - thread_data_ptr p_down; - session_thread_data_map_it session_thread_data_it; - recive_data_map_it recive_data_it; - - //session thread free - try - { - boost::mutex::scoped_lock slock(session_thread_data_map_mutex); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + // data dump + boost::format + formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_session_initialize() : session_thread_data_sessionless(up_thread_id) : " + "thread_id = %d, thread_division = %d, " + "pair_thread_id = %d, accept_end_flag = %d, end_flag = %d, " + "sorry_flag = %d, sorryserver_switch_flag = %d, realserver_switch_flag = %d, last_status = %d, client_endpoint_tcp = [%s]:%d."); + formatter % p_up->thread_id % p_up->thread_division % p_up->pair_thread_id % p_up->accept_end_flag + % p_up->end_flag % p_up->sorry_flag % p_up->sorryserver_switch_flag % p_up->realserver_switch_flag + % p_up->last_status % client_endpoint_tcp.address().to_string() % client_endpoint_tcp.port(); + putLogDebug(100024, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ - session_thread_data_it = session_thread_data_map.find(up_thread_id); - if (session_thread_data_it != session_thread_data_map.end()) - { - p_up = session_thread_data_it->second; + thread_data_ptr p_down(new session_thread_data_sessionless); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - boost::format formatter("delete : address = &(%d)."); - formatter % static_cast(p_up.get()); - putLogDebug(10029, formatter.str(), __FILE__, __LINE__ ); + boost::format formatter("new : address = &(%d), size = %lu."); + formatter % static_cast(p_down.get()) % sizeof(session_thread_data_sessionless); + putLogDebug(100025, formatter.str(), __FILE__, __LINE__ ); } /*------DEBUG LOG END------*/ - session_thread_data_map.erase(up_thread_id); - } - - session_thread_data_it = session_thread_data_map.find(down_thread_id); - if (session_thread_data_it != session_thread_data_map.end()) - { + p_down->thread_id = down_thread_id; + p_down->thread_division = THREAD_DIVISION_DOWN_STREAM; + p_down->pair_thread_id = up_thread_id; + p_down->accept_end_flag = ACCEPT_END_FLAG_OFF; + p_down->end_flag = END_FLAG_OFF; + p_down->sorry_flag = SORRY_FLAG_OFF; + p_down->sorryserver_switch_flag = SORRYSERVER_SWITCH_FLAG_OFF; + p_down->realserver_switch_flag = REALSERVER_SWITCH_FLAG_OFF; + p_down->last_status = INITIALIZE; + p_down->client_endpoint_tcp = client_endpoint_tcp; /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - boost::format formatter("delete : address = &(%d)."); - formatter % static_cast(p_down.get()); - putLogDebug(10030, formatter.str(), __FILE__, - __LINE__ ); + // data dump + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_session_initialize() : session_thread_data_sessionless(down_thread_id) : " + "thread_id = %d, thread_division = %d, pair_thread_id = %d, accept_end_flag = %d, end_flag = %d, " + "sorry_flag = %d, sorryserver_switch_flag = %d, realserver_switch_flag = %d, " + "last_status = %d, client_endpoint_tcp = [%s]:%d."); + formatter % p_down->thread_id % p_down->thread_division % p_down->pair_thread_id % p_down->accept_end_flag + % p_down->end_flag % p_down->sorry_flag % p_down->sorryserver_switch_flag + % p_down->realserver_switch_flag % p_down->last_status % client_endpoint_tcp.address().to_string() % client_endpoint_tcp.port(); + putLogDebug(100026, formatter.str(), __FILE__, __LINE__ ); } /*------DEBUG LOG END------*/ - session_thread_data_map.erase(down_thread_id); - } - - status = STOP; - } - catch (const std::exception& ex) - { - std::cerr << "protocol_module_sessionless::handle_session_finalize() : exception : error = " << ex.what() << "." << std::endl; - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_session_finalize() : exception : error = %s. thread id : %d."); - formatter % ex.what() % boost::this_thread::get_id(); - putLogError(17020, formatter.str(), __FILE__, __LINE__ ); - status = STOP; - } - catch (...) - { - std::cerr << "protocol_module_sessionless::handle_session_finalize() : Unknown exception." << std::endl; - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_session_finalize() : " - "Unknown exception. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogError(17021, formatter.str(), __FILE__, __LINE__ ); - status = STOP; - } - - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_session_finalize(const boost::thread::id up_thread_id, " - "const boost::thread::id down_thread_id) : return_value = %d. thread id : %d."); - formatter % status % boost::this_thread::get_id(); - putLogDebug(10031, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - return status; -} -//! called from after session accept.in client socket use in upstream thread. -//! @param[in] upstream thread id. -//! @return session use EVENT mode. -protocol_module_base::EVENT_TAG protocol_module_sessionless::handle_accept(const boost::thread::id thread_id) -{ + boost::mutex::scoped_lock slock(session_thread_data_map_mutex ); - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - boost::format formatter("in_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_accept(const boost::thread::id thread_id) : thread_id = %d."); - formatter % thread_id; - putLogDebug(10032, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ + session_thread_data_map[up_thread_id] = p_up; + session_thread_data_map[down_thread_id] = p_down; - EVENT_TAG status = FINALIZE; - thread_data_ptr session_data; - session_thread_data_map_it session_thread_it; + status = ACCEPT; + } + catch (const std::bad_alloc&) + { + std::cerr << "protocol_module_sessionless::handle_session_initialize() : exception : Could not allocate memory." << std::endl; + boost::format formatter("Could not allocate memory. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100017, formatter.str(), __FILE__, __LINE__ ); + status = FINALIZE; + } + catch (const std::exception& ex) + { + std::cerr << "protocol_module_sessionless::handle_session_initialize() : exception : error = " << ex.what() << "." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_session_initialize() : exception : error = %s. thread id : %d."); + formatter % ex.what() % boost::this_thread::get_id(); + putLogError(100018, formatter.str(), __FILE__, __LINE__ ); + status = FINALIZE; + } + catch (...) + { + std::cerr << "protocol_module_sessionless::handle_session_initialize() : Unknown exception." << std::endl; + boost::format formatter("function : protocol_module_base::check_message_result " + "protocol_module_sessionless::handle_session_initialize() : " + "Unknown exception. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100019, formatter.str(), __FILE__, __LINE__ ); - try - { - boost::mutex::scoped_lock slock(session_thread_data_map_mutex); + status = FINALIZE; + } - session_thread_it = session_thread_data_map.find(thread_id); - if (session_thread_it == session_thread_data_map.end() || session_thread_it->second == NULL) + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - boost::format formatter("Invalid thread id. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogError(17022, formatter.str(), __FILE__, __LINE__ ); - throw -1; + boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_session_initialize(const boost::thread::id up_thread_id, " + "const boost::thread::id down_thread_id, const boost::asio::ip::tcp::endpoint& client_endpoint_tcp, " + "const boost::asio::ip::udp::endpoint& client_endpoint_udp) : return_value = %d. thread id : %d."); + formatter % status % boost::this_thread::get_id(); + putLogDebug(100027, formatter.str(), __FILE__, __LINE__ ); } + /*------DEBUG LOG END------*/ - session_data = session_thread_it->second; + return status; + } + //! called from session finalize use in upstream thread. + //! @param[in] upstream thread id. + //! @param[in] downstream thread id + //! @return session use EVENT mode. + protocol_module_base::EVENT_TAG protocol_module_sessionless::handle_session_finalize( + const boost::thread::id up_thread_id, const boost::thread::id down_thread_id) + { - //set accept end flag ON - session_data->accept_end_flag = ACCEPT_END_FLAG_ON; /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_accept(const boost::thread::id thread_id) : ACCEPT_END_FLAG_ON. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogDebug(10033, formatter.str(), __FILE__, __LINE__ ); + boost::format formatter("in_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_session_finalize(const boost::thread::id up_thread_id, " + "const boost::thread::id down_thread_id) : " + "up_thread_id = %d, down_thread_id = %d."); + formatter % up_thread_id % down_thread_id; + putLogDebug(100028, formatter.str(), __FILE__, __LINE__ ); } /*------DEBUG LOG END------*/ + EVENT_TAG status = STOP; + thread_data_ptr p_up; + thread_data_ptr p_down; + session_thread_data_map_it session_thread_data_it; + recive_data_map_it recive_data_it; + + //session thread free + try + { + boost::mutex::scoped_lock slock(session_thread_data_map_mutex ); + + session_thread_data_it = session_thread_data_map.find(up_thread_id); + if (session_thread_data_it != session_thread_data_map.end()) + { + p_up = session_thread_data_it->second; + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("delete : address = &(%d)."); + formatter % static_cast(p_up.get()); + putLogDebug(100029, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + session_thread_data_map.erase(up_thread_id); + } + + session_thread_data_it = session_thread_data_map.find(down_thread_id); + if (session_thread_data_it != session_thread_data_map.end()) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("delete : address = &(%d)."); + formatter % static_cast(p_down.get()); + putLogDebug(100030, formatter.str(), __FILE__, + __LINE__ ); + } + /*------DEBUG LOG END------*/ + session_thread_data_map.erase(down_thread_id); + } - //sorry flag on - if (session_data->sorry_flag == SORRY_FLAG_ON) + status = STOP; + } + catch (const std::exception& ex) { - //set return status - status = SORRYSERVER_SELECT; + std::cerr << "protocol_module_sessionless::handle_session_finalize() : exception : error = " << ex.what() << "." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_session_finalize() : exception : error = %s. thread id : %d."); + formatter % ex.what() % boost::this_thread::get_id(); + putLogError(100020, formatter.str(), __FILE__, __LINE__ ); + status = STOP; } - //sorry flag on - else + catch (...) { - //set return status - status = REALSERVER_SELECT; + std::cerr << "protocol_module_sessionless::handle_session_finalize() : Unknown exception." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_session_finalize() : " + "Unknown exception. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100021, formatter.str(), __FILE__, __LINE__ ); + status = STOP; } - } - catch (int e) - { + /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_accept() : catch exception e = %d. thread id : %d."); - formatter % e % boost::this_thread::get_id(); - putLogDebug(10034, formatter.str(), __FILE__, __LINE__ ); + boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_session_finalize(const boost::thread::id up_thread_id, " + "const boost::thread::id down_thread_id) : return_value = %d. thread id : %d."); + formatter % status % boost::this_thread::get_id(); + putLogDebug(100031, formatter.str(), __FILE__, __LINE__ ); } - status = FINALIZE; /*------DEBUG LOG END------*/ - } - catch (const std::exception& ex) - { - std::cerr << "protocol_module_sessionless::handle_accept() : exception : error = " << ex.what() << "." << std::endl; - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_accept() : exception : error = %s. thread id : %d."); - formatter % ex.what() % boost::this_thread::get_id(); - putLogError(17023, formatter.str(), __FILE__, __LINE__ ); - - status = FINALIZE; - } - catch (...) - { - std::cerr << "protocol_module_sessionless::handle_accept() : Unknown exception." << std::endl; - boost::format formatter("function : protocol_module_base::EVENT_TAG " - "protocol_module_sessionless::handle_accept() : " - "Unknown exception. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogError(17024, formatter.str(), __FILE__, __LINE__ ); - status = FINALIZE; + return status; } - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + //! called from after session accept.in client socket use in upstream thread. + //! @param[in] upstream thread id. + //! @return session use EVENT mode. + protocol_module_base::EVENT_TAG protocol_module_sessionless::handle_accept(const boost::thread::id thread_id) { - boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_accept(const boost::thread::id thread_id) : return_value = %d. thread id : %d."); - formatter % status % boost::this_thread::get_id(); - putLogDebug(10035, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - return status; -} -//! called from after session recv in client socket. use in upstream thread. -//! @param[in] upstream thread id -//! @param[in] recive buffer refarence. -//! @param[in] recive length -//! @return session use EVENT mode. -protocol_module_base::EVENT_TAG protocol_module_sessionless::handle_client_recv(const boost::thread::id thread_id, - const boost::array& recvbuffer, const size_t recvlen) -{ - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - size_t buffer_size = recvbuffer.size() < recvlen ? recvbuffer.size() : recvlen; - std::string buffer(recvbuffer.data(), buffer_size); - boost::format formatter("in_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_client_recv(const boost::thread::id thread_id, " - "const boost::array& recvbuffer, " - "const size_t recvlen) : thread_id = %d, recvbuffer = %s, recvlen = %d."); - formatter % thread_id % buffer % recvlen; - putLogDebug(10036, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - - EVENT_TAG status = FINALIZE; - size_t data_remain_start = 0; - size_t data_remain_size = 0; - size_t request_data_remain_size = 0; - size_t header_offset = 0; - size_t header_offset_len = 0; - size_t content_length_header_offset = 0; - size_t content_length_header_len = 0; - size_t content_len_value = 0; - size_t pos = 0; - size_t buffer_size = 0; - const size_t cr_lf_len = strlen("\r\n\r\n"); - std::string str_value; - const std::string http_header = ""; - const std::string content_header = "Content-Length"; - thread_data_ptr session_data; - char* buffer1 = NULL; - char* buffer2 = NULL; - bool bret = false; - CHECK_RESULT_TAG check_result; - session_thread_data_map_it session_thread_it; - recive_data_map_it recive_data_it; - - //parameter check - if (recvlen > recvbuffer.size()) - { - std::cerr << "protocol_module_sessionless::handle_client_recv() : Data size bigger than buffer size." << std::endl; - boost::format formatter("Data size bigger than buffer size. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogError(17025, formatter.str(), __FILE__, __LINE__ ); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_client_recv(const boost::thread::id thread_id, " - "const boost::array& recvbuffer, " - "const size_t recvlen) : return_value = %d. thread id : %d."); - formatter % FINALIZE % boost::this_thread::get_id(); - putLogDebug(10037, formatter.str(), __FILE__, __LINE__ ); + boost::format formatter("in_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_accept(const boost::thread::id thread_id) : thread_id = %d."); + formatter % thread_id; + putLogDebug(100032, formatter.str(), __FILE__, __LINE__ ); } /*------DEBUG LOG END------*/ - return FINALIZE; - } - try - { + EVENT_TAG status = FINALIZE; + thread_data_ptr session_data; + session_thread_data_map_it session_thread_it; + + try { - boost::mutex::scoped_lock slock(session_thread_data_map_mutex); + boost::mutex::scoped_lock slock(session_thread_data_map_mutex ); session_thread_it = session_thread_data_map.find(thread_id); - if (session_thread_it == session_thread_data_map.end() || session_thread_it->second == NULL) + if (unlikely(session_thread_it == session_thread_data_map.end() || session_thread_it->second == NULL)) { boost::format formatter("Invalid thread id. thread id : %d."); formatter % boost::this_thread::get_id(); - putLogError(17026, formatter.str(), __FILE__, __LINE__ ); + putLogError(100022, formatter.str(), __FILE__, __LINE__ ); throw -1; } session_data = session_thread_it->second; - } - //end flag on - if (session_data->end_flag == END_FLAG_ON) - { - status = CLIENT_RECV; + //set accept end flag ON + session_data->accept_end_flag = ACCEPT_END_FLAG_ON; + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_accept(const boost::thread::id thread_id) : ACCEPT_END_FLAG_ON. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogDebug(100033, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + //sorry flag on + if (session_data->sorry_flag == SORRY_FLAG_ON) + { + //set return status + status = SORRYSERVER_SELECT; + } + //sorry flag on + else + { + //set return status + status = REALSERVER_SELECT; + } } - //end flag off - else + catch (int e) { - recive_data_it = session_data->recive_data_map.find(session_data->client_endpoint_tcp); - if (recive_data_it == session_data->recive_data_map.end()) + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - boost::format formatter("Invalid endpoint. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogError(17027, formatter.str(), __FILE__, __LINE__ ); - throw -1; + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_accept() : catch exception e = %d. thread id : %d."); + formatter % e % boost::this_thread::get_id(); + putLogDebug(100034, formatter.str(), __FILE__, __LINE__ ); } + status = FINALIZE; + /*------DEBUG LOG END------*/ + } + catch (const std::exception& ex) + { + std::cerr << "protocol_module_sessionless::handle_accept() : exception : error = " << ex.what() << "." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_accept() : exception : error = %s. thread id : %d."); + formatter % ex.what() % boost::this_thread::get_id(); + putLogError(100023, formatter.str(), __FILE__, __LINE__ ); - recive_data& recv_data = recive_data_it->second; + status = FINALIZE; + } + catch (...) + { + std::cerr << "protocol_module_sessionless::handle_accept() : Unknown exception." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG " + "protocol_module_sessionless::handle_accept() : " + "Unknown exception. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100024, formatter.str(), __FILE__, __LINE__ ); + status = FINALIZE; + } - send_status_it it = recv_data.send_status_list.begin(); - send_status_it it_end = recv_data.send_status_list.end(); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_accept(const boost::thread::id thread_id) : return_value = %d. thread id : %d."); + formatter % status % boost::this_thread::get_id(); + putLogDebug(100035, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + return status; + } - //status list check - it = std::find_if(it, it_end, data_send_ok()); - if (it != it_end) - { - boost::format formatter("Sending data is not correct. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogError(17028, formatter.str(), __FILE__, __LINE__ ); - throw -1; - } + //! called from after session recv in client socket. use in upstream thread. + //! @param[in] upstream thread id + //! @param[in] recive buffer refarence. + //! @param[in] recive length + //! @return session use EVENT mode. + protocol_module_base::EVENT_TAG protocol_module_sessionless::handle_client_recv(const boost::thread::id thread_id, + const boost::array& recvbuffer, const size_t recvlen) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + size_t buffer_size = recvbuffer.size() < recvlen ? recvbuffer.size() : recvlen; + std::string buffer; + dump_memory(recvbuffer.data(), buffer_size, buffer); + boost::format formatter("in_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_client_recv(const boost::thread::id thread_id, " + "const boost::array& recvbuffer, " + "const size_t recvlen) : thread_id = %d, recvbuffer = %s, recvlen = %d."); + formatter % thread_id % buffer % recvlen; + putLogDebug(100036, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ - //status list check - it = recv_data.send_status_list.begin(); - it = std::adjacent_find(it, it_end, data_send_repeated()); - if (it != it_end) + EVENT_TAG status = FINALIZE; + size_t data_remain_start = 0; + size_t data_remain_size = 0; + size_t request_data_remain_size = 0; + size_t header_offset = 0; + size_t header_offset_len = 0; + size_t content_length_header_offset = 0; + size_t content_length_header_len = 0; + size_t content_len_value = 0; + size_t pos = 0; + size_t buffer_size = 0; + const size_t cr_lf_len = strlen("\r\n\r\n"); + std::string str_value; + const std::string http_header = ""; + const std::string content_header = "Content-Length"; + thread_data_ptr session_data; + char* buffer1 = NULL; + char* buffer2 = NULL; + bool bret = false; + CHECK_RESULT_TAG check_result; + session_thread_data_map_it session_thread_it; + recive_data_map_it recive_data_it; + + //parameter check + if (recvlen > recvbuffer.size()) + { + std::cerr << "protocol_module_sessionless::handle_client_recv() : Data size bigger than buffer size." << std::endl; + boost::format formatter("Data size bigger than buffer size. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100025, formatter.str(), __FILE__, __LINE__ ); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - boost::format formatter("Sending data is not correct. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogError(17029, formatter.str(), __FILE__, __LINE__ ); - throw -1; + boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_client_recv(const boost::thread::id thread_id, " + "const boost::array& recvbuffer, " + "const size_t recvlen) : return_value = %d. thread id : %d."); + formatter % FINALIZE % boost::this_thread::get_id(); + putLogDebug(100037, formatter.str(), __FILE__, __LINE__ ); } + /*------DEBUG LOG END------*/ + return FINALIZE; + } - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + try + { { - std::string datadump; - boost::format formatter("\nitem[%d] : status = %d, send_end_size = %d, " - "send_rest_size = %d, send_possible_size = %d, " - "send_offset = %d, unsend_size = %d, edit_division = %d."); - int i = 0; - for (it = recv_data.send_status_list.begin(); - it != recv_data.send_status_list.end(); - ++it, ++i) + boost::mutex::scoped_lock slock(session_thread_data_map_mutex ); + + session_thread_it = session_thread_data_map.find(thread_id); + if (unlikely(session_thread_it == session_thread_data_map.end() || session_thread_it->second == NULL)) { - formatter % i % it->status % it->send_end_size - % it->send_rest_size % it->send_possible_size - % it->send_offset % it->unsend_size % it->edit_division; - datadump += formatter.str(); + boost::format formatter("Invalid thread id. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100026, formatter.str(), __FILE__, __LINE__ ); + throw -1; } - formatter.parse("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_client_recv() : send status list dump : send status list size = %d.%s"); - - formatter % recv_data.send_status_list.size() % datadump; - putLogDebug(10038, formatter.str(), __FILE__, __LINE__ ); + session_data = session_thread_it->second; } - /*------DEBUG LOG END------*/ - it = recv_data.send_status_list.begin(); - //get original status info - while (it != it_end) + //end flag on + if (session_data->end_flag == END_FLAG_ON) { - //item status is SEND_END - if (it->status == SEND_END) + status = CLIENT_RECV; + } + //end flag off + else + { + recive_data_it = session_data->recive_data_map.find(session_data->client_endpoint_tcp); + if (unlikely(recive_data_it == session_data->recive_data_map.end())) { - //erase from list - recv_data.send_status_list.erase(it++); - continue; + boost::format formatter("Invalid endpoint. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100027, formatter.str(), __FILE__, __LINE__ ); + throw -1; } - //item status is SEND_CONTINUE - else if (it->status == SEND_CONTINUE) + + recive_data& recv_data = recive_data_it->second; + + send_status_it it = recv_data.send_status_list.begin(); + send_status_it it_end = recv_data.send_status_list.end(); + + //status list check + it = std::find_if(it, it_end, data_send_ok()); + if (unlikely(it != it_end)) { - it->send_offset += it->send_end_size; - data_remain_start = it->send_offset; - break; + boost::format formatter("Sending data is not correct. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100028, formatter.str(), __FILE__, __LINE__ ); + throw -1; } - //item status is SEND_NG - else + + //status list check + it = recv_data.send_status_list.begin(); + it = std::adjacent_find(it, it_end, data_send_repeated()); + if (unlikely(it != it_end)) { - data_remain_start = it->send_offset; - data_remain_size = it->unsend_size; - break; + boost::format formatter("Sending data is not correct. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100029, formatter.str(), __FILE__, __LINE__ ); + throw -1; } - ++it; - } - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - std::string datadump; - boost::format formatter("\nitem[%d] : status = %d, send_end_size = %d, " - "send_rest_size = %d, send_possible_size = %d, " - "send_offset = %d, unsend_size = %d, edit_division = %d."); - int i = 0; - for (it = recv_data.send_status_list.begin(); - it != recv_data.send_status_list.end(); - ++it, ++i) + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - formatter % i % it->status % it->send_end_size - % it->send_rest_size % it->send_possible_size - % it->send_offset % it->unsend_size % it->edit_division; - datadump += formatter.str(); - } + std::string datadump; + boost::format formatter("\nitem[%d] : status = %d, send_end_size = %d, " + "send_rest_size = %d, send_possible_size = %d, " + "send_offset = %d, unsend_size = %d, edit_division = %d."); + int i = 0; + for (it = recv_data.send_status_list.begin(); + it != recv_data.send_status_list.end(); + ++it, ++i) + { + formatter % i % it->status % it->send_end_size + % it->send_rest_size % it->send_possible_size + % it->send_offset % it->unsend_size % it->edit_division; + datadump += formatter.str(); + } - formatter.parse("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_client_recv() : send status list dump : send status list size = %d.%s"); + formatter.parse("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_client_recv() : send status list dump : send status list size = %d.%s"); - formatter % recv_data.send_status_list.size() % datadump; - putLogDebug(10039, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ + formatter % recv_data.send_status_list.size() % datadump; + putLogDebug(100038, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ - //recive buffer process - //buffer rest size < request size - if (recv_data.recive_buffer_rest_size < recvlen) - { - //buffer max size < remain size + request size - //buffer is need reallocate - if (recv_data.recive_buffer_max_size < data_remain_size + recvlen) + it = recv_data.send_status_list.begin(); + //get original status info + while (it != it_end) { - buffer_size = (data_remain_size + recvlen) > MAX_BUFFER_SIZE ? (data_remain_size + recvlen) : MAX_BUFFER_SIZE; - //recive_buffer1's memory allocate and initialization - buffer1 = new char[buffer_size]; - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - boost::format formatter("new : address = &(%d), size = %lu."); - formatter % static_cast(buffer1) % buffer_size; - putLogDebug(10040, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - memset(buffer1, 0, buffer_size); - //recive_buffer2's memory allocate and initialization - buffer2 = new char[buffer_size]; - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + //item status is SEND_END + if (it->status == SEND_END) { - boost::format formatter("new : address = &(%d), size = %lu."); - formatter % static_cast(buffer2) % buffer_size; - putLogDebug(10041, formatter.str(), __FILE__, __LINE__ ); + //erase from list + recv_data.send_status_list.erase(it++); + continue; } - /*------DEBUG LOG END------*/ - memset(buffer2, 0, buffer_size); - - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + //item status is SEND_CONTINUE + else if (it->status == SEND_CONTINUE) { - std::string datadump; - dump_memory(recv_data.recive_buffer + data_remain_start, data_remain_size, datadump); - boost::format formatter( - "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_client_recv() : before memcpy (data dump) : " - "data begin = %d, data_size = %d, data = %s"); - formatter % data_remain_start % data_remain_size % datadump; - putLogDebug(10042, formatter.str(), __FILE__, __LINE__ ); + it->send_offset += it->send_end_size; + data_remain_start = it->send_offset; + break; } - /*------DEBUG LOG END------*/ - //copy data from old buffer to new buffer - memcpy(buffer1, recv_data.recive_buffer + data_remain_start, data_remain_size); - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + //item status is SEND_NG + else { - std::string datadump; - dump_memory(buffer1, data_remain_size, datadump); - boost::format formatter( - "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_client_recv() : after memcpy (data dump) : " - "data begin = 0, data_size = %d, data = %s"); - formatter % data_remain_size % datadump; - putLogDebug(10043, formatter.str(), __FILE__, __LINE__ ); + data_remain_start = it->send_offset; + data_remain_size = it->unsend_size; + break; } - /*------DEBUG LOG END------*/ - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - std::string datadump; - dump_memory(recvbuffer.data(), recvlen, datadump); - boost::format formatter( - "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_client_recv() : before memcpy (data dump) : " - "data begin = 0, data_size = %d, data = %s"); - formatter % recvlen % datadump; - putLogDebug(10044, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - memcpy(buffer1 + data_remain_size, recvbuffer.data(), recvlen); - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - std::string datadump; - dump_memory(buffer1 + data_remain_size, recvlen, datadump); - boost::format formatter( - "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_client_recv() : after memcpy (data dump) : " - "data begin = %d, data_size = %d, data = %s"); - formatter % data_remain_size % recvlen % datadump; - putLogDebug(10045, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - //free old buffer1 and old buffer2 - if (recv_data.recive_buffer1 != NULL) + ++it; + } + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + boost::format formatter("\nitem[%d] : status = %d, send_end_size = %d, " + "send_rest_size = %d, send_possible_size = %d, " + "send_offset = %d, unsend_size = %d, edit_division = %d."); + int i = 0; + for (it = recv_data.send_status_list.begin(); + it != recv_data.send_status_list.end(); + ++it, ++i) { - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - boost::format formatter("delete : address = &(%d)."); - formatter % static_cast(recv_data.recive_buffer1); - putLogDebug(10046, formatter.str(), __FILE__, - __LINE__ ); - } - /*------DEBUG LOG END------*/ - delete[] recv_data.recive_buffer1; - recv_data.recive_buffer1 = NULL; + formatter % i % it->status % it->send_end_size + % it->send_rest_size % it->send_possible_size + % it->send_offset % it->unsend_size % it->edit_division; + datadump += formatter.str(); } - if (recv_data.recive_buffer2 != NULL) - { - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - boost::format formatter("delete : address = &(%d)."); - formatter % static_cast(recv_data.recive_buffer2); - putLogDebug(10047, formatter.str(), __FILE__, - __LINE__ ); - } - /*------DEBUG LOG END------*/ - delete[] recv_data.recive_buffer2; - recv_data.recive_buffer2 = NULL; - } + formatter.parse("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_client_recv() : send status list dump : send status list size = %d.%s"); - //set new buffer pointer - recv_data.recive_buffer1 = buffer1; - recv_data.recive_buffer2 = buffer2; - recv_data.recive_buffer = recv_data.recive_buffer1; - //set new buffer's max size - recv_data.recive_buffer_max_size = buffer_size; + formatter % recv_data.send_status_list.size() % datadump; + putLogDebug(100039, formatter.str(), __FILE__, __LINE__ ); } - //buffer's max size >= remain data size + requst size - //buffer isn't need reallocate, but switch - else + /*------DEBUG LOG END------*/ + + //recive buffer process + //buffer rest size < request size + if (recv_data.recive_buffer_rest_size < recvlen) { - //pointer valid check - if (recv_data.recive_buffer1 == NULL || recv_data.recive_buffer2 == NULL) - { - boost::format formatter("Invalid pointer. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogError(17030, formatter.str(), __FILE__, __LINE__ ); - throw -1; - } - //using buffer is buffer1 - if (recv_data.recive_buffer == recv_data.recive_buffer1) + //buffer max size < remain size + request size + //buffer is need reallocate + if (recv_data.recive_buffer_max_size < data_remain_size + recvlen) { - //buffer2 initialization - memset(recv_data.recive_buffer2, 0, recv_data.recive_buffer_max_size); - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - std::string datadump; - dump_memory(recv_data.recive_buffer + data_remain_start, data_remain_size, datadump); - boost::format formatter( - "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_client_recv() : before memcpy (data dump) : " - "data begin = %d, data_size = %d, data = %s"); - formatter % data_remain_start % data_remain_size % datadump; - putLogDebug(10048, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - //copy data from buffer1 to buffer2 - memcpy(recv_data.recive_buffer2, recv_data.recive_buffer + data_remain_start, data_remain_size); - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + //the buffer's size that will be allocated is exceed the upper limit value + if (MAX_SESSIONLESS_MODULE_BUFFER_SIZE < data_remain_size + recvlen) { - std::string datadump; - dump_memory(recv_data.recive_buffer2, recvlen, datadump); - boost::format formatter( - "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_client_recv() : after memcpy (data dump) : " - "data begin = 0, data_size = %d, data = %s"); - formatter % recvlen % datadump; - putLogDebug(10049, formatter.str(), __FILE__, __LINE__ ); + std::cerr << "protocol_module_sessionless::handle_client_recv() : the buffer's size that will be allacted is exceed the upper limit value." << std::endl; + boost::format formatter("The buffer's size that will be allocated is exceed the upper limit value. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100030, formatter.str(), __FILE__, __LINE__ ); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_client_recv(const boost::thread::id thread_id, " + "const boost::array& recvbuffer, " + "const size_t recvlen) : return_value = %d. thread id : %d."); + formatter % FINALIZE % boost::this_thread::get_id(); + putLogDebug(100040, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + return FINALIZE; } - /*------DEBUG LOG END------*/ + + buffer_size = (data_remain_size + recvlen) > MAX_BUFFER_SIZE ? (data_remain_size + recvlen) : MAX_BUFFER_SIZE; + //recive_buffer1's memory allocate and initialization + buffer1 = new char[buffer_size]; /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - std::string datadump; - dump_memory(recvbuffer.data(), recvlen, datadump); - boost::format formatter( - "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_client_recv() : before memcpy (data dump) : " - "data begin = 0, data_size = %d, data = %s"); - formatter % recvlen % datadump; - putLogDebug(10050, formatter.str(), __FILE__, __LINE__ ); + boost::format formatter("new : address = &(%d), size = %lu."); + formatter % static_cast(buffer1) % buffer_size; + putLogDebug(100041, formatter.str(), __FILE__, __LINE__ ); } /*------DEBUG LOG END------*/ - memcpy(recv_data.recive_buffer2 + data_remain_size, recvbuffer.data(), recvlen); + memset(buffer1, 0, buffer_size); + //recive_buffer2's memory allocate and initialization + buffer2 = new char[buffer_size]; /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - std::string datadump; - dump_memory(recv_data.recive_buffer2 + data_remain_size, recvlen, datadump); - boost::format formatter( - "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_client_recv() : after memcpy (data dump) : " - "data begin = %d, data_size = %d, data = %s"); - formatter % data_remain_size % recvlen % datadump; - putLogDebug(10051, formatter.str(), __FILE__, __LINE__ ); + boost::format formatter("new : address = &(%d), size = %lu."); + formatter % static_cast(buffer2) % buffer_size; + putLogDebug(100042, formatter.str(), __FILE__, __LINE__ ); } /*------DEBUG LOG END------*/ - //set buffer2 as using buffer - recv_data.recive_buffer = recv_data.recive_buffer2; - } - //using buffer is buffer2 - else - { - //buffer1 initializtion - memset(recv_data.recive_buffer1, 0, recv_data.recive_buffer_max_size); + memset(buffer2, 0, buffer_size); + /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { std::string datadump; dump_memory(recv_data.recive_buffer + data_remain_start, data_remain_size, datadump); @@ -1516,26 +1377,27 @@ protocol_module_base::EVENT_TAG protocol_module_sessionless::handle_client_recv( "handle_client_recv() : before memcpy (data dump) : " "data begin = %d, data_size = %d, data = %s"); formatter % data_remain_start % data_remain_size % datadump; - putLogDebug(10052, formatter.str(), __FILE__, __LINE__ ); + putLogDebug(100043, formatter.str(), __FILE__, __LINE__ ); } /*------DEBUG LOG END------*/ - //copy data from buffer2 to buffer1 - memcpy(recv_data.recive_buffer1, recv_data.recive_buffer + data_remain_start, data_remain_size); + //copy data from old buffer to new buffer + memcpy(buffer1, recv_data.recive_buffer + data_remain_start, data_remain_size); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { std::string datadump; - dump_memory(recv_data.recive_buffer1, data_remain_size, datadump); + dump_memory(buffer1, data_remain_size, datadump); boost::format formatter( "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" "handle_client_recv() : after memcpy (data dump) : " "data begin = 0, data_size = %d, data = %s"); formatter % data_remain_size % datadump; - putLogDebug(10053, formatter.str(), __FILE__, __LINE__ ); + putLogDebug(100044, formatter.str(), __FILE__, __LINE__ ); } /*------DEBUG LOG END------*/ + /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { std::string datadump; dump_memory(recvbuffer.data(), recvlen, datadump); @@ -1544,200 +1406,589 @@ protocol_module_base::EVENT_TAG protocol_module_sessionless::handle_client_recv( "handle_client_recv() : before memcpy (data dump) : " "data begin = 0, data_size = %d, data = %s"); formatter % recvlen % datadump; - putLogDebug(10054, formatter.str(), __FILE__, __LINE__ ); + putLogDebug(100045, formatter.str(), __FILE__, __LINE__ ); } /*------DEBUG LOG END------*/ - memcpy(recv_data.recive_buffer1 + data_remain_size, recvbuffer.data(), recvlen); + memcpy(buffer1 + data_remain_size, recvbuffer.data(), recvlen); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { std::string datadump; - dump_memory(recv_data.recive_buffer1 + data_remain_size, recvlen, datadump); + dump_memory(buffer1 + data_remain_size, recvlen, datadump); boost::format formatter( "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" "handle_client_recv() : after memcpy (data dump) : " "data begin = %d, data_size = %d, data = %s"); formatter % data_remain_size % recvlen % datadump; - putLogDebug(10055, formatter.str(), __FILE__, __LINE__ ); + putLogDebug(100046, formatter.str(), __FILE__, __LINE__ ); } /*------DEBUG LOG END------*/ - //set buffer1 as using buffer - recv_data.recive_buffer = recv_data.recive_buffer1; - } - } - - //set buffer's rest size - recv_data.recive_buffer_rest_size = recv_data.recive_buffer_max_size - data_remain_size - recvlen; - - //remain_size recalc - data_remain_size += recvlen; + //free old buffer1 and old buffer2 + if (recv_data.recive_buffer1 != NULL) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("delete : address = &(%d)."); + formatter % static_cast(recv_data.recive_buffer1); + putLogDebug(100047, formatter.str(), __FILE__, + __LINE__ ); + } + /*------DEBUG LOG END------*/ + delete[] recv_data.recive_buffer1; + recv_data.recive_buffer1 = NULL; + } - send_status_it it_begin = recv_data.send_status_list.begin(); - send_status_it it_end = recv_data.send_status_list.end(); + if (recv_data.recive_buffer2 != NULL) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("delete : address = &(%d)."); + formatter % static_cast(recv_data.recive_buffer2); + putLogDebug(100048, formatter.str(), __FILE__, + __LINE__ ); + } + /*------DEBUG LOG END------*/ + delete[] recv_data.recive_buffer2; + recv_data.recive_buffer2 = NULL; + } - //offset recalc - for (; it_begin != it_end; ++it_begin) - { - it_begin->send_offset -= data_remain_start; - } - } - //buffer's rest size >= request size - else - { - //pointer valid check - if (recv_data.recive_buffer == NULL) - { - boost::format formatter("Invalid pointer. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogError(17031, formatter.str(), __FILE__, __LINE__ ); - throw -1; - } - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - std::string datadump; - dump_memory(recvbuffer.data(), recvlen, datadump); - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_client_recv() : before memcpy (data dump) : " - "data begin = 0, data_size = %d, data = %s"); - formatter % recvlen % datadump; - putLogDebug(10056, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - //copy data from parameter to using buffer - memcpy(recv_data.recive_buffer + recv_data.recive_buffer_max_size - recv_data.recive_buffer_rest_size, - recvbuffer.data(), recvlen); - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - std::string datadump; - dump_memory(recv_data.recive_buffer + recv_data.recive_buffer_max_size - recv_data.recive_buffer_rest_size, - recvlen, datadump); - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_client_recv() : after memcpy (data dump) : " - "data begin = %d, data_size = %d, data = %s"); - formatter % (recv_data.recive_buffer_max_size - recv_data.recive_buffer_rest_size ) - % recvlen % datadump; - putLogDebug(10057, formatter.str(), __FILE__, __LINE__ ); + //set new buffer pointer + recv_data.recive_buffer1 = buffer1; + recv_data.recive_buffer2 = buffer2; + recv_data.recive_buffer = recv_data.recive_buffer1; + //set new buffer's max size + recv_data.recive_buffer_max_size = buffer_size; + } + //buffer's max size >= remain data size + requst size + //buffer isn't need reallocate, but switch + else + { + //pointer valid check + if (unlikely(recv_data.recive_buffer1 == NULL || recv_data.recive_buffer2 == NULL)) + { + boost::format formatter("Invalid pointer. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100031, formatter.str(), __FILE__, __LINE__ ); + throw -1; + } + //using buffer is buffer1 + if (recv_data.recive_buffer == recv_data.recive_buffer1) + { + //buffer2 initialization + memset(recv_data.recive_buffer2, 0, recv_data.recive_buffer_max_size); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + dump_memory(recv_data.recive_buffer + data_remain_start, data_remain_size, datadump); + boost::format formatter( + "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_client_recv() : before memcpy (data dump) : " + "data begin = %d, data_size = %d, data = %s"); + formatter % data_remain_start % data_remain_size % datadump; + putLogDebug(100049, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + //copy data from buffer1 to buffer2 + memcpy(recv_data.recive_buffer2, recv_data.recive_buffer + data_remain_start, data_remain_size); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + dump_memory(recv_data.recive_buffer2, recvlen, datadump); + boost::format formatter( + "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_client_recv() : after memcpy (data dump) : " + "data begin = 0, data_size = %d, data = %s"); + formatter % recvlen % datadump; + putLogDebug(100050, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + dump_memory(recvbuffer.data(), recvlen, datadump); + boost::format formatter( + "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_client_recv() : before memcpy (data dump) : " + "data begin = 0, data_size = %d, data = %s"); + formatter % recvlen % datadump; + putLogDebug(100051, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + memcpy(recv_data.recive_buffer2 + data_remain_size, recvbuffer.data(), recvlen); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + dump_memory(recv_data.recive_buffer2 + data_remain_size, recvlen, datadump); + boost::format formatter( + "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_client_recv() : after memcpy (data dump) : " + "data begin = %d, data_size = %d, data = %s"); + formatter % data_remain_size % recvlen % datadump; + putLogDebug(100052, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + //set buffer2 as using buffer + recv_data.recive_buffer = recv_data.recive_buffer2; + } + //using buffer is buffer2 + else + { + //buffer1 initializtion + memset(recv_data.recive_buffer1, 0, recv_data.recive_buffer_max_size); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + dump_memory(recv_data.recive_buffer + data_remain_start, data_remain_size, datadump); + boost::format formatter( + "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_client_recv() : before memcpy (data dump) : " + "data begin = %d, data_size = %d, data = %s"); + formatter % data_remain_start % data_remain_size % datadump; + putLogDebug(100053, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + //copy data from buffer2 to buffer1 + memcpy(recv_data.recive_buffer1, recv_data.recive_buffer + data_remain_start, data_remain_size); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + dump_memory(recv_data.recive_buffer1, data_remain_size, datadump); + boost::format formatter( + "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_client_recv() : after memcpy (data dump) : " + "data begin = 0, data_size = %d, data = %s"); + formatter % data_remain_size % datadump; + putLogDebug(100054, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + dump_memory(recvbuffer.data(), recvlen, datadump); + boost::format formatter( + "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_client_recv() : before memcpy (data dump) : " + "data begin = 0, data_size = %d, data = %s"); + formatter % recvlen % datadump; + putLogDebug(100055, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + memcpy(recv_data.recive_buffer1 + data_remain_size, recvbuffer.data(), recvlen); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + dump_memory(recv_data.recive_buffer1 + data_remain_size, recvlen, datadump); + boost::format formatter( + "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_client_recv() : after memcpy (data dump) : " + "data begin = %d, data_size = %d, data = %s"); + formatter % data_remain_size % recvlen % datadump; + putLogDebug(100056, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + //set buffer1 as using buffer + recv_data.recive_buffer = recv_data.recive_buffer1; + } + } + + //set buffer's rest size + recv_data.recive_buffer_rest_size = recv_data.recive_buffer_max_size - data_remain_size - recvlen; + + //remain_size recalc + data_remain_size += recvlen; + + send_status_it it_begin = recv_data.send_status_list.begin(); + send_status_it it_end = recv_data.send_status_list.end(); + + //offset recalc + for (; it_begin != it_end; ++it_begin) + { + it_begin->send_offset -= data_remain_start; + } + } + //buffer's rest size >= request size + else + { + //pointer valid check + if (unlikely(recv_data.recive_buffer == NULL)) + { + boost::format formatter("Invalid pointer. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100032, formatter.str(), __FILE__, __LINE__ ); + throw -1; + } + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + dump_memory(recvbuffer.data(), recvlen, datadump); + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_client_recv() : before memcpy (data dump) : " + "data begin = 0, data_size = %d, data = %s"); + formatter % recvlen % datadump; + putLogDebug(100057, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + //copy data from parameter to using buffer + memcpy(recv_data.recive_buffer + recv_data.recive_buffer_max_size - recv_data.recive_buffer_rest_size, + recvbuffer.data(), recvlen); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + dump_memory(recv_data.recive_buffer + recv_data.recive_buffer_max_size - recv_data.recive_buffer_rest_size, + recvlen, datadump); + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_client_recv() : after memcpy (data dump) : " + "data begin = %d, data_size = %d, data = %s"); + formatter % (recv_data.recive_buffer_max_size - recv_data.recive_buffer_rest_size ) + % recvlen % datadump; + putLogDebug(100058, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + //buffer's rest size recalc + recv_data.recive_buffer_rest_size -= recvlen; + //remain data size recalc + data_remain_size += recvlen; } - /*------DEBUG LOG END------*/ - //buffer's rest size recalc - recv_data.recive_buffer_rest_size -= recvlen; - //remain data size recalc - data_remain_size += recvlen; - } - it = recv_data.send_status_list.begin(); - it_end = recv_data.send_status_list.end(); + it = recv_data.send_status_list.begin(); + it_end = recv_data.send_status_list.end(); - //set request rest size - request_data_remain_size = recvlen; + //set request rest size + request_data_remain_size = recvlen; - //original status process - for (; it != it_end; ++it) - { - //status is SEND_CONTINUE - if (it->status == SEND_CONTINUE) + //original status process + for (; it != it_end; ++it) { - //send rest size > request size - if (it->send_rest_size > request_data_remain_size) + //status is SEND_CONTINUE + if (it->status == SEND_CONTINUE) { - //send possible size recalc - it->send_possible_size = request_data_remain_size; - //send rest size recalc - it->send_rest_size -= request_data_remain_size; - //send end size recalc - it->send_end_size = 0; - //request size recalc - request_data_remain_size = 0; + //send rest size > request size + if (it->send_rest_size > request_data_remain_size) + { + //send possible size recalc + it->send_possible_size = request_data_remain_size; + //send rest size recalc + it->send_rest_size -= request_data_remain_size; + //send end size recalc + it->send_end_size = 0; + //request size recalc + request_data_remain_size = 0; + } + //send rest size <= request size + else + { + //send possible size recalc + it->send_possible_size = it->send_rest_size; + //send rest size recalc + request_data_remain_size -= it->send_rest_size; + //send end size recalc + it->send_end_size = 0; + //request size recalc + it->send_rest_size = 0; + } + //set edit_division flag off + it->edit_division = EDIT_DIVISION_NO_EDIT; + //set status SEND_OK + it->status = SEND_OK; } - //send rest size <= request size - else + //status is SEND_NG + else if (it->status == SEND_NG) { - //send possible size recalc - it->send_possible_size = it->send_rest_size; - //send rest size recalc - request_data_remain_size -= it->send_rest_size; - //send end size recalc - it->send_end_size = 0; - //request size recalc - it->send_rest_size = 0; + //check http method + check_result = check_http_method(recv_data.recive_buffer + it->send_offset, data_remain_size); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_client_recv() : call check_http_method : " + "return_value = %d. thread id : %d."); + formatter % check_result % boost::this_thread::get_id(); + putLogDebug(100059, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + //check http method result is OK + if (check_result == CHECK_OK) + { + //check http version + check_result = check_http_version(recv_data.recive_buffer + it->send_offset, data_remain_size); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_client_recv() : call check_http_version : " + "return_value = %d. thread id : %d."); + formatter % check_result % boost::this_thread::get_id(); + putLogDebug(100060, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + } + //check method and version result is OK + if (check_result == CHECK_OK) + { + //search http header + bret = find_http_header(recv_data.recive_buffer + it->send_offset, data_remain_size, http_header, + header_offset, header_offset_len); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_client_recv() : call find_http_header : " + "return_value = %d. thread id : %d."); + formatter % static_cast(bret) % boost::this_thread::get_id(); + putLogDebug(100061, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + //search http header result is OK + if (bret) + { + //search Content_Length header + bret = find_http_header(recv_data.recive_buffer + it->send_offset, data_remain_size, + content_header, content_length_header_offset, content_length_header_len); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_client_recv() : call find_http_header : " + "return_value = %d. thread id : %d."); + formatter % static_cast(bret) % boost::this_thread::get_id(); + putLogDebug(100062, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + //search Content_Length result is OK + if (bret) + { + //Get Content_Length header's numeric value + for (pos = 0; recv_data.recive_buffer[it->send_offset + content_length_header_offset + pos] != ':' && pos + < content_length_header_len; ++pos) + ; + if (pos == content_length_header_len) + { + throw std::string("Content_Length field's value is invalid."); + } + + ++pos; + + str_value.assign(recv_data.recive_buffer + it->send_offset + content_length_header_offset + pos, + content_length_header_len - pos); + + size_t pos_end = str_value.find_last_of('\r'); + if (pos_end != std::string::npos) + { + str_value = str_value.erase(pos_end); + } + + for (pos = 0; !isgraph(str_value[pos]) && str_value[pos] != '\0'; ++pos); + + str_value = str_value.substr(pos); + + try + { + content_len_value = boost::lexical_cast(str_value.c_str()); + } + catch (const boost::bad_lexical_cast& ex) + { + throw std::string("Content_Length field's value is invalid."); + } + + //send_rest_size recalc + //set whole http header's length + Content_Length's value + it->send_rest_size = header_offset + header_offset_len + cr_lf_len + content_len_value; + } + //search Content_Length result is NG + else + { + //send_rest_size recalc + //set whole http header's length + it->send_rest_size = header_offset + header_offset_len + cr_lf_len; + } + //set edit_division flag on + it->edit_division = EDIT_DIVISION_EDIT; + } + //search http header result is NG + else + { + //unsend_size recalc + it->unsend_size += request_data_remain_size; + //request data rest size recalc + request_data_remain_size = 0; + break; + } + } + //check method and version result is NG + else if (check_result == CHECK_NG) + { + //set edit_division flag off + it->edit_division = EDIT_DIVISION_NO_EDIT; + //send_rest_size recalc + it->send_rest_size = it->unsend_size + request_data_remain_size; + } + //check method and version result is CHECK_INPOSSIBLE + else + { + //unsend_size recalc + it->unsend_size += request_data_remain_size; + //request data rest size recalc + request_data_remain_size = 0; + break; + } + + //recalc fields value according to send_rest_size and request rest size + if (it->send_rest_size > it->unsend_size + request_data_remain_size) + { + it->send_possible_size = it->unsend_size + request_data_remain_size; + it->send_rest_size -= (it->unsend_size + request_data_remain_size); + it->send_end_size = 0; + it->unsend_size = 0; + request_data_remain_size = 0; + } + else + { + it->send_possible_size = it->send_rest_size; + request_data_remain_size = it->unsend_size + request_data_remain_size - it->send_rest_size; + it->send_end_size = 0; + it->unsend_size = 0; + it->send_rest_size = 0; + } + + //change status from SEND_NG to SEND_OK + it->status = SEND_OK; + } + //no request rest data to process + if (request_data_remain_size <= 0) + { + break; } - //set edit_division flag off - it->edit_division = EDIT_DIVISION_NO_EDIT; - //set status SEND_OK - it->status = SEND_OK; } - //status is SEND_NG - else if (it->status == SEND_NG) + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + boost::format formatter("\nitem[%d] : status = %d, send_end_size = %d, " + "send_rest_size = %d, send_possible_size = %d, " + "send_offset = %d, unsend_size = %d, edit_division = %d."); + int i = 0; + for (it = recv_data.send_status_list.begin(); + it != recv_data.send_status_list.end(); + ++it, ++i) + { + formatter % i % it->status % it->send_end_size + % it->send_rest_size % it->send_possible_size + % it->send_offset % it->unsend_size % it->edit_division; + datadump += formatter.str(); + } + + formatter.parse("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_client_recv() : send status list dump : send status list size = %d.%s"); + + formatter % recv_data.send_status_list.size() % datadump; + putLogDebug(100063, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + //there are still rest data need to process + //new status created and add to status list + while (request_data_remain_size > 0) { + //new status created + send_status new_send_state; + + new_send_state.edit_division = EDIT_DIVISION_NO_EDIT; + new_send_state.send_end_size = 0; + new_send_state.send_offset = 0; + new_send_state.send_possible_size = 0; + new_send_state.unsend_size = 0; + new_send_state.send_rest_size = 0; + //status initialize to SEND_NG + new_send_state.status = SEND_NG; + //add new status to status_list + recv_data.send_status_list.push_back(new_send_state); + std::list::reverse_iterator new_send_it = recv_data.send_status_list.rbegin(); + //cacl offset + new_send_it->send_offset = recv_data.recive_buffer_max_size - recv_data.recive_buffer_rest_size + - request_data_remain_size; + //check http method - check_result = check_http_method(recv_data.recive_buffer + it->send_offset, data_remain_size); + check_result = check_http_method(recv_data.recive_buffer + new_send_it->send_offset, + request_data_remain_size); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" "handle_client_recv() : call check_http_method : " "return_value = %d. thread id : %d."); formatter % check_result % boost::this_thread::get_id(); - putLogDebug(10058, formatter.str(), __FILE__, __LINE__ ); + putLogDebug(100064, formatter.str(), __FILE__, __LINE__ ); } /*------DEBUG LOG END------*/ //check http method result is OK if (check_result == CHECK_OK) { //check http version - check_result = check_http_version(recv_data.recive_buffer + it->send_offset, data_remain_size); + check_result = check_http_version(recv_data.recive_buffer + new_send_it->send_offset, + request_data_remain_size); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" "handle_client_recv() : call check_http_version : " "return_value = %d. thread id : %d."); formatter % check_result % boost::this_thread::get_id(); - putLogDebug(10059, formatter.str(), __FILE__, __LINE__ ); + putLogDebug(100065, formatter.str(), __FILE__, __LINE__ ); } /*------DEBUG LOG END------*/ } - //check method and version result is OK + //check http method and version result is OK if (check_result == CHECK_OK) { - //search http header - bret = find_http_header(recv_data.recive_buffer + it->send_offset, data_remain_size, http_header, - header_offset, header_offset_len); + //search whole http header, get whole http header's offset and length + bret = find_http_header(recv_data.recive_buffer + new_send_it->send_offset, request_data_remain_size, + http_header, header_offset, header_offset_len); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" "handle_client_recv() : call find_http_header : " "return_value = %d. thread id : %d."); - formatter % static_cast(bret) % boost::this_thread::get_id(); - putLogDebug(10060, formatter.str(), __FILE__, __LINE__ ); + formatter % check_result % boost::this_thread::get_id(); + putLogDebug(100066, formatter.str(), __FILE__, __LINE__ ); } /*------DEBUG LOG END------*/ - //search http header result is OK + //searched whole http header if (bret) { - //search Content_Length header - bret = find_http_header(recv_data.recive_buffer + it->send_offset, data_remain_size, - content_header, content_length_header_offset, content_length_header_len); + //search ContentLength http header, get ContentLength header's offset and length + bret = find_http_header(recv_data.recive_buffer + new_send_it->send_offset, + request_data_remain_size, content_header, content_length_header_offset, content_length_header_len); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" "handle_client_recv() : call find_http_header : " "return_value = %d. thread id : %d."); formatter % static_cast(bret) % boost::this_thread::get_id(); - putLogDebug(10061, formatter.str(), __FILE__, __LINE__ ); + putLogDebug(100067, formatter.str(), __FILE__, __LINE__ ); } /*------DEBUG LOG END------*/ - //search Content_Length result is OK + + //searched ContentLength http header if (bret) { //Get Content_Length header's numeric value - for (pos = 0; recv_data.recive_buffer[it->send_offset + content_length_header_offset + pos] != ':' && pos - < content_length_header_len; ++pos) - ; + for (pos = 0; + recv_data.recive_buffer[new_send_it->send_offset + content_length_header_offset + pos] != ':' + && pos < content_length_header_len; + ++pos); if (pos == content_length_header_len) { throw std::string("Content_Length field's value is invalid."); @@ -1745,7 +1996,7 @@ protocol_module_base::EVENT_TAG protocol_module_sessionless::handle_client_recv( ++pos; - str_value.assign(recv_data.recive_buffer + it->send_offset + content_length_header_offset + pos, + str_value.assign(recv_data.recive_buffer + new_send_it->send_offset + content_length_header_offset + pos, content_length_header_len - pos); size_t pos_end = str_value.find_last_of('\r'); @@ -1757,7 +2008,6 @@ protocol_module_base::EVENT_TAG protocol_module_sessionless::handle_client_recv( for (pos = 0; !isgraph(str_value[pos]) && str_value[pos] != '\0'; ++pos); str_value = str_value.substr(pos); - try { content_len_value = boost::lexical_cast(str_value.c_str()); @@ -1766,807 +2016,667 @@ protocol_module_base::EVENT_TAG protocol_module_sessionless::handle_client_recv( { throw std::string("Content_Length field's value is invalid."); } - //send_rest_size recalc - //set whole http header's length + Content_Length's value - it->send_rest_size = header_offset + header_offset_len + cr_lf_len + content_len_value; + //set whole http header's + whole http header's length + Content_Length's value + new_send_it->send_rest_size = header_offset + header_offset_len + cr_lf_len + content_len_value; } - //search Content_Length result is NG + //not searched ContentLength http header else { //send_rest_size recalc - //set whole http header's length - it->send_rest_size = header_offset + header_offset_len + cr_lf_len; + //set whole http header's + whole http header's length + new_send_it->send_rest_size = header_offset + header_offset_len + cr_lf_len; + } //set edit_division flag on - it->edit_division = EDIT_DIVISION_EDIT; + new_send_it->edit_division = EDIT_DIVISION_EDIT; } - //search http header result is NG + //not searched whole http header else { - //unsend_size recalc - it->unsend_size += request_data_remain_size; - //request data rest size recalc + new_send_it->unsend_size = request_data_remain_size; request_data_remain_size = 0; break; } } - //check method and version result is NG + //check http method or version result is NG else if (check_result == CHECK_NG) { - //set edit_division flag off - it->edit_division = EDIT_DIVISION_NO_EDIT; - //send_rest_size recalc - it->send_rest_size = it->unsend_size + request_data_remain_size; + new_send_it->edit_division = EDIT_DIVISION_NO_EDIT; + new_send_it->send_rest_size = request_data_remain_size; } - //check method and version result is CHECK_INPOSSIBLE + + //check http method or version result is impossible else { - //unsend_size recalc - it->unsend_size += request_data_remain_size; - //request data rest size recalc + new_send_it->unsend_size = request_data_remain_size; request_data_remain_size = 0; break; } //recalc fields value according to send_rest_size and request rest size - if (it->send_rest_size > it->unsend_size + request_data_remain_size) + if (new_send_it->send_rest_size > request_data_remain_size) { - it->send_possible_size = it->unsend_size + request_data_remain_size; - it->send_rest_size -= (it->unsend_size + request_data_remain_size); - it->send_end_size = 0; - it->unsend_size = 0; + new_send_it->send_possible_size = request_data_remain_size; + new_send_it->send_rest_size -= request_data_remain_size; + new_send_it->send_end_size = 0; request_data_remain_size = 0; } else { - it->send_possible_size = it->send_rest_size; - request_data_remain_size = it->unsend_size + request_data_remain_size - it->send_rest_size; - it->send_end_size = 0; - it->unsend_size = 0; - it->send_rest_size = 0; + new_send_it->send_possible_size = new_send_it->send_rest_size; + request_data_remain_size -= new_send_it->send_rest_size; + new_send_it->send_end_size = 0; + new_send_it->send_rest_size = 0; } //change status from SEND_NG to SEND_OK - it->status = SEND_OK; - } - //no request rest data to process - if (request_data_remain_size <= 0) - { - break; - } - } - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - std::string datadump; - boost::format formatter("\nitem[%d] : status = %d, send_end_size = %d, " - "send_rest_size = %d, send_possible_size = %d, " - "send_offset = %d, unsend_size = %d, edit_division = %d."); - int i = 0; - for (it = recv_data.send_status_list.begin(); - it != recv_data.send_status_list.end(); - ++it, ++i) - { - formatter % i % it->status % it->send_end_size - % it->send_rest_size % it->send_possible_size - % it->send_offset % it->unsend_size % it->edit_division; - datadump += formatter.str(); + new_send_it->status = SEND_OK; } - formatter.parse("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_client_recv() : send status list dump : send status list size = %d.%s"); - - formatter % recv_data.send_status_list.size() % datadump; - putLogDebug(10062, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - //there are still rest data need to process - //new status created and add to status list - while (request_data_remain_size > 0) - { - //new status created - send_status new_send_state; - - new_send_state.edit_division = EDIT_DIVISION_NO_EDIT; - new_send_state.send_end_size = 0; - new_send_state.send_offset = 0; - new_send_state.send_possible_size = 0; - new_send_state.unsend_size = 0; - new_send_state.send_rest_size = 0; - //status initialize to SEND_NG - new_send_state.status = SEND_NG; - //add new status to status_list - recv_data.send_status_list.push_back(new_send_state); - std::list::reverse_iterator new_send_it = recv_data.send_status_list.rbegin(); - //cacl offset - new_send_it->send_offset = recv_data.recive_buffer_max_size - recv_data.recive_buffer_rest_size - - request_data_remain_size; - - //check http method - check_result = check_http_method(recv_data.recive_buffer + new_send_it->send_offset, - request_data_remain_size); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_client_recv() : call check_http_method : " - "return_value = %d. thread id : %d."); - formatter % check_result % boost::this_thread::get_id(); - putLogDebug(10063, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - //check http method result is OK - if (check_result == CHECK_OK) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - //check http version - check_result = check_http_version(recv_data.recive_buffer + new_send_it->send_offset, - request_data_remain_size); - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + std::string datadump; + boost::format formatter("\nitem[%d] : status = %d, send_end_size = %d, " + "send_rest_size = %d, send_possible_size = %d, " + "send_offset = %d, unsend_size = %d, edit_division = %d."); + int i = 0; + for (it = recv_data.send_status_list.begin(); + it != recv_data.send_status_list.end(); + ++it, ++i) { - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_client_recv() : call check_http_version : " - "return_value = %d. thread id : %d."); - formatter % check_result % boost::this_thread::get_id(); - putLogDebug(10064, formatter.str(), __FILE__, __LINE__ ); + formatter % i % it->status % it->send_end_size + % it->send_rest_size % it->send_possible_size + % it->send_offset % it->unsend_size % it->edit_division; + datadump += formatter.str(); } - /*------DEBUG LOG END------*/ + + formatter.parse("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_client_recv() : send status list dump : send status list size = %d.%s"); + + formatter % recv_data.send_status_list.size() % datadump; + putLogDebug(100068, formatter.str(), __FILE__, __LINE__ ); } - //check http method and version result is OK - if (check_result == CHECK_OK) + /*------DEBUG LOG END------*/ + //search for send_possible item in status list + send_status_it it_find = find_if(recv_data.send_status_list.begin(), recv_data.send_status_list.end(), + data_send_possible()); + //the data that can be sent possible is exist + if (it_find != recv_data.send_status_list.end()) { - //search whole http header, get whole http header's offset and length - bret = find_http_header(recv_data.recive_buffer + new_send_it->send_offset, request_data_remain_size, - http_header, header_offset, header_offset_len); - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + //sorry flag is on + if (session_data->sorry_flag == SORRY_FLAG_ON) { - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_client_recv() : call find_http_header : " - "return_value = %d. thread id : %d."); - formatter % check_result % boost::this_thread::get_id(); - putLogDebug(10065, formatter.str(), __FILE__, __LINE__ ); + status = SORRYSERVER_CONNECT; } - /*------DEBUG LOG END------*/ - //searched whole http header - if (bret) + //sorry flag is off + else { - //search ContentLength http header, get ContentLength header's offset and length - bret = find_http_header(recv_data.recive_buffer + new_send_it->send_offset, - request_data_remain_size, content_header, content_length_header_offset, content_length_header_len); - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_client_recv() : call find_http_header : " - "return_value = %d. thread id : %d."); - formatter % static_cast(bret) % boost::this_thread::get_id(); - putLogDebug(10066, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ + status = REALSERVER_CONNECT; + } + } + //the data that can be sent possible is not exist + else + { + status = CLIENT_RECV; + } + } + } + catch (int e) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_client_recv() : catch exception e = %d. thread id : %d."); + formatter % e % boost::this_thread::get_id(); + putLogDebug(100069, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + status = FINALIZE; + } + catch (const std::string& ex) + { + std::cerr << "protocol_module_sessionless::handle_client_recv() : exception : " << ex << std::endl; + boost::format formatter("protocol_module_sessionless::handle_client_recv() : exception : %s. thread id : %d."); + formatter % ex.c_str() % boost::this_thread::get_id(); + putLogError(100033, formatter.str(), __FILE__, __LINE__ ); + status = FINALIZE; + } + catch (const std::bad_alloc&) + { + std::cerr << "protocol_module_sessionless::handle_client_recv() : exception : Could not allocate memory." << std::endl; + boost::format formatter("Could not allocate memory. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100034, formatter.str(), __FILE__, __LINE__ ); + status = FINALIZE; + } + catch (const std::exception& ex) + { + std::cerr << "protocol_module_sessionless::handle_client_recv() : exception : error = " << ex.what() << "." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_client_recv() : exception : error = %s. thread id : %d."); + formatter % ex.what() % boost::this_thread::get_id(); + putLogError(100035, formatter.str(), __FILE__, __LINE__ ); - //searched ContentLength http header - if (bret) - { - //Get Content_Length header's numeric value - for (pos = 0; - recv_data.recive_buffer[new_send_it->send_offset + content_length_header_offset + pos] != ':' - && pos < content_length_header_len; - ++pos); - if (pos == content_length_header_len) - { - throw std::string("Content_Length field's value is invalid."); - } + status = FINALIZE; + } + catch (...) + { + std::cerr << "protocol_module_sessionless::handle_client_recv() : Unknown exception." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG " + "protocol_module_sessionless::handle_client_recv() : " + "Unknown exception. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100036, formatter.str(), __FILE__, __LINE__ ); + status = FINALIZE; + } - ++pos; + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_client_recv(const boost::thread::id thread_id, " + "const boost::array& recvbuffer, " + "const size_t recvlen) : return_value = %d. thread id : %d."); + formatter % status % boost::this_thread::get_id(); + putLogDebug(100070, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ - str_value.assign(recv_data.recive_buffer + new_send_it->send_offset + content_length_header_offset + pos, - content_length_header_len - pos); + return status; + } - size_t pos_end = str_value.find_last_of('\r'); - if (pos_end != std::string::npos) - { - str_value = str_value.erase(pos_end); - } + //! called from after realserver select.use in upstream thread. + //! @param[in] upstream thread id + //! @param[out] realserver TCP endpoint + //! @return session use EVENT mode. + protocol_module_base::EVENT_TAG protocol_module_sessionless::handle_realserver_select( + const boost::thread::id thread_id, boost::asio::ip::tcp::endpoint & rs_endpoint) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("in_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_realserver_select(const boost::thread::id thread_id, " + "boost::asio::ip::tcp::endpoint & rs_endpoint) : " + "thread_id = %d, rs_endpoint = [%s]:%d."); + formatter % thread_id % rs_endpoint.address().to_string() % rs_endpoint.port(); + putLogDebug(100071, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + EVENT_TAG status = FINALIZE; + boost::asio::ip::tcp::endpoint tmp_endpoint; + thread_data_ptr session_data; + session_thread_data_map_it session_thread_it; + session_thread_data_map_it session_thread_it_end; + recive_data_map_it recive_data_it; - for (pos = 0; !isgraph(str_value[pos]) && str_value[pos] != '\0'; ++pos); + if (schedule_tcp.empty()) + { + std::cerr << "protocol_module_sessionless::handle_realserver_select() : Schedule_tcp function is empty." << std::endl; + boost::format formatter("Schedule_tcp function is empty. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100037, formatter.str(), __FILE__, __LINE__ ); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_realserver_select(const boost::thread::id thread_id, " + "boost::asio::ip::tcp::endpoint & rs_endpoint)" + " : return_value = %d. thread id : %d."); + formatter % FINALIZE % boost::this_thread::get_id(); + putLogDebug(100072, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + return FINALIZE; + } - str_value = str_value.substr(pos); - try - { - content_len_value = boost::lexical_cast(str_value.c_str()); - } - catch (const boost::bad_lexical_cast& ex) - { - throw std::string("Content_Length field's value is invalid."); - } - //send_rest_size recalc - //set whole http header's + whole http header's length + Content_Length's value - new_send_it->send_rest_size = header_offset + header_offset_len + cr_lf_len + content_len_value; - } - //not searched ContentLength http header - else - { - //send_rest_size recalc - //set whole http header's + whole http header's length - new_send_it->send_rest_size = header_offset + header_offset_len + cr_lf_len; + try + { + { + boost::mutex::scoped_lock slock(session_thread_data_map_mutex ); - } - //set edit_division flag on - new_send_it->edit_division = EDIT_DIVISION_EDIT; - } - //not searched whole http header - else - { - new_send_it->unsend_size = request_data_remain_size; - request_data_remain_size = 0; - break; - } - } - //check http method or version result is NG - else if (check_result == CHECK_NG) + session_thread_it = session_thread_data_map.find(thread_id); + if (unlikely(session_thread_it == session_thread_data_map.end() || session_thread_it->second == NULL)) { - new_send_it->edit_division = EDIT_DIVISION_NO_EDIT; - new_send_it->send_rest_size = request_data_remain_size; + boost::format formatter("Invalid thread id. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100038, formatter.str(), __FILE__, __LINE__ ); + throw -1; } - //check http method or version result is impossible - else + session_data = session_thread_it->second; + } + + //call schedule_module's schedule function, get realserver endpoint + schedule_tcp(thread_id, rs_list_begin, rs_list_end, rs_list_next, rs_endpoint); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_realserver_select() : call schedule_tcp : " + "rs_endpoint = [%s]:%d. thread id : %d."); + formatter % rs_endpoint.address().to_string() % rs_endpoint.port() % boost::this_thread::get_id(); + putLogDebug(100073, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + //endpoint decide + if (rs_endpoint != tmp_endpoint) + { + //save rs endpoint + session_data->target_endpoint = rs_endpoint; + + recive_data_it = session_data->recive_data_map.find(session_data->client_endpoint_tcp); + if (unlikely(recive_data_it == session_data->recive_data_map.end())) { - new_send_it->unsend_size = request_data_remain_size; - request_data_remain_size = 0; - break; + boost::format formatter("Invalid endpoint. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100039, formatter.str(), __FILE__, __LINE__ ); + throw -1; } + recive_data& recv_data = recive_data_it->second; - //recalc fields value according to send_rest_size and request rest size - if (new_send_it->send_rest_size > request_data_remain_size) + send_status_it it = recv_data.send_status_list.begin(); + send_status_it it_end = recv_data.send_status_list.end(); + + it = find_if(it, it_end, data_send_possible()); + if (it != it_end) { - new_send_it->send_possible_size = request_data_remain_size; - new_send_it->send_rest_size -= request_data_remain_size; - new_send_it->send_end_size = 0; - request_data_remain_size = 0; + status = REALSERVER_CONNECT; } else { - new_send_it->send_possible_size = new_send_it->send_rest_size; - request_data_remain_size -= new_send_it->send_rest_size; - new_send_it->send_end_size = 0; - new_send_it->send_rest_size = 0; + status = CLIENT_RECV; } - - //change status from SEND_NG to SEND_OK - new_send_it->status = SEND_OK; } - - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + else { - std::string datadump; - boost::format formatter("\nitem[%d] : status = %d, send_end_size = %d, " - "send_rest_size = %d, send_possible_size = %d, " - "send_offset = %d, unsend_size = %d, edit_division = %d."); - int i = 0; - for (it = recv_data.send_status_list.begin(); - it != recv_data.send_status_list.end(); - ++it, ++i) - { - formatter % i % it->status % it->send_end_size - % it->send_rest_size % it->send_possible_size - % it->send_offset % it->unsend_size % it->edit_division; - datadump += formatter.str(); - } - - formatter.parse("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_client_recv() : send status list dump : send status list size = %d.%s"); - - formatter % recv_data.send_status_list.size() % datadump; - putLogDebug(10067, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - //search for send_possible item in status list - send_status_it it_find = find_if(recv_data.send_status_list.begin(), recv_data.send_status_list.end(), - data_send_possible()); - //the data that can be sent possible is exist - if (it_find != recv_data.send_status_list.end()) - { - //sorry flag is on - if (session_data->sorry_flag == SORRY_FLAG_ON) - { - status = SORRYSERVER_CONNECT; - } - //sorry flag is off - else + //set end flag on + session_data->end_flag = END_FLAG_ON; + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - status = REALSERVER_CONNECT; + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_realserver_select() : END_FLAG_ON. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogDebug(100074, formatter.str(), __FILE__, __LINE__ ); } + /*------DEBUG LOG END------*/ + status = CLIENT_DISCONNECT; } - //the data that can be sent possible is not exist - else + } + catch (int e) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - status = CLIENT_RECV; + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_realserver_select() : catch exception e = %d. thread id : %d."); + formatter % e % boost::this_thread::get_id(); + putLogDebug(100075, formatter.str(), __FILE__, __LINE__ ); } + status = FINALIZE; + /*------DEBUG LOG END------*/ } - } - catch (int e) - { - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + catch (const std::exception& ex) { + std::cerr << "protocol_module_sessionless::handle_realserver_select() : exception : error = " << ex.what() << "." << std::endl; boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_client_recv() : catch exception e = %d. thread id : %d."); - formatter % e % boost::this_thread::get_id(); - putLogDebug(10068, formatter.str(), __FILE__, __LINE__ ); + "handle_realserver_select() : exception : error = %s. thread id : %d."); + formatter % ex.what() % boost::this_thread::get_id(); + putLogError(100040, formatter.str(), __FILE__, __LINE__ ); + status = FINALIZE; + } + catch (...) + { + std::cerr << "protocol_module_sessionless::handle_realserver_select() : Unknown exception." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG " + "protocol_module_sessionless::handle_realserver_select() : " + "Unknown exception. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100041, formatter.str(), __FILE__, __LINE__ ); + status = FINALIZE; } - /*------DEBUG LOG END------*/ - status = FINALIZE; - } - catch (const std::string& ex) - { - std::cerr << "protocol_module_sessionless::handle_client_recv() : exception : " << ex << std::endl; - boost::format formatter("protocol_module_sessionless::handle_client_recv() : exception : %s. thread id : %d."); - formatter % ex.c_str() % boost::this_thread::get_id(); - putLogError(17032, formatter.str(), __FILE__, __LINE__ ); - status = FINALIZE; - } - catch (const std::bad_alloc&) - { - std::cerr << "protocol_module_sessionless::handle_client_recv() : exception : Could not allocate memory." << std::endl; - boost::format formatter("Could not allocate memory. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogError(17033, formatter.str(), __FILE__, __LINE__ ); - status = FINALIZE; - } - catch (const std::exception& ex) - { - std::cerr << "protocol_module_sessionless::handle_client_recv() : exception : error = " << ex.what() << "." << std::endl; - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_client_recv() : exception : error = %s. thread id : %d."); - formatter % ex.what() % boost::this_thread::get_id(); - putLogError(17034, formatter.str(), __FILE__, __LINE__ ); - - status = FINALIZE; - } - catch (...) - { - std::cerr << "protocol_module_sessionless::handle_client_recv() : Unknown exception." << std::endl; - boost::format formatter("function : protocol_module_base::EVENT_TAG " - "protocol_module_sessionless::handle_client_recv() : " - "Unknown exception. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogError(17035, formatter.str(), __FILE__, __LINE__ ); - status = FINALIZE; - } - - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_client_recv(const boost::thread::id thread_id, " - "const boost::array& recvbuffer, " - "const size_t recvlen) : return_value = %d. thread id : %d."); - formatter % status % boost::this_thread::get_id(); - putLogDebug(10069, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - - return status; -} -//! called from after realserver select.use in upstream thread. -//! @param[in] upstream thread id -//! @param[out] realserver TCP endpoint -//! @return session use EVENT mode. -protocol_module_base::EVENT_TAG protocol_module_sessionless::handle_realserver_select( - const boost::thread::id thread_id, boost::asio::ip::tcp::endpoint & rs_endpoint) -{ - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - boost::format formatter("in_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_realserver_select(const boost::thread::id thread_id, " - "boost::asio::ip::tcp::endpoint & rs_endpoint) : " - "thread_id = %d, rs_endpoint = [%s]:%d."); - formatter % thread_id % rs_endpoint.address().to_string() % rs_endpoint.port(); - putLogDebug(10070, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - EVENT_TAG status = FINALIZE; - boost::asio::ip::tcp::endpoint tmp_endpoint; - thread_data_ptr session_data; - session_thread_data_map_it session_thread_it; - session_thread_data_map_it session_thread_it_end; - - if (schedule_tcp.empty()) - { - std::cerr << "protocol_module_sessionless::handle_realserver_select() : Schedule_tcp function is empty." << std::endl; - boost::format formatter("Schedule_tcp function is empty. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogError(17036, formatter.str(), __FILE__, __LINE__ ); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" "handle_realserver_select(const boost::thread::id thread_id, " "boost::asio::ip::tcp::endpoint & rs_endpoint)" " : return_value = %d. thread id : %d."); - formatter % FINALIZE % boost::this_thread::get_id(); - putLogDebug(10071, formatter.str(), __FILE__, __LINE__ ); + formatter % status % boost::this_thread::get_id(); + putLogDebug(100076, formatter.str(), __FILE__, __LINE__ ); } /*------DEBUG LOG END------*/ - return FINALIZE; + + return status; } - try + //! called from after realserver select + //! @param[in] upstream thread id + //! @param[out] realserver UDP endpoint + //! @param[out] sendbuffer reference + //! @param[out] send data length + //! @return session use EVENT mode. + protocol_module_base::EVENT_TAG protocol_module_sessionless::handle_realserver_select( + const boost::thread::id thread_id, boost::asio::ip::udp::endpoint& rs_endpoint, boost::array& sendbuffer, size_t& datalen) { - { - boost::mutex::scoped_lock slock(session_thread_data_map_mutex); - - session_thread_it = session_thread_data_map.find(thread_id); - if (session_thread_it == session_thread_data_map.end() || session_thread_it->second == NULL) - { - boost::format formatter("Invalid thread id. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogError(17037, formatter.str(), __FILE__, __LINE__ ); - throw -1; - } - - session_data = session_thread_it->second; - } - - //call schedule_module's schedule function, get realserver endpoint - schedule_tcp(thread_id, rs_list_begin, rs_list_end, rs_list_next, rs_endpoint); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_realserver_select() : call schedule_tcp : " - "rs_endpoint = [%s]:%d. thread id : %d."); - formatter % rs_endpoint.address().to_string() % rs_endpoint.port() % boost::this_thread::get_id(); - putLogDebug(10072, formatter.str(), __FILE__, __LINE__ ); + boost::format formatter("in/out_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_realserver_select(const boost::thread::id thread_id, " + "boost::asio::ip::udp::endpoint& rs_endpoint, boost::array& sendbuffer, " + "size_t& datalen) : " + "return_value = %d. thread id : %d."); + formatter % STOP % boost::this_thread::get_id(); + putLogDebug(100077, formatter.str(), __FILE__, __LINE__ ); } /*------DEBUG LOG END------*/ - - //endpoint decide - if (rs_endpoint != tmp_endpoint) - { - //save rs endpoint - session_data->target_endpoint = rs_endpoint; - - status = CLIENT_RECV; - } - else - { - //set end flag on - session_data->end_flag = END_FLAG_ON; - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_realserver_select() : END_FLAG_ON. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogDebug(10073, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - status = CLIENT_DISCONNECT; - } + return STOP; } - catch (int e) + //! called from after realserver connect + //! @param[in] upstream thread id + //! @param[out] sendbuffer reference + //! @param[out] send data length + //! @return session use EVENT mode. + protocol_module_base::EVENT_TAG protocol_module_sessionless::handle_realserver_connect( + const boost::thread::id thread_id, boost::array& sendbuffer, size_t& datalen) { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_realserver_select() : catch exception e = %d. thread id : %d."); - formatter % e % boost::this_thread::get_id(); - putLogDebug(10074, formatter.str(), __FILE__, __LINE__ ); + boost::format formatter("in_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_realserver_connect(const boost::thread::id thread_id, " + "boost::array& sendbuffer, size_t& datalen) : " + "thread_id = %d."); + formatter % thread_id; + putLogDebug(100078, formatter.str(), __FILE__, __LINE__ ); } - status = FINALIZE; /*------DEBUG LOG END------*/ - } - catch (const std::exception& ex) - { - std::cerr << "protocol_module_sessionless::handle_realserver_select() : exception : error = " << ex.what() << "." << std::endl; - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_realserver_select() : exception : error = %s. thread id : %d."); - formatter % ex.what() % boost::this_thread::get_id(); - putLogError(17038, formatter.str(), __FILE__, __LINE__ ); - status = FINALIZE; - } - catch (...) - { - std::cerr << "protocol_module_sessionless::handle_realserver_select() : Unknown exception." << std::endl; - boost::format formatter("function : protocol_module_base::EVENT_TAG " - "protocol_module_sessionless::handle_realserver_select() : " - "Unknown exception. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogError(17039, formatter.str(), __FILE__, __LINE__ ); - status = FINALIZE; - } - - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_realserver_select(const boost::thread::id thread_id, " - "boost::asio::ip::tcp::endpoint & rs_endpoint)" - " : return_value = %d. thread id : %d."); - formatter % status % boost::this_thread::get_id(); - putLogDebug(10075, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - return status; -} + EVENT_TAG status = FINALIZE; + bool ret = false; + size_t header_offset = 0; + size_t header_offset_len = 0; + size_t send_buffer_remian_size = 0; + size_t copy_size = 0; + const int send_buffer_end_size = sendbuffer.max_size(); + const std::string http_header = ""; + const std::string str_forword_for = "X-Forwarded-For"; + thread_data_ptr session_data; + session_thread_data_map_it session_thread_it; + recive_data_map_it recive_data_it; -//! called from after realserver select -//! @param[in] upstream thread id -//! @param[out] realserver UDP endpoint -//! @param[out] sendbuffer reference -//! @param[out] send data length -//! @return session use EVENT mode. -protocol_module_base::EVENT_TAG protocol_module_sessionless::handle_realserver_select( - const boost::thread::id thread_id, boost::asio::ip::udp::endpoint& rs_endpoint, boost::array& sendbuffer, size_t& datalen) -{ - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - boost::format formatter("in/out_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_realserver_select(const boost::thread::id thread_id, " - "boost::asio::ip::udp::endpoint& rs_endpoint, boost::array& sendbuffer, " - "size_t& datalen) : " - "return_value = %d. thread id : %d."); - formatter % STOP % boost::this_thread::get_id(); - putLogDebug(10076, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - return STOP; -} -//! called from after realserver connect -//! @param[in] upstream thread id -//! @param[out] sendbuffer reference -//! @param[out] send data length -//! @return session use EVENT mode. -protocol_module_base::EVENT_TAG protocol_module_sessionless::handle_realserver_connect( - const boost::thread::id thread_id, boost::array& sendbuffer, size_t& datalen) -{ - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - boost::format formatter("in_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_realserver_connect(const boost::thread::id thread_id, " - "boost::array& sendbuffer, size_t& datalen) : " - "thread_id = %d."); - formatter % thread_id; - putLogDebug(10077, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - - EVENT_TAG status = FINALIZE; - bool ret = false; - size_t header_offset = 0; - size_t header_offset_len = 0; - size_t send_buffer_remian_size = 0; - size_t copy_size = 0; - const int send_buffer_end_size = sendbuffer.max_size(); - const std::string http_header = ""; - const std::string str_forword_for = "X-Forwarded-For"; - thread_data_ptr session_data; - session_thread_data_map_it session_thread_it; - recive_data_map_it recive_data_it; - - try - { + try { - boost::mutex::scoped_lock slock(session_thread_data_map_mutex); + { + boost::mutex::scoped_lock slock(session_thread_data_map_mutex ); - //thread id check - session_thread_it = session_thread_data_map.find(thread_id); - if (session_thread_it == session_thread_data_map.end() || session_thread_it->second == NULL) + //thread id check + session_thread_it = session_thread_data_map.find(thread_id); + if (unlikely(session_thread_it == session_thread_data_map.end() || session_thread_it->second == NULL)) + { + boost::format formatter("Invalid thread id. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100042, formatter.str(), __FILE__, __LINE__ ); + throw -1; + } + + session_data = session_thread_it->second; + } + + //endpoint check + recive_data_it = session_data->recive_data_map.find(session_data->client_endpoint_tcp); + if (unlikely(recive_data_it == session_data->recive_data_map.end())) { - boost::format formatter("Invalid thread id. thread id : %d."); + boost::format formatter("Invalid endpoint. thread id : %d."); formatter % boost::this_thread::get_id(); - putLogError(17040, formatter.str(), __FILE__, __LINE__ ); + putLogError(100043, formatter.str(), __FILE__, __LINE__ ); throw -1; } - session_data = session_thread_it->second; - } - - //endpoint check - recive_data_it = session_data->recive_data_map.find(session_data->client_endpoint_tcp); - if (recive_data_it == session_data->recive_data_map.end()) - { - boost::format formatter("Invalid endpoint. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogError(17041, formatter.str(), __FILE__, __LINE__ ); - throw -1; - } - - //recive_buffer pointer check - recive_data& recv_data = recive_data_it->second; - if (recv_data.recive_buffer == NULL) - { - boost::format formatter("Invalid pointer. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogError(17042, formatter.str(), __FILE__, __LINE__ ); - throw -1; - } + //recive_buffer pointer check + recive_data& recv_data = recive_data_it->second; + if (unlikely(recv_data.recive_buffer == NULL)) + { + boost::format formatter("Invalid pointer. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100044, formatter.str(), __FILE__, __LINE__ ); + throw -1; + } - //send list check - send_status_it it = recv_data.send_status_list.begin(); - send_status_it it_end = recv_data.send_status_list.end(); - it = find_if(it, it_end, data_send_possible()); - if (it == it_end) - { - boost::format formatter("Sending possible data is not existed. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogError(17043, formatter.str(), __FILE__, __LINE__ ); - throw -1; - } + //send list check + send_status_it it = recv_data.send_status_list.begin(); + send_status_it it_end = recv_data.send_status_list.end(); + it = find_if(it, it_end, data_send_possible()); + if (unlikely(it == it_end)) + { + boost::format formatter("Sending possible data is not existed. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100045, formatter.str(), __FILE__, __LINE__ ); + throw -1; + } - //send buffer rest size initialization - send_buffer_remian_size = send_buffer_end_size; + //send buffer rest size initialization + send_buffer_remian_size = send_buffer_end_size; - //edit_division flag on - if (it->edit_division == EDIT_DIVISION_EDIT && forwarded_for == FORWARDED_FOR_ON) - { - //edit list is empty - if (it->edit_data_list.empty()) + //edit_division flag on + if (it->edit_division == EDIT_DIVISION_EDIT && forwarded_for == FORWARDED_FOR_ON) { - //edit data create - edit_data edata; - edata.data_size = 0; - edata.insert_posission = 0; - edata.replace_size = 0; - //search X-Forwarded-For header - ret = find_http_header(recv_data.recive_buffer + it->send_offset, it->send_possible_size, - str_forword_for, header_offset, header_offset_len); - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_realserver_connect() : call find_http_header : " - "return_value = %d. thread id : %d."); - formatter % static_cast(ret) % boost::this_thread::get_id(); - putLogDebug(10078, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - //search http header result is OK - if (ret) - { - //edit X-Forwarded-For header, set it to edata.data - edata.data.assign(recv_data.recive_buffer + it->send_offset + header_offset, header_offset_len); - edata.data += ", "; - edata.data += session_data->client_endpoint_tcp.address().to_string(); - //save new X-Forwarded-For header offset - edata.insert_posission = header_offset; - //save new X-Forwarded-For header length - edata.data_size = edata.data.size(); - //save old X-Forwarded-For header length - edata.replace_size = header_offset_len; - } - //search http header result is NG - else + //edit list is empty + if (it->edit_data_list.empty()) { - //search whole http header, get whole http header's offset and length - ret = find_http_header(recv_data.recive_buffer + it->send_offset, it->send_possible_size, "", - header_offset, header_offset_len); + //edit data create + edit_data edata; + edata.data_size = 0; + edata.insert_posission = 0; + edata.replace_size = 0; + //search X-Forwarded-For header + ret = find_http_header(recv_data.recive_buffer + it->send_offset, it->send_possible_size, + str_forword_for, header_offset, header_offset_len); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" "handle_realserver_connect() : call find_http_header : " "return_value = %d. thread id : %d."); formatter % static_cast(ret) % boost::this_thread::get_id(); - putLogDebug(10079, formatter.str(), __FILE__, __LINE__ ); + putLogDebug(100079, formatter.str(), __FILE__, __LINE__ ); } /*------DEBUG LOG END------*/ - if (!ret) + //search http header result is OK + if (ret) { - boost::format formatter("find_http_header() function failure. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogError(17044, formatter.str(), __FILE__, __LINE__ ); + //edit X-Forwarded-For header, set it to edata.data + edata.data.assign(recv_data.recive_buffer + it->send_offset + header_offset, header_offset_len); + edata.data += ", "; + edata.data += session_data->client_endpoint_tcp.address().to_string(); + //save new X-Forwarded-For header offset + edata.insert_posission = header_offset; + //save new X-Forwarded-For header length + edata.data_size = edata.data.size(); + //save old X-Forwarded-For header length + edata.replace_size = header_offset_len; + } + //search http header result is NG + else + { + //search whole http header, get whole http header's offset and length + ret = find_http_header(recv_data.recive_buffer + it->send_offset, it->send_possible_size, "", + header_offset, header_offset_len); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_realserver_connect(const boost::thread::id thread_id, " - "boost::array& sendbuffer, " - "size_t& datalen) : return_value = %d. thread id : %d."); - formatter % FINALIZE % boost::this_thread::get_id(); - putLogDebug(10080, formatter.str(), __FILE__, __LINE__ ); + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_realserver_connect() : call find_http_header : " + "return_value = %d. thread id : %d."); + formatter % static_cast(ret) % boost::this_thread::get_id(); + putLogDebug(100080, formatter.str(), __FILE__, __LINE__ ); } /*------DEBUG LOG END------*/ - return FINALIZE; - } - //create X-Forwarded-For header, put it to edata.data - edata.data = str_forword_for; - edata.data += ": "; - edata.data += session_data->client_endpoint_tcp.address().to_string(); - edata.data += "\r\n"; - //save new X-Forwarded-For header offset - edata.insert_posission = header_offset; - //save new X-Forwarded-For header length - edata.data_size = edata.data.size(); - //save old X-Forwarded-For header length - edata.replace_size = 0; - } - - //add to edit_data_list - it->edit_data_list.push_back(edata); - } - - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_realserver_connect() : Copy data loop start. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogDebug(10081, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - while (true) - { - //edit_data_list is empty - if (it->edit_data_list.empty()) - { - //set edit_division flag on - it->edit_division = EDIT_DIVISION_NO_EDIT; - - if (send_buffer_remian_size > 0 && it->send_possible_size > 0) - { - //send_buffer_remian_size is larger - if (send_buffer_remian_size >= it->send_possible_size) + if (!ret) { - copy_size = it->send_possible_size; + boost::format formatter("find_http_header() function failure. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100046, formatter.str(), __FILE__, __LINE__ ); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - std::string datadump; - dump_memory(recv_data.recive_buffer + it->send_offset + it->send_end_size, - it->send_possible_size, datadump); - boost::format formatter( - "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_realserver_connect() : before memcpy (data dump) : " - "data begin = %d, data_size = %d, data = %s"); - formatter % (it->send_offset + it->send_end_size) - % copy_size % datadump; - putLogDebug(10082, formatter.str(), __FILE__, __LINE__ ); + boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_realserver_connect(const boost::thread::id thread_id, " + "boost::array& sendbuffer, " + "size_t& datalen) : return_value = %d. thread id : %d."); + formatter % FINALIZE % boost::this_thread::get_id(); + putLogDebug(100081, formatter.str(), __FILE__, __LINE__ ); } /*------DEBUG LOG END------*/ - //copy data from recive_buffer to sendbuffer by sending_possible size - memcpy(sendbuffer.data() + send_buffer_end_size - send_buffer_remian_size, - recv_data.recive_buffer + it->send_offset + it->send_end_size, - it->send_possible_size); - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - std::string datadump; - dump_memory(sendbuffer.data() + send_buffer_end_size - send_buffer_remian_size, - it->send_possible_size, datadump); + return FINALIZE; + } + //create X-Forwarded-For header, put it to edata.data + edata.data = str_forword_for; + edata.data += ": "; + edata.data += session_data->client_endpoint_tcp.address().to_string(); + edata.data += "\r\n"; + //save new X-Forwarded-For header offset + edata.insert_posission = header_offset; + //save new X-Forwarded-For header length + edata.data_size = edata.data.size(); + //save old X-Forwarded-For header length + edata.replace_size = 0; + } - boost::format formatter( - "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_realserver_connect() : after memcpy (data dump) : " - "data begin = %d, data_size = %d, data = %s"); - formatter % (send_buffer_end_size - send_buffer_remian_size) - % copy_size % datadump; - putLogDebug(10083, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ + //add to edit_data_list + it->edit_data_list.push_back(edata); + } - it->send_end_size += copy_size; - it->send_possible_size = 0; - send_buffer_remian_size -= copy_size; + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_realserver_connect() : Copy data loop start. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogDebug(100082, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + while (true) + { + //edit_data_list is empty + if (it->edit_data_list.empty()) + { + //set edit_division flag on + it->edit_division = EDIT_DIVISION_NO_EDIT; + + if (send_buffer_remian_size > 0 && it->send_possible_size > 0) + { + //send_buffer_remian_size is larger + if (send_buffer_remian_size >= it->send_possible_size) + { + copy_size = it->send_possible_size; + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + dump_memory(recv_data.recive_buffer + it->send_offset + it->send_end_size, + it->send_possible_size, datadump); + boost::format formatter( + "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_realserver_connect() : before memcpy (data dump) : " + "data begin = %d, data_size = %d, data = %s"); + formatter % (it->send_offset + it->send_end_size) + % copy_size % datadump; + putLogDebug(100083, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + //copy data from recive_buffer to sendbuffer by sending_possible size + memcpy(sendbuffer.data() + send_buffer_end_size - send_buffer_remian_size, + recv_data.recive_buffer + it->send_offset + it->send_end_size, + it->send_possible_size); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + dump_memory(sendbuffer.data() + send_buffer_end_size - send_buffer_remian_size, + it->send_possible_size, datadump); + + boost::format formatter( + "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_realserver_connect() : after memcpy (data dump) : " + "data begin = %d, data_size = %d, data = %s"); + formatter % (send_buffer_end_size - send_buffer_remian_size) + % copy_size % datadump; + putLogDebug(100084, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + it->send_end_size += copy_size; + it->send_possible_size = 0; + send_buffer_remian_size -= copy_size; + } + //send_possible_size is larger + else + { + copy_size = send_buffer_remian_size; + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + dump_memory(recv_data.recive_buffer + it->send_offset + it->send_end_size, + copy_size, datadump); + + boost::format formatter( + "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_realserver_connect() : before memcpy (data dump) : " + "data begin = %d, data_size = %d, data = %s"); + formatter % (it->send_offset + it->send_end_size) + % copy_size % datadump; + putLogDebug(100085, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + //copy data from recive_buffer to sendbuffer by send buffer rest size + memcpy(sendbuffer.data() + send_buffer_end_size - send_buffer_remian_size, + recv_data.recive_buffer + it->send_offset + it->send_end_size, copy_size); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + dump_memory(sendbuffer.data() + send_buffer_end_size - send_buffer_remian_size, + copy_size, datadump); + + boost::format formatter( + "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_realserver_connect() : after memcpy (data dump) : " + "data begin = %d, data_size = %d, data = %s"); + formatter % (send_buffer_end_size - send_buffer_remian_size) + % copy_size % datadump; + putLogDebug(100086, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + it->send_end_size += copy_size; + it->send_possible_size -= copy_size; + send_buffer_remian_size = 0; + } } - //send_possible_size is larger - else + break; + } + //edit_data_list is not empty + else + { + //find the item in the list which has mininum insert_posission + std::list::iterator edit_min = std::min_element(it->edit_data_list.begin(), + it->edit_data_list.end()); + //send_buffer_remian_size is larger than data that before X-Forwarded-For + if (send_buffer_remian_size >= edit_min->insert_posission - it->send_end_size) { - copy_size = send_buffer_remian_size; + //copy data before X-Forwarded-For + copy_size = edit_min->insert_posission - it->send_end_size; /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { std::string datadump; dump_memory(recv_data.recive_buffer + it->send_offset + it->send_end_size, @@ -2578,939 +2688,1004 @@ protocol_module_base::EVENT_TAG protocol_module_sessionless::handle_realserver_c "data begin = %d, data_size = %d, data = %s"); formatter % (it->send_offset + it->send_end_size) % copy_size % datadump; - putLogDebug(10084, formatter.str(), __FILE__, __LINE__ ); + putLogDebug(100087, formatter.str(), __FILE__, __LINE__ ); } /*------DEBUG LOG END------*/ - //copy data from recive_buffer to sendbuffer by send buffer rest size memcpy(sendbuffer.data() + send_buffer_end_size - send_buffer_remian_size, recv_data.recive_buffer + it->send_offset + it->send_end_size, copy_size); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { std::string datadump; dump_memory(sendbuffer.data() + send_buffer_end_size - send_buffer_remian_size, copy_size, datadump); - boost::format formatter( "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" "handle_realserver_connect() : after memcpy (data dump) : " "data begin = %d, data_size = %d, data = %s"); formatter % (send_buffer_end_size - send_buffer_remian_size) % copy_size % datadump; - putLogDebug(10085, formatter.str(), __FILE__, __LINE__ ); + putLogDebug(100088, formatter.str(), __FILE__, __LINE__ ); } /*------DEBUG LOG END------*/ it->send_end_size += copy_size; it->send_possible_size -= copy_size; - send_buffer_remian_size = 0; - } - } - break; - } - //edit_data_list is not empty - else - { - //find the item in the list which has mininum insert_posission - std::list::iterator edit_min = std::min_element(it->edit_data_list.begin(), - it->edit_data_list.end()); - //send_buffer_remian_size is larger than data that before X-Forwarded-For - if (send_buffer_remian_size >= edit_min->insert_posission - it->send_end_size) - { - //copy data before X-Forwarded-For - copy_size = edit_min->insert_posission - it->send_end_size; - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - std::string datadump; - dump_memory(recv_data.recive_buffer + it->send_offset + it->send_end_size, - copy_size, datadump); + send_buffer_remian_size -= copy_size; - boost::format formatter( - "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_realserver_connect() : before memcpy (data dump) : " - "data begin = %d, data_size = %d, data = %s"); - formatter % (it->send_offset + it->send_end_size) - % copy_size % datadump; - putLogDebug(10086, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - memcpy(sendbuffer.data() + send_buffer_end_size - send_buffer_remian_size, - recv_data.recive_buffer + it->send_offset + it->send_end_size, copy_size); - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - std::string datadump; - dump_memory(sendbuffer.data() + send_buffer_end_size - send_buffer_remian_size, - copy_size, datadump); - boost::format formatter( - "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_realserver_connect() : after memcpy (data dump) : " - "data begin = %d, data_size = %d, data = %s"); - formatter % (send_buffer_end_size - send_buffer_remian_size) - % copy_size % datadump; - putLogDebug(10087, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - it->send_end_size += copy_size; - it->send_possible_size -= copy_size; - send_buffer_remian_size -= copy_size; + //there is remain buffer for copy X-Forwarded-For + if (send_buffer_remian_size >= edit_min->data_size) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + dump_memory(edit_min->data.c_str(), + edit_min->data_size, datadump); - //there is remain buffer for copy X-Forwarded-For - if (send_buffer_remian_size >= edit_min->data_size) + boost::format formatter( + "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_realserver_connect() : before memcpy (data dump) : " + "data begin = 0, data_size = %d, data = %s"); + formatter % edit_min->data_size % datadump; + putLogDebug(100089, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + //copy X-Forwarded-For + memcpy(sendbuffer.data() + send_buffer_end_size - send_buffer_remian_size, + edit_min->data.c_str(), edit_min->data_size); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + dump_memory(sendbuffer.data() + send_buffer_end_size - send_buffer_remian_size, + edit_min->data_size, datadump); + boost::format formatter( + "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_realserver_connect() : after memcpy (data dump) : " + "data begin = %d, data_size = %d, data = %s"); + formatter % (send_buffer_end_size - send_buffer_remian_size) + % edit_min->data_size % datadump; + putLogDebug(100090, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + it->send_end_size += edit_min->replace_size; + it->send_possible_size -= edit_min->replace_size; + send_buffer_remian_size -= edit_min->data_size; + it->edit_data_list.erase(edit_min); + } + // + else + { + break; + } + } + //data that before X-Forwarded-For is larger than send_buffer_remian_size + else { + copy_size = send_buffer_remian_size; /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { std::string datadump; - dump_memory(edit_min->data.c_str(), - edit_min->data_size, datadump); + dump_memory(recv_data.recive_buffer + it->send_offset + it->send_end_size, + copy_size, datadump); boost::format formatter( "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" "handle_realserver_connect() : before memcpy (data dump) : " - "data begin = 0, data_size = %d, data = %s"); - formatter % edit_min->data_size % datadump; - putLogDebug(10088, formatter.str(), __FILE__, __LINE__ ); + "data begin = %d, data_size = %d, data = %s"); + formatter % (it->send_offset + it->send_end_size) + % copy_size % datadump; + putLogDebug(100091, formatter.str(), __FILE__, __LINE__ ); } /*------DEBUG LOG END------*/ - //copy X-Forwarded-For + //copy data as large as possible memcpy(sendbuffer.data() + send_buffer_end_size - send_buffer_remian_size, - edit_min->data.c_str(), edit_min->data_size); + recv_data.recive_buffer + it->send_offset + it->send_end_size, copy_size); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { std::string datadump; dump_memory(sendbuffer.data() + send_buffer_end_size - send_buffer_remian_size, - edit_min->data_size, datadump); + copy_size, datadump); + boost::format formatter( "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" "handle_realserver_connect() : after memcpy (data dump) : " "data begin = %d, data_size = %d, data = %s"); formatter % (send_buffer_end_size - send_buffer_remian_size) - % edit_min->data_size % datadump; - putLogDebug(10089, formatter.str(), __FILE__, __LINE__ ); + % copy_size % datadump; + putLogDebug(100092, formatter.str(), __FILE__, __LINE__ ); } /*------DEBUG LOG END------*/ - it->send_end_size += edit_min->replace_size; - it->send_possible_size -= edit_min->replace_size; - send_buffer_remian_size -= edit_min->data_size; - it->edit_data_list.erase(edit_min); - } - // - else - { - break; - } - } - //data that before X-Forwarded-For is larger than send_buffer_remian_size - else - { - copy_size = send_buffer_remian_size; - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - std::string datadump; - dump_memory(recv_data.recive_buffer + it->send_offset + it->send_end_size, - copy_size, datadump); - - boost::format formatter( - "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_realserver_connect() : before memcpy (data dump) : " - "data begin = %d, data_size = %d, data = %s"); - formatter % (it->send_offset + it->send_end_size) - % copy_size % datadump; - putLogDebug(10090, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - //copy data as large as possible - memcpy(sendbuffer.data() + send_buffer_end_size - send_buffer_remian_size, - recv_data.recive_buffer + it->send_offset + it->send_end_size, copy_size); - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - std::string datadump; - dump_memory(sendbuffer.data() + send_buffer_end_size - send_buffer_remian_size, - copy_size, datadump); - boost::format formatter( - "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_realserver_connect() : after memcpy (data dump) : " - "data begin = %d, data_size = %d, data = %s"); - formatter % (send_buffer_end_size - send_buffer_remian_size) - % copy_size % datadump; - putLogDebug(10091, formatter.str(), __FILE__, __LINE__ ); + it->send_end_size += copy_size; + it->send_possible_size -= copy_size; + send_buffer_remian_size -= copy_size; + break; } - /*------DEBUG LOG END------*/ - - it->send_end_size += copy_size; - it->send_possible_size -= copy_size; - send_buffer_remian_size -= copy_size; - break; } } - } - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_realserver_connect() : Copy data loop end. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogDebug(10092, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - } - //edit_division flag is off - else - { - //copy data as large as possible - //send_possible_size is larger - if (send_buffer_remian_size >= it->send_possible_size) - { - copy_size = it->send_possible_size; - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - std::string datadump; - dump_memory(recv_data.recive_buffer + it->send_offset, - copy_size, datadump); - boost::format formatter( - "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_realserver_connect() : before memcpy (data dump) : " - "data begin = %d, data_size = %d, data = %s"); - formatter % it->send_offset - % copy_size % datadump; - putLogDebug(10093, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - //copy data by send_possible size - memcpy(sendbuffer.data(), recv_data.recive_buffer + it->send_offset, copy_size); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - std::string datadump; - dump_memory(sendbuffer.data(), copy_size, datadump); - boost::format formatter( - "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_realserver_connect() : after memcpy (data dump) : " - "data begin = 0, data_size = %d, data = %s"); - formatter % copy_size % datadump; - putLogDebug(10094, formatter.str(), __FILE__, __LINE__ ); + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_realserver_connect() : Copy data loop end. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogDebug(100093, formatter.str(), __FILE__, __LINE__ ); } /*------DEBUG LOG END------*/ - it->send_end_size = copy_size; - it->send_possible_size = 0; - send_buffer_remian_size -= copy_size; } - //buffer rest size is larger + //edit_division flag is off else { - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + //copy data as large as possible + //send_possible_size is larger + if (send_buffer_remian_size >= it->send_possible_size) { - std::string datadump; - dump_memory(recv_data.recive_buffer + it->send_offset, send_buffer_remian_size, datadump); - - boost::format formatter( - "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_realserver_connect() : before memcpy (data dump) : " - "data begin = %d, data_size = %d, data = %s"); - formatter % it->send_offset - % send_buffer_remian_size % datadump; - putLogDebug(10095, formatter.str(), __FILE__, __LINE__ ); + copy_size = it->send_possible_size; + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + dump_memory(recv_data.recive_buffer + it->send_offset, + copy_size, datadump); + boost::format formatter( + "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_realserver_connect() : before memcpy (data dump) : " + "data begin = %d, data_size = %d, data = %s"); + formatter % it->send_offset + % copy_size % datadump; + putLogDebug(100094, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + //copy data by send_possible size + memcpy(sendbuffer.data(), recv_data.recive_buffer + it->send_offset, copy_size); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + dump_memory(sendbuffer.data(), copy_size, datadump); + boost::format formatter( + "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_realserver_connect() : after memcpy (data dump) : " + "data begin = 0, data_size = %d, data = %s"); + formatter % copy_size % datadump; + putLogDebug(100095, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + it->send_end_size = copy_size; + it->send_possible_size = 0; + send_buffer_remian_size -= copy_size; } - /*------DEBUG LOG END------*/ - //copy data by buffer rest size - memcpy(sendbuffer.data(), recv_data.recive_buffer + it->send_offset, send_buffer_remian_size); - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + //buffer rest size is larger + else { - std::string datadump; - dump_memory(sendbuffer.data(), send_buffer_remian_size, datadump); - boost::format formatter( - "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_realserver_connect() : after memcpy (data dump) : " - "data begin = 0, data_size = %d, data = %s"); - formatter % send_buffer_remian_size % datadump; - putLogDebug(10096, formatter.str(), __FILE__, __LINE__ ); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + dump_memory(recv_data.recive_buffer + it->send_offset, send_buffer_remian_size, datadump); + + boost::format formatter( + "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_realserver_connect() : before memcpy (data dump) : " + "data begin = %d, data_size = %d, data = %s"); + formatter % it->send_offset + % send_buffer_remian_size % datadump; + putLogDebug(100096, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + //copy data by buffer rest size + memcpy(sendbuffer.data(), recv_data.recive_buffer + it->send_offset, send_buffer_remian_size); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + dump_memory(sendbuffer.data(), send_buffer_remian_size, datadump); + boost::format formatter( + "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_realserver_connect() : after memcpy (data dump) : " + "data begin = 0, data_size = %d, data = %s"); + formatter % send_buffer_remian_size % datadump; + putLogDebug(100097, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + it->send_end_size = send_buffer_remian_size; + it->send_possible_size -= send_buffer_remian_size; + send_buffer_remian_size = 0; } - /*------DEBUG LOG END------*/ - it->send_end_size = send_buffer_remian_size; - it->send_possible_size -= send_buffer_remian_size; - send_buffer_remian_size = 0; } - } - //set copyed data length - datalen = send_buffer_end_size - send_buffer_remian_size; - status = REALSERVER_SEND; - } - catch (int e) - { - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + //set copyed data length + datalen = send_buffer_end_size - send_buffer_remian_size; + status = REALSERVER_SEND; + } + catch (int e) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_realserver_connect() : catch exception e = %d. thread id : %d."); + formatter % e % boost::this_thread::get_id(); + putLogDebug(100098, formatter.str(), __FILE__, __LINE__ ); + } + status = FINALIZE; + /*------DEBUG LOG END------*/ + } + catch (const std::exception& ex) { + std::cerr << "protocol_module_sessionless::handle_realserver_connect() : exception : error = " << ex.what() << "." << std::endl; boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_realserver_connect() : catch exception e = %d. thread id : %d."); - formatter % e % boost::this_thread::get_id(); - putLogDebug(10097, formatter.str(), __FILE__, __LINE__ ); + "handle_realserver_connect() : exception : error = %s. thread id : %d."); + formatter % ex.what() % boost::this_thread::get_id(); + putLogError(100047, formatter.str(), __FILE__, __LINE__ ); + status = FINALIZE; } - status = FINALIZE; - /*------DEBUG LOG END------*/ - } - catch (const std::exception& ex) - { - std::cerr << "protocol_module_sessionless::handle_realserver_connect() : exception : error = " << ex.what() << "." << std::endl; - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_realserver_connect() : exception : error = %s. thread id : %d."); - formatter % ex.what() % boost::this_thread::get_id(); - putLogError(17045, formatter.str(), __FILE__, __LINE__ ); - status = FINALIZE; - } - catch (...) - { - std::cerr << "protocol_module_sessionless::handle_realserver_connect() : Unknown exception." << std::endl; - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_realserver_connect() : Unknown exception. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogError(17046, formatter.str(), __FILE__, __LINE__ ); - status = FINALIZE; - } - - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_realserver_connect(const boost::thread::id thread_id, " - "boost::array& sendbuffer, " - "size_t& datalen) : return_value = %d. thread id : %d."); - formatter % status % boost::this_thread::get_id(); - putLogDebug(10098, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - - return status; -} - -//! called from after realserver connection fail -//! @param[in] upstream thread id -//! @param[in] fail realserver endpoint reference -//! @return session use EVENT mode. -protocol_module_base::EVENT_TAG protocol_module_sessionless::handle_realserver_connection_fail( - const boost::thread::id thread_id, const boost::asio::ip::tcp::endpoint & rs_endpoint) -{ - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - boost::format formatter("in_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_realserver_connection_fail(const boost::thread::id thread_id, " - "const boost::asio::ip::tcp::endpoint & rs_endpoint) : " - "thread_id = %d, rs_endpoint = [%s]:%d."); - formatter % thread_id % rs_endpoint.address().to_string() % rs_endpoint.port(); - putLogDebug(10099, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - - EVENT_TAG status = FINALIZE; - thread_data_ptr session_data; - session_thread_data_map_it session_thread_it; - - try - { - boost::mutex::scoped_lock slock(session_thread_data_map_mutex); - - session_thread_it = session_thread_data_map.find(thread_id); - if (session_thread_it == session_thread_data_map.end() || session_thread_it->second == NULL) + catch (...) { - boost::format formatter("Invalid thread id. thread id : %d."); + std::cerr << "protocol_module_sessionless::handle_realserver_connect() : Unknown exception." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_realserver_connect() : Unknown exception. thread id : %d."); formatter % boost::this_thread::get_id(); - putLogError(17047, formatter.str(), __FILE__, __LINE__ ); - throw -1; + putLogError(100048, formatter.str(), __FILE__, __LINE__ ); + status = FINALIZE; } - session_data = session_thread_it->second; - - //set end flag ON - session_data->end_flag = END_FLAG_ON; /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_realserver_connection_fail() : END_FLAG_ON. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogDebug(10100, formatter.str(), __FILE__, __LINE__ ); + boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_realserver_connect(const boost::thread::id thread_id, " + "boost::array& sendbuffer, " + "size_t& datalen) : return_value = %d. thread id : %d."); + formatter % status % boost::this_thread::get_id(); + putLogDebug(100099, formatter.str(), __FILE__, __LINE__ ); } /*------DEBUG LOG END------*/ - status = CLIENT_DISCONNECT; + + return status; } - catch (int e) + + //! called from after realserver connection fail + //! @param[in] upstream thread id + //! @param[in] fail realserver endpoint reference + //! @return session use EVENT mode. + protocol_module_base::EVENT_TAG protocol_module_sessionless::handle_realserver_connection_fail( + const boost::thread::id thread_id, const boost::asio::ip::tcp::endpoint & rs_endpoint) { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_realserver_connection_fail() : catch exception e = %d. thread id : %d."); - formatter % e % boost::this_thread::get_id(); - putLogDebug(10101, formatter.str(), __FILE__, __LINE__ ); + boost::format formatter("in_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_realserver_connection_fail(const boost::thread::id thread_id, " + "const boost::asio::ip::tcp::endpoint & rs_endpoint) : " + "thread_id = %d, rs_endpoint = [%s]:%d."); + formatter % thread_id % rs_endpoint.address().to_string() % rs_endpoint.port(); + putLogDebug(100100, formatter.str(), __FILE__, __LINE__ ); } - status = FINALIZE; /*------DEBUG LOG END------*/ - } - catch (std::exception& ex) - { - std::cerr << "protocol_module_sessionless::handle_realserver_connection_fail() : exception : error = " << ex.what() << "." << std::endl; - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_realserver_connection_fail() : exception : error = %s. thread id : %d."); - formatter % ex.what() % boost::this_thread::get_id(); - putLogError(17048, formatter.str(), __FILE__, __LINE__ ); - status = FINALIZE; - } - catch (...) - { - std::cerr << "protocol_module_sessionless::handle_realserver_connection_fail() : Unknown exception." << std::endl; - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_realserver_connection_fail() : Unknown exception. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogError(17049, formatter.str(), __FILE__, __LINE__ ); - status = FINALIZE; - } - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_realserver_connection_fail(const boost::thread::id thread_id, " - "const boost::asio::ip::tcp::endpoint & rs_endpoint) : return_value = %d. thread id : %d."); - formatter % status % boost::this_thread::get_id(); - putLogDebug(10102, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - return status; -} -//! called from after realserver send. -//! @param[in] upstream thread id -//! @return session use EVENT mode. -protocol_module_base::EVENT_TAG protocol_module_sessionless::handle_realserver_send( - const boost::thread::id thread_id) -{ - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - boost::format formatter("in_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_realserver_send(const boost::thread::id thread_id) : " - "thread_id = %d."); - formatter % thread_id; - putLogDebug(10103, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - EVENT_TAG status = FINALIZE; - thread_data_ptr session_data; - session_thread_data_map_it session_thread_it; - recive_data_map_it recive_data_it; + EVENT_TAG status = FINALIZE; + thread_data_ptr session_data; + session_thread_data_map_it session_thread_it; - try - { + try { - boost::mutex::scoped_lock sclock(session_thread_data_map_mutex); + boost::mutex::scoped_lock slock(session_thread_data_map_mutex ); - //thread_id check session_thread_it = session_thread_data_map.find(thread_id); - if (session_thread_it == session_thread_data_map.end() || session_thread_it->second == NULL) + if (unlikely(session_thread_it == session_thread_data_map.end() || session_thread_it->second == NULL)) { boost::format formatter("Invalid thread id. thread id : %d."); formatter % boost::this_thread::get_id(); - putLogError(17050, formatter.str(), __FILE__, __LINE__ ); + putLogError(100049, formatter.str(), __FILE__, __LINE__ ); throw -1; } session_data = session_thread_it->second; - } - //endpoint check - recive_data_it = session_data->recive_data_map.find(session_data->client_endpoint_tcp); - if (recive_data_it == session_data->recive_data_map.end()) + //set end flag ON + session_data->end_flag = END_FLAG_ON; + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_realserver_connection_fail() : END_FLAG_ON. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogDebug(100101, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + status = CLIENT_DISCONNECT; + } + catch (int e) { - boost::format formatter("Invalid endpoint. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogError(17051, formatter.str(), __FILE__, __LINE__ ); - throw -1; + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_realserver_connection_fail() : catch exception e = %d. thread id : %d."); + formatter % e % boost::this_thread::get_id(); + putLogDebug(100102, formatter.str(), __FILE__, __LINE__ ); + } + status = FINALIZE; + /*------DEBUG LOG END------*/ } - - recive_data& recv_data = recive_data_it->second; - - send_status_it it = recv_data.send_status_list.begin(); - send_status_it it_end = recv_data.send_status_list.end(); - - //status list check - it = std::adjacent_find(it, it_end, data_send_list_incorrect()); - if (it != it_end) + catch (std::exception& ex) + { + std::cerr << "protocol_module_sessionless::handle_realserver_connection_fail() : exception : error = " << ex.what() << "." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_realserver_connection_fail() : exception : error = %s. thread id : %d."); + formatter % ex.what() % boost::this_thread::get_id(); + putLogError(100050, formatter.str(), __FILE__, __LINE__ ); + status = FINALIZE; + } + catch (...) { - boost::format formatter("Sending possible data is invalid. thread id : %d."); + std::cerr << "protocol_module_sessionless::handle_realserver_connection_fail() : Unknown exception." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_realserver_connection_fail() : Unknown exception. thread id : %d."); formatter % boost::this_thread::get_id(); - putLogError(17052, formatter.str(), __FILE__, __LINE__ ); - throw -1; + putLogError(100051, formatter.str(), __FILE__, __LINE__ ); + status = FINALIZE; } - //status list check - it = recv_data.send_status_list.begin(); - it = std::find_if(it, it_end, data_send_ok()); - if (it == it_end) + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - boost::format formatter("Sending possible data is not existed. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogError(17053, formatter.str(), __FILE__, __LINE__ ); - throw -1; + boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_realserver_connection_fail(const boost::thread::id thread_id, " + "const boost::asio::ip::tcp::endpoint & rs_endpoint) : return_value = %d. thread id : %d."); + formatter % status % boost::this_thread::get_id(); + putLogDebug(100103, formatter.str(), __FILE__, __LINE__ ); } + /*------DEBUG LOG END------*/ + return status; + } + //! called from after realserver send. + //! @param[in] upstream thread id + //! @return session use EVENT mode. + protocol_module_base::EVENT_TAG protocol_module_sessionless::handle_realserver_send( + const boost::thread::id thread_id) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("in_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_realserver_send(const boost::thread::id thread_id) : " + "thread_id = %d."); + formatter % thread_id; + putLogDebug(100104, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + EVENT_TAG status = FINALIZE; + thread_data_ptr session_data; + session_thread_data_map_it session_thread_it; + recive_data_map_it recive_data_it; - //sending possible data is exist - if (it->send_possible_size > 0) + try { - //status remain SEND_OK - it->status = SEND_OK; - //offset recalc - it->send_offset += it->send_end_size; + { + boost::mutex::scoped_lock sclock(session_thread_data_map_mutex); + + //thread_id check + session_thread_it = session_thread_data_map.find(thread_id); + if (unlikely(session_thread_it == session_thread_data_map.end() || session_thread_it->second == NULL)) + { + boost::format formatter("Invalid thread id. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100052, formatter.str(), __FILE__, __LINE__ ); + throw -1; + } + + session_data = session_thread_it->second; + } + + //endpoint check + recive_data_it = session_data->recive_data_map.find(session_data->client_endpoint_tcp); + if (unlikely(recive_data_it == session_data->recive_data_map.end())) + { + boost::format formatter("Invalid endpoint. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100053, formatter.str(), __FILE__, __LINE__ ); + throw -1; + } + + recive_data& recv_data = recive_data_it->second; - //insert_posission recalc - for (std::list::iterator list_it = it->edit_data_list.begin(); list_it - != it->edit_data_list.end(); ++list_it) + send_status_it it = recv_data.send_status_list.begin(); + send_status_it it_end = recv_data.send_status_list.end(); + + //status list check + it = std::adjacent_find(it, it_end, data_send_list_incorrect()); + if (unlikely(it != it_end)) { - list_it->insert_posission -= it->send_end_size; + boost::format formatter("Sending possible data is invalid. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100054, formatter.str(), __FILE__, __LINE__ ); + throw -1; } - //send_end_size recalc - it->send_end_size = 0; - } - //sending possible data is not exist - else - { - //can recive from client continue - if (it->send_rest_size > 0) + //status list check + it = recv_data.send_status_list.begin(); + it = std::find_if(it, it_end, data_send_ok()); + if (unlikely(it == it_end)) + { + boost::format formatter("Sending possible data is not existed. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100055, formatter.str(), __FILE__, __LINE__ ); + throw -1; + } + + //sending possible data is exist + if (it->send_possible_size > 0) + { + //status remain SEND_OK + it->status = SEND_OK; + //offset recalc + it->send_offset += it->send_end_size; + + //insert_posission recalc + for (std::list::iterator list_it = it->edit_data_list.begin(); list_it + != it->edit_data_list.end(); ++list_it) + { + list_it->insert_posission -= it->send_end_size; + } + + //send_end_size recalc + it->send_end_size = 0; + } + //sending possible data is not exist + else + { + //can recive from client continue + if (it->send_rest_size > 0) + { + //change status from SEND_OK to SEND_CONTINUE + it->status = SEND_CONTINUE; + } + //can not recive from client continue + else + { + //change status from SEND_OK to SEND_END + it->status = SEND_END; + } + } + + it = recv_data.send_status_list.begin(); + it = find_if(it, it_end, data_send_ok()); + //send_ok item is exist + if (it != it_end) { - //change status from SEND_OK to SEND_CONTINUE - it->status = SEND_CONTINUE; + status = REALSERVER_CONNECT; } - //can not recive from client continue + //send_ok item is exist else { - //change status from SEND_OK to SEND_END - it->status = SEND_END; + status = CLIENT_RECV; } - } - it = recv_data.send_status_list.begin(); - it = find_if(it, it_end, data_send_ok()); - //send_ok item is exist - if (it != it_end) - { - status = REALSERVER_CONNECT; } - //send_ok item is exist - else + catch (int e) { - status = CLIENT_RECV; + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_realserver_send() : catch exception e = %d. thread id : %d."); + formatter % e % boost::this_thread::get_id(); + putLogDebug(100105, formatter.str(), __FILE__, __LINE__ ); + } + status = FINALIZE; + /*------DEBUG LOG END------*/ } - - } - catch (int e) - { - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + catch (const std::exception& ex) { + std::cerr << "protocol_module_sessionless::handle_realserver_send() : exception : error = " << ex.what() << "." << std::endl; boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_realserver_send() : catch exception e = %d. thread id : %d."); - formatter % e % boost::this_thread::get_id(); - putLogDebug(10104, formatter.str(), __FILE__, __LINE__ ); - } - status = FINALIZE; - /*------DEBUG LOG END------*/ - } - catch (const std::exception& ex) - { - std::cerr << "protocol_module_sessionless::handle_realserver_send() : exception : error = " << ex.what() << "." << std::endl; - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_realserver_send() : exception : error = %s. thread id : %d."); - formatter % ex.what() % boost::this_thread::get_id(); - putLogError(17054, formatter.str(), __FILE__, __LINE__ ); - - status = FINALIZE; - } - catch (...) - { - std::cerr << "protocol_module_sessionless::handle_realserver_send() : Unknown exception." << std::endl; - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_realserver_send() : Unknown exception. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogError(17055, formatter.str(), __FILE__, __LINE__ ); - status = FINALIZE; - } + "handle_realserver_send() : exception : error = %s. thread id : %d."); + formatter % ex.what() % boost::this_thread::get_id(); + putLogError(100056, formatter.str(), __FILE__, __LINE__ ); - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_realserver_send(const boost::thread::id thread_id) : return_value = %d. thread id : %d."); - formatter % status % boost::this_thread::get_id(); - putLogDebug(10105, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - - return status; -} - -//! called from after sorryserver select -//! @param[in] upstream thread id -//! @param[in] sorryserver endpiont reference -//! @return session use EVENT mode. -protocol_module_base::EVENT_TAG protocol_module_sessionless::handle_sorryserver_select( - const boost::thread::id thread_id, boost::asio::ip::tcp::endpoint& sorry_endpoint) -{ - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - boost::format formatter("in_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorryserver_select(const boost::thread::id thread_id, " - "boost::asio::ip::tcp::endpoint& sorry_endpoint) : " - "thread_id = %d, sorry_endpoint = [%s]:%d."); - formatter % thread_id % sorry_endpoint.address().to_string() % sorry_endpoint.port(); - putLogDebug(10106, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - EVENT_TAG status = FINALIZE; - boost::asio::ip::tcp::endpoint client_endpoint; - - thread_data_ptr session_data; - session_thread_data_map_it session_thread_it; - recive_data_map_it recive_data_it; - - try - { - boost::mutex::scoped_lock sclock(session_thread_data_map_mutex); - - session_thread_it = session_thread_data_map.find(thread_id); - if (session_thread_it == session_thread_data_map.end() || session_thread_it->second== NULL) + status = FINALIZE; + } + catch (...) { - boost::format formatter("Invalid thread id. thread id : %d."); + std::cerr << "protocol_module_sessionless::handle_realserver_send() : Unknown exception." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_realserver_send() : Unknown exception. thread id : %d."); formatter % boost::this_thread::get_id(); - putLogError(17056, formatter.str(), __FILE__, __LINE__ ); - throw -1; + putLogError(100057, formatter.str(), __FILE__, __LINE__ ); + status = FINALIZE; } - session_data = session_thread_it->second; - //set sorry_endpoint - session_data->target_endpoint = sorry_endpoint; + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_realserver_send(const boost::thread::id thread_id) : return_value = %d. thread id : %d."); + formatter % status % boost::this_thread::get_id(); + putLogDebug(100106, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ - status = CLIENT_RECV; + return status; } - catch (int e) + + //! called from after sorryserver select + //! @param[in] upstream thread id + //! @param[in] sorryserver endpiont reference + //! @return session use EVENT mode. + protocol_module_base::EVENT_TAG protocol_module_sessionless::handle_sorryserver_select( + const boost::thread::id thread_id, boost::asio::ip::tcp::endpoint& sorry_endpoint) { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorryserver_select() : catch exception e = %d. thread id : %d."); - formatter % e % boost::this_thread::get_id(); - putLogDebug(10107, formatter.str(), __FILE__, __LINE__ ); + boost::format formatter("in_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorryserver_select(const boost::thread::id thread_id, " + "boost::asio::ip::tcp::endpoint& sorry_endpoint) : " + "thread_id = %d, sorry_endpoint = [%s]:%d."); + formatter % thread_id % sorry_endpoint.address().to_string() % sorry_endpoint.port(); + putLogDebug(100107, formatter.str(), __FILE__, __LINE__ ); } - status = FINALIZE; /*------DEBUG LOG END------*/ - } - catch (const std::bad_alloc& ex) - { - std::cerr << "protocol_module_sessionless::handle_sorryserver_select() : exception : Could not allocate memory." << std::endl; - boost::format formatter("Could not allocate memory. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogError(17057, formatter.str(), __FILE__, __LINE__ ); - status = FINALIZE; - } - catch (const std::exception& ex) - { - std::cerr << "protocol_module_sessionless::handle_sorryserver_select() : exception : error = " << ex.what() << "." << std::endl; - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorryserver_select() : exception : error = %s. thread id : %d."); - formatter % ex.what() % boost::this_thread::get_id(); - putLogError(17058, formatter.str(), __FILE__, __LINE__ ); - status = FINALIZE; - } - catch (...) - { - std::cerr << "protocol_module_sessionless::handle_sorryserver_select() : Unknown exception." << std::endl; - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorryserver_select() : Unknown exception. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogError(17059, formatter.str(), __FILE__, __LINE__ ); - status = FINALIZE; - } + EVENT_TAG status = FINALIZE; + boost::asio::ip::tcp::endpoint client_endpoint; - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - boost::format - formatter( - "out_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorryserver_select(const boost::thread::id thread_id, boost::asio::ip::tcp::endpoint& sorry_endpoint) : return_value = %d." - " thread id : %d."); - formatter % status % boost::this_thread::get_id(); - putLogDebug(10108, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - return status; -} + thread_data_ptr session_data; + session_thread_data_map_it session_thread_it; + recive_data_map_it recive_data_it; -//! called from after sorryserver connect -//! @param[in] upstream thread id -//! @param[out] send buffer reference. -//! @param[out] send length -//! @return session use EVENT mode. -protocol_module_base::EVENT_TAG protocol_module_sessionless::handle_sorryserver_connect( - const boost::thread::id thread_id, boost::array& sendbuffer, size_t& datalen) -{ - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - boost::format formatter("in_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorryserver_connect(const boost::thread::id thread_id, " - "boost::array& sendbuffer, size_t& datalen) : " - "thread_id = %d."); - formatter % thread_id; - putLogDebug(10109, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - EVENT_TAG status = FINALIZE; - bool ret = false; - size_t header_offset = 0; - size_t header_offset_len = 0; - size_t url_offset = 0; - size_t url_offset_len = 0; - size_t send_buffer_remian_size = 0; - size_t copy_size = 0; - const int send_buffer_end_size = sendbuffer.max_size(); - const std::string http_header = ""; - const std::string str_forword_for = "X-Forwarded-For"; - thread_data_ptr session_data; - session_thread_data_map_it session_thread_it; - recive_data_map_it recive_data_it; - - try - { + try { boost::mutex::scoped_lock sclock(session_thread_data_map_mutex); - //thread id check session_thread_it = session_thread_data_map.find(thread_id); - if (session_thread_it == session_thread_data_map.end() || session_thread_it->second == NULL) + if (unlikely(session_thread_it == session_thread_data_map.end() || session_thread_it->second== NULL)) { boost::format formatter("Invalid thread id. thread id : %d."); formatter % boost::this_thread::get_id(); - putLogError(17060, formatter.str(), __FILE__, __LINE__ ); + putLogError(100058, formatter.str(), __FILE__, __LINE__ ); throw -1; } session_data = session_thread_it->second; - } + //set sorry_endpoint + session_data->target_endpoint = sorry_endpoint; + + //endpoint check + recive_data_it = session_data->recive_data_map.find(session_data->client_endpoint_tcp); + if (unlikely(recive_data_it == session_data->recive_data_map.end())) + { + boost::format formatter("Invalid endpoint. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100059, formatter.str(), __FILE__, __LINE__ ); + throw -1; + } + + recive_data& recv_data = recive_data_it->second; + + send_status_it it = recv_data.send_status_list.begin(); + send_status_it it_end = recv_data.send_status_list.end(); + + it = find_if(it, it_end, data_send_possible()); + if (it != it_end) + { + status = SORRYSERVER_CONNECT; + } + else + { + status = CLIENT_RECV; + } - //endpoint check - recive_data_it = session_data->recive_data_map.find(session_data->client_endpoint_tcp); - if (recive_data_it - == session_data->recive_data_map.end()) + } + catch (int e) { - boost::format formatter("Invalid endpoint. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogError(17061, formatter.str(), __FILE__, __LINE__ ); - throw -1; + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorryserver_select() : catch exception e = %d. thread id : %d."); + formatter % e % boost::this_thread::get_id(); + putLogDebug(100108, formatter.str(), __FILE__, __LINE__ ); + } + status = FINALIZE; + /*------DEBUG LOG END------*/ } - - //recive_buffer pointer check - recive_data& recv_data = recive_data_it->second; - if (recv_data.recive_buffer == NULL) + catch (const std::bad_alloc& ex) { - boost::format formatter("Invalid pointer. thread id : %d."); + std::cerr << "protocol_module_sessionless::handle_sorryserver_select() : exception : Could not allocate memory." << std::endl; + boost::format formatter("Could not allocate memory. thread id : %d."); formatter % boost::this_thread::get_id(); - putLogError(17062, formatter.str(), __FILE__, __LINE__ ); - throw -1; + putLogError(100060, formatter.str(), __FILE__, __LINE__ ); + status = FINALIZE; } - - //send list check - send_status_it it = recv_data.send_status_list.begin(); - send_status_it it_end = recv_data.send_status_list.end(); - - it = find_if(it, it_end, data_send_possible()); - if (it == it_end) + catch (const std::exception& ex) + { + std::cerr << "protocol_module_sessionless::handle_sorryserver_select() : exception : error = " << ex.what() << "." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorryserver_select() : exception : error = %s. thread id : %d."); + formatter % ex.what() % boost::this_thread::get_id(); + putLogError(100061, formatter.str(), __FILE__, __LINE__ ); + status = FINALIZE; + } + catch (...) { - boost::format formatter("Sending possible data is not existed. thread id : %d."); + std::cerr << "protocol_module_sessionless::handle_sorryserver_select() : Unknown exception." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorryserver_select() : Unknown exception. thread id : %d."); formatter % boost::this_thread::get_id(); - putLogError(17063, formatter.str(), __FILE__, __LINE__ ); - throw -1; + putLogError(100062, formatter.str(), __FILE__, __LINE__ ); + status = FINALIZE; } - //send buffer rest size initialization - send_buffer_remian_size = send_buffer_end_size; + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format + formatter( + "out_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorryserver_select(const boost::thread::id thread_id, boost::asio::ip::tcp::endpoint& sorry_endpoint) : return_value = %d." + " thread id : %d."); + formatter % status % boost::this_thread::get_id(); + putLogDebug(100109, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + return status; + } - //edit_division flag on - if (it->edit_division == EDIT_DIVISION_EDIT) + //! called from after sorryserver connect + //! @param[in] upstream thread id + //! @param[out] send buffer reference. + //! @param[out] send length + //! @return session use EVENT mode. + protocol_module_base::EVENT_TAG protocol_module_sessionless::handle_sorryserver_connect( + const boost::thread::id thread_id, boost::array& sendbuffer, size_t& datalen) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - //edit list is empty - if (it->edit_data_list.empty()) - { - //edit data create - edit_data edata; - edata.data_size = 0; - edata.insert_posission = 0; - edata.replace_size = 0; - //search uri - if (strlen(sorry_uri.data()) > 0) + boost::format formatter("in_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorryserver_connect(const boost::thread::id thread_id, " + "boost::array& sendbuffer, size_t& datalen) : " + "thread_id = %d."); + formatter % thread_id; + putLogDebug(100110, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + EVENT_TAG status = FINALIZE; + bool ret = false; + size_t header_offset = 0; + size_t header_offset_len = 0; + size_t url_offset = 0; + size_t url_offset_len = 0; + size_t send_buffer_remian_size = 0; + size_t copy_size = 0; + const int send_buffer_end_size = sendbuffer.max_size(); + const std::string http_header = ""; + const std::string str_forword_for = "X-Forwarded-For"; + thread_data_ptr session_data; + session_thread_data_map_it session_thread_it; + recive_data_map_it recive_data_it; + + try + { + { + boost::mutex::scoped_lock sclock(session_thread_data_map_mutex); + + //thread id check + session_thread_it = session_thread_data_map.find(thread_id); + if (unlikely(session_thread_it == session_thread_data_map.end() || session_thread_it->second == NULL)) { - ret = find_uri(recv_data.recive_buffer + it->send_offset, it->send_possible_size, url_offset, - url_offset_len); - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorryserver_connect() : call find_uri : " - "return_value = %d. thread id : %d."); - formatter % static_cast(ret) % boost::this_thread::get_id(); - putLogDebug(10110, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - //search http header result is OK - if (ret) - { - //edit sorry_uri, put it to edata.data - edata.data = sorry_uri.data(); - //save new uri offset - edata.insert_posission = url_offset; - //save new uri length - edata.data_size = edata.data.size(); - //save old uri length - edata.replace_size = url_offset_len; - //add to edit_data_list - it->edit_data_list.push_back(edata); - } + boost::format formatter("Invalid thread id. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100063, formatter.str(), __FILE__, __LINE__ ); + throw -1; } - if (forwarded_for == FORWARDED_FOR_ON) - { - //search X-Forwarded-For header - ret = find_http_header(recv_data.recive_buffer + it->send_offset, it->send_possible_size, - str_forword_for.c_str(), header_offset, header_offset_len); - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorryserver_connect() : call find_http_header : " - "return_value = %d. thread id : %d."); - formatter % static_cast(ret) % boost::this_thread::get_id(); - putLogDebug(10111, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ + session_data = session_thread_it->second; + } - //search http header result is OK - if (ret) - { - //edit X-Forwarded-For header, put it to edata.data - edata.data.assign(recv_data.recive_buffer + it->send_offset + header_offset, header_offset_len); - edata.data += ", "; - edata.data += session_data->client_endpoint_tcp.address().to_string(); - //save new X-Forwarded-For header offset - edata.insert_posission = header_offset; - //save new X-Forwarded-For header length - edata.data_size = edata.data.size(); - //save old X-Forwarded-For header length - edata.replace_size = header_offset_len; - } - //search http header result is NG - else + //endpoint check + recive_data_it = session_data->recive_data_map.find(session_data->client_endpoint_tcp); + if (unlikely(recive_data_it + == session_data->recive_data_map.end())) + { + boost::format formatter("Invalid endpoint. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100064, formatter.str(), __FILE__, __LINE__ ); + throw -1; + } + + //recive_buffer pointer check + recive_data& recv_data = recive_data_it->second; + if (unlikely(recv_data.recive_buffer == NULL)) + { + boost::format formatter("Invalid pointer. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100065, formatter.str(), __FILE__, __LINE__ ); + throw -1; + } + + //send list check + send_status_it it = recv_data.send_status_list.begin(); + send_status_it it_end = recv_data.send_status_list.end(); + + it = find_if(it, it_end, data_send_possible()); + if (unlikely(it == it_end)) + { + boost::format formatter("Sending possible data is not existed. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100066, formatter.str(), __FILE__, __LINE__ ); + throw -1; + } + + //send buffer rest size initialization + send_buffer_remian_size = send_buffer_end_size; + + //edit_division flag on + if (it->edit_division == EDIT_DIVISION_EDIT) + { + //edit list is empty + if (it->edit_data_list.empty()) + { + //edit data create + edit_data edata; + edata.data_size = 0; + edata.insert_posission = 0; + edata.replace_size = 0; + //search uri + if (strlen(sorry_uri.data()) > 0) { - //search whole http header, get whole http header's offset and length - ret = find_http_header(recv_data.recive_buffer + it->send_offset, it->send_possible_size, "", - header_offset, header_offset_len); + ret = find_uri(recv_data.recive_buffer + it->send_offset, it->send_possible_size, url_offset, + url_offset_len); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorryserver_connect() : call find_http_header : " + "handle_sorryserver_connect() : call find_uri : " "return_value = %d. thread id : %d."); formatter % static_cast(ret) % boost::this_thread::get_id(); - putLogDebug(10112, formatter.str(), __FILE__, __LINE__ ); + putLogDebug(100111, formatter.str(), __FILE__, __LINE__ ); } /*------DEBUG LOG END------*/ - if (!ret) + //search http header result is OK + if (ret) { - boost::format formatter("find_http_header() function failure. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogError(17064, formatter.str(), __FILE__, __LINE__ ); - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + //edit sorry_uri, put it to edata.data + edata.data = sorry_uri.data(); + //save new uri offset + edata.insert_posission = url_offset; + //save new uri length + edata.data_size = edata.data.size(); + //save old uri length + edata.replace_size = url_offset_len; + //add to edit_data_list + it->edit_data_list.push_back(edata); + } + } + + if (forwarded_for == FORWARDED_FOR_ON) + { + //search X-Forwarded-For header + ret = find_http_header(recv_data.recive_buffer + it->send_offset, it->send_possible_size, + str_forword_for.c_str(), header_offset, header_offset_len); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorryserver_connect() : call find_http_header : " + "return_value = %d. thread id : %d."); + formatter % static_cast(ret) % boost::this_thread::get_id(); + putLogDebug(100112, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + //search http header result is OK + if (ret) + { + //edit X-Forwarded-For header, put it to edata.data + edata.data.assign(recv_data.recive_buffer + it->send_offset + header_offset, header_offset_len); + edata.data += ", "; + edata.data += session_data->client_endpoint_tcp.address().to_string(); + //save new X-Forwarded-For header offset + edata.insert_posission = header_offset; + //save new X-Forwarded-For header length + edata.data_size = edata.data.size(); + //save old X-Forwarded-For header length + edata.replace_size = header_offset_len; + } + //search http header result is NG + else + { + //search whole http header, get whole http header's offset and length + ret = find_http_header(recv_data.recive_buffer + it->send_offset, it->send_possible_size, "", + header_offset, header_offset_len); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorryserver_connect(const boost::thread::id thread_id, " - "boost::array& sendbuffer, " - "size_t& datalen) : return_value = %d. thread id : %d."); - formatter % FINALIZE % boost::this_thread::get_id(); - putLogDebug(10113, formatter.str(), __FILE__, __LINE__ ); + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorryserver_connect() : call find_http_header : " + "return_value = %d. thread id : %d."); + formatter % static_cast(ret) % boost::this_thread::get_id(); + putLogDebug(100113, formatter.str(), __FILE__, __LINE__ ); } /*------DEBUG LOG END------*/ - return FINALIZE; + if (!ret) + { + boost::format formatter("find_http_header() function failure. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100067, formatter.str(), __FILE__, __LINE__ ); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorryserver_connect(const boost::thread::id thread_id, " + "boost::array& sendbuffer, " + "size_t& datalen) : return_value = %d. thread id : %d."); + formatter % FINALIZE % boost::this_thread::get_id(); + putLogDebug(100114, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + return FINALIZE; + } + //create X-Forwarded-For header, set it to edata.data + edata.data = str_forword_for; + edata.data += ": "; + edata.data += session_data->client_endpoint_tcp.address().to_string(); + edata.data += "\r\n"; + //save new X-Forwarded-For header offset + edata.insert_posission = header_offset; + //save new X-Forwarded-For header length + edata.data_size = edata.data.size(); + //save old X-Forwarded-For header length + edata.replace_size = 0; } - //create X-Forwarded-For header, set it to edata.data - edata.data = str_forword_for; - edata.data += ": "; - edata.data += session_data->client_endpoint_tcp.address().to_string(); - edata.data += "\r\n"; - //save new X-Forwarded-For header offset - edata.insert_posission = header_offset; - //save new X-Forwarded-For header length - edata.data_size = edata.data.size(); - //save old X-Forwarded-For header length - edata.replace_size = 0; - } - //add to edit_data_list - it->edit_data_list.push_back(edata); + //add to edit_data_list + it->edit_data_list.push_back(edata); + } } - } - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorryserver_connect() : Copy data loop start. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogDebug(10114, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - while (true) - { - //edit_data_list is empty - if (it->edit_data_list.empty()) + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorryserver_connect() : Copy data loop start. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogDebug(100115, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + while (true) { - //set edit_division flag off - it->edit_division = EDIT_DIVISION_NO_EDIT; + //edit_data_list is empty + if (it->edit_data_list.empty()) + { + //set edit_division flag off + it->edit_division = EDIT_DIVISION_NO_EDIT; + + if (send_buffer_remian_size > 0 && it->send_possible_size > 0) + { + //send_buffer_remian_size is larger + if (send_buffer_remian_size > it->send_possible_size) + { + //copy data from recive_buffer to sendbuffer by sending_possible size + copy_size = it->send_possible_size; + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + dump_memory(recv_data.recive_buffer + it->send_offset + it->send_end_size, + copy_size, datadump); + boost::format formatter( + "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorryserver_connect() : before memcpy (data dump) : " + "data begin = %d, data_size = %d, data = %s"); + formatter % (it->send_offset + it->send_end_size) + % copy_size % datadump; + putLogDebug(100116, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + memcpy(sendbuffer.data() + send_buffer_end_size - send_buffer_remian_size, + recv_data.recive_buffer + it->send_offset + it->send_end_size, copy_size); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + dump_memory(sendbuffer.data() + send_buffer_end_size - send_buffer_remian_size, + copy_size, datadump); + boost::format formatter( + "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorryserver_connect() : after memcpy (data dump) : " + "data begin = %d, data_size = %d, data = %s"); + formatter % (send_buffer_end_size - send_buffer_remian_size) + % copy_size % datadump; + putLogDebug(100117, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + it->send_end_size += copy_size; + it->send_possible_size = 0; + send_buffer_remian_size -= copy_size; + } + //send_possible_size is larger + else + { + copy_size = send_buffer_remian_size; + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + dump_memory(recv_data.recive_buffer + it->send_offset + it->send_end_size, + copy_size, datadump); + boost::format formatter( + "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorryserver_connect() : before memcpy (data dump) : " + "data begin = %d, data_size = %d, data = %s"); + formatter % (it->send_offset + it->send_end_size) + % copy_size % datadump; + putLogDebug(100118, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + //copy data from recive_buffer to sendbuffer by send buffer rest size + memcpy(sendbuffer.data() + send_buffer_end_size - send_buffer_remian_size, + recv_data.recive_buffer + it->send_offset + it->send_end_size, + copy_size); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + dump_memory(sendbuffer.data() + send_buffer_end_size - send_buffer_remian_size, + copy_size, datadump); + boost::format formatter( + "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorryserver_connect() : after memcpy (data dump) : " + "data begin = %d, data_size = %d, data = %s"); + formatter % (send_buffer_end_size - send_buffer_remian_size) + % copy_size % datadump; + putLogDebug(100119, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + it->send_end_size += copy_size; + it->send_possible_size -= copy_size; + send_buffer_remian_size = 0; + } + } - if (send_buffer_remian_size > 0 && it->send_possible_size > 0) + break; + } + //edit_data_list is not empty + else { - //send_buffer_remian_size is larger - if (send_buffer_remian_size > it->send_possible_size) + //search item which insert_posission is mininum + std::list::iterator edit_min = std::min_element(it->edit_data_list.begin(), + it->edit_data_list.end()); + //send_buffer_remian_size is larger than data that before X-Forwarded-For/uri + if (send_buffer_remian_size >= edit_min->insert_posission - it->send_end_size) { - //copy data from recive_buffer to sendbuffer by sending_possible size - copy_size = it->send_possible_size; + //copy data before X-Forwarded-For/url + copy_size = edit_min->insert_posission - it->send_end_size; /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { std::string datadump; dump_memory(recv_data.recive_buffer + it->send_offset + it->send_end_size, copy_size, datadump); + boost::format formatter( "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" "handle_sorryserver_connect() : before memcpy (data dump) : " "data begin = %d, data_size = %d, data = %s"); formatter % (it->send_offset + it->send_end_size) % copy_size % datadump; - putLogDebug(10115, formatter.str(), __FILE__, __LINE__ ); + putLogDebug(100120, formatter.str(), __FILE__, __LINE__ ); } /*------DEBUG LOG END------*/ memcpy(sendbuffer.data() + send_buffer_end_size - send_buffer_remian_size, recv_data.recive_buffer + it->send_offset + it->send_end_size, copy_size); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { std::string datadump; dump_memory(sendbuffer.data() + send_buffer_end_size - send_buffer_remian_size, @@ -3521,1019 +3696,840 @@ protocol_module_base::EVENT_TAG protocol_module_sessionless::handle_sorryserver_ "data begin = %d, data_size = %d, data = %s"); formatter % (send_buffer_end_size - send_buffer_remian_size) % copy_size % datadump; - putLogDebug(10116, formatter.str(), __FILE__, __LINE__ ); + putLogDebug(100121, formatter.str(), __FILE__, __LINE__ ); } /*------DEBUG LOG END------*/ it->send_end_size += copy_size; - it->send_possible_size = 0; + it->send_possible_size -= copy_size; send_buffer_remian_size -= copy_size; + + //there is remain buffer for copy X-Forwarded-For/url + if (send_buffer_remian_size >= edit_min->data_size) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + dump_memory(edit_min->data.c_str(), + edit_min->data_size, datadump); + boost::format formatter( + "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorryserver_connect() : before memcpy (data dump) : " + "data begin = 0, data_size = %d, data = %s"); + formatter % edit_min->data_size % datadump; + putLogDebug(100122, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + //copy X-Forwarded-For/uri + memcpy(sendbuffer.data() + send_buffer_end_size - send_buffer_remian_size, + edit_min->data.c_str(), edit_min->data_size); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + dump_memory(sendbuffer.data() + send_buffer_end_size - send_buffer_remian_size, + edit_min->data_size, datadump); + + boost::format formatter( + "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorryserver_connect() : after memcpy (data dump) : " + "data begin = %d, data_size = %d, data = %s"); + formatter % (send_buffer_end_size - send_buffer_remian_size) + % edit_min->data_size % datadump; + putLogDebug(100123, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + it->send_end_size += edit_min->replace_size; + it->send_possible_size -= edit_min->replace_size; + send_buffer_remian_size -= edit_min->data_size; + it->edit_data_list.erase(edit_min); + } + // + else + { + break; + } } - //send_possible_size is larger + //data that before X-Forwarded-For/uri is larger than send_buffer_remian_size else { copy_size = send_buffer_remian_size; /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { std::string datadump; - dump_memory(recv_data.recive_buffer + it->send_offset + it->send_end_size, + dump_memory(sendbuffer.data() + send_buffer_end_size - send_buffer_remian_size, copy_size, datadump); + boost::format formatter( "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" "handle_sorryserver_connect() : before memcpy (data dump) : " "data begin = %d, data_size = %d, data = %s"); formatter % (it->send_offset + it->send_end_size) % copy_size % datadump; - putLogDebug(10117, formatter.str(), __FILE__, __LINE__ ); + putLogDebug(100124, formatter.str(), __FILE__, __LINE__ ); } /*------DEBUG LOG END------*/ - //copy data from recive_buffer to sendbuffer by send buffer rest size + //copy data as large as possible memcpy(sendbuffer.data() + send_buffer_end_size - send_buffer_remian_size, - recv_data.recive_buffer + it->send_offset + it->send_end_size, - copy_size); + recv_data.recive_buffer + it->send_offset + it->send_end_size, send_buffer_remian_size); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { std::string datadump; dump_memory(sendbuffer.data() + send_buffer_end_size - send_buffer_remian_size, copy_size, datadump); + boost::format formatter( "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" "handle_sorryserver_connect() : after memcpy (data dump) : " "data begin = %d, data_size = %d, data = %s"); formatter % (send_buffer_end_size - send_buffer_remian_size) % copy_size % datadump; - putLogDebug(10118, formatter.str(), __FILE__, __LINE__ ); + putLogDebug(100125, formatter.str(), __FILE__, __LINE__ ); } /*------DEBUG LOG END------*/ it->send_end_size += copy_size; it->send_possible_size -= copy_size; - send_buffer_remian_size = 0; + send_buffer_remian_size -= copy_size; + break; } } - - break; } - //edit_data_list is not empty - else + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorryserver_connect() : Copy data loop end. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogDebug(100126, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + } + //edit_division flag is off + else + { + //copy data as large as possible + //send_possible_size is larger + if (send_buffer_remian_size >= it->send_possible_size) { - //search item which insert_posission is mininum - std::list::iterator edit_min = std::min_element(it->edit_data_list.begin(), - it->edit_data_list.end()); - //send_buffer_remian_size is larger than data that before X-Forwarded-For/uri - if (send_buffer_remian_size >= edit_min->insert_posission - it->send_end_size) + copy_size = it->send_possible_size; + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - //copy data before X-Forwarded-For/url - copy_size = edit_min->insert_posission - it->send_end_size; - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - std::string datadump; - dump_memory(recv_data.recive_buffer + it->send_offset + it->send_end_size, - copy_size, datadump); - - boost::format formatter( - "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorryserver_connect() : before memcpy (data dump) : " - "data begin = %d, data_size = %d, data = %s"); - formatter % (it->send_offset + it->send_end_size) - % copy_size % datadump; - putLogDebug(10119, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - memcpy(sendbuffer.data() + send_buffer_end_size - send_buffer_remian_size, - recv_data.recive_buffer + it->send_offset + it->send_end_size, copy_size); - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - std::string datadump; - dump_memory(sendbuffer.data() + send_buffer_end_size - send_buffer_remian_size, - copy_size, datadump); - boost::format formatter( - "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorryserver_connect() : after memcpy (data dump) : " - "data begin = %d, data_size = %d, data = %s"); - formatter % (send_buffer_end_size - send_buffer_remian_size) - % copy_size % datadump; - putLogDebug(10120, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - it->send_end_size += copy_size; - it->send_possible_size -= copy_size; - send_buffer_remian_size -= copy_size; + std::string datadump; + dump_memory(recv_data.recive_buffer+ it->send_offset, copy_size, datadump); - //there is remain buffer for copy X-Forwarded-For/url - if (send_buffer_remian_size >= edit_min->data_size) - { - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - std::string datadump; - dump_memory(edit_min->data.c_str(), - edit_min->data_size, datadump); - boost::format formatter( - "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorryserver_connect() : before memcpy (data dump) : " - "data begin = 0, data_size = %d, data = %s"); - formatter % edit_min->data_size % datadump; - putLogDebug(10121, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - //copy X-Forwarded-For/uri - memcpy(sendbuffer.data() + send_buffer_end_size - send_buffer_remian_size, - edit_min->data.c_str(), edit_min->data_size); - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - std::string datadump; - dump_memory(sendbuffer.data() + send_buffer_end_size - send_buffer_remian_size, - edit_min->data_size, datadump); + boost::format formatter( + "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorryserver_connect() : before memcpy (data dump) : " + "data begin = %d, data_size = %d, data = %s"); + formatter % it->send_offset + % copy_size % datadump; + putLogDebug(100127, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + //copy data by send_possible size + memcpy(sendbuffer.data(), recv_data.recive_buffer + + it->send_offset, copy_size); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + dump_memory(sendbuffer.data(), copy_size, datadump); - boost::format formatter( - "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorryserver_connect() : after memcpy (data dump) : " - "data begin = %d, data_size = %d, data = %s"); - formatter % (send_buffer_end_size - send_buffer_remian_size) - % edit_min->data_size % datadump; - putLogDebug(10122, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - it->send_end_size += edit_min->replace_size; - it->send_possible_size -= edit_min->replace_size; - send_buffer_remian_size -= edit_min->data_size; - it->edit_data_list.erase(edit_min); - } - // - else - { - break; - } + boost::format formatter( + "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorryserver_connect() : after memcpy (data dump) : " + "data begin = 0, data_size = %d, data = %s"); + formatter % copy_size % datadump; + putLogDebug(100128, formatter.str(), __FILE__, __LINE__ ); } - //data that before X-Forwarded-For/uri is larger than send_buffer_remian_size - else + /*------DEBUG LOG END------*/ + it->send_end_size = it->send_possible_size; + it->send_possible_size = 0; + send_buffer_remian_size -= copy_size; + } + //buffer rest size is larger + else + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - copy_size = send_buffer_remian_size; - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - std::string datadump; - dump_memory(sendbuffer.data() + send_buffer_end_size - send_buffer_remian_size, - copy_size, datadump); + std::string datadump; + dump_memory(recv_data.recive_buffer+ it->send_offset, send_buffer_remian_size, datadump); - boost::format formatter( - "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorryserver_connect() : before memcpy (data dump) : " - "data begin = %d, data_size = %d, data = %s"); - formatter % (it->send_offset + it->send_end_size) - % copy_size % datadump; - putLogDebug(10123, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - //copy data as large as possible - memcpy(sendbuffer.data() + send_buffer_end_size - send_buffer_remian_size, - recv_data.recive_buffer + it->send_offset + it->send_end_size, send_buffer_remian_size); - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - std::string datadump; - dump_memory(sendbuffer.data() + send_buffer_end_size - send_buffer_remian_size, - copy_size, datadump); + boost::format formatter( + "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorryserver_connect() : before memcpy (data dump) : " + "data begin = %d, data_size = %d, data = %s"); + formatter % it->send_offset + % send_buffer_remian_size % datadump; + putLogDebug(100129, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + //copy data by buffer rest size + memcpy(sendbuffer.data(), recv_data.recive_buffer + + it->send_offset, send_buffer_remian_size); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + dump_memory(sendbuffer.data(), send_buffer_remian_size, datadump); - boost::format formatter( - "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorryserver_connect() : after memcpy (data dump) : " - "data begin = %d, data_size = %d, data = %s"); - formatter % (send_buffer_end_size - send_buffer_remian_size) - % copy_size % datadump; - putLogDebug(10124, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - it->send_end_size += copy_size; - it->send_possible_size -= copy_size; - send_buffer_remian_size -= copy_size; - break; + boost::format formatter( + "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorryserver_connect() : after memcpy (data dump) : " + "data begin = 0, data_size = %d, data = %s"); + formatter % send_buffer_remian_size % datadump; + putLogDebug(100130, formatter.str(), __FILE__, __LINE__ ); } + /*------DEBUG LOG END------*/ + it->send_end_size = send_buffer_remian_size; + it->send_possible_size -= send_buffer_remian_size; + send_buffer_remian_size = 0; } } + + //set copyed data length + datalen = send_buffer_end_size - send_buffer_remian_size; + + status = SORRYSERVER_SEND; + + } + catch (int e) + { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorryserver_connect() : Copy data loop end. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogDebug(10125, formatter.str(), __FILE__, __LINE__ ); + "handle_sorryserver_connect() : catch exception e = %d. thread id : %d."); + formatter % e % boost::this_thread::get_id(); + putLogDebug(100131, formatter.str(), __FILE__, __LINE__ ); } + status = FINALIZE; /*------DEBUG LOG END------*/ } - //edit_division flag is off - else + catch (const std::exception& ex) { - //copy data as large as possible - //send_possible_size is larger - if (send_buffer_remian_size >= it->send_possible_size) - { - copy_size = it->send_possible_size; - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - std::string datadump; - dump_memory(recv_data.recive_buffer+ it->send_offset, copy_size, datadump); + std::cerr << "protocol_module_sessionless::handle_sorryserver_connect() : exception : error = " << ex.what() << "." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorryserver_connect() : exception : error = %s. thread id : %d."); + formatter % ex.what() % boost::this_thread::get_id(); + putLogError(100068, formatter.str(), __FILE__, __LINE__ ); + status = FINALIZE; + } + catch (...) + { + std::cerr << "protocol_module_sessionless::handle_sorryserver_connect() : Unknown exception." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorryserver_connect() : Unknown exception. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100069, formatter.str(), __FILE__, __LINE__ ); + status = FINALIZE; + } - boost::format formatter( - "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorryserver_connect() : before memcpy (data dump) : " - "data begin = %d, data_size = %d, data = %s"); - formatter % it->send_offset - % copy_size % datadump; - putLogDebug(10126, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - //copy data by send_possible size - memcpy(sendbuffer.data(), recv_data.recive_buffer - + it->send_offset, copy_size); - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - std::string datadump; - dump_memory(sendbuffer.data(), copy_size, datadump); - - boost::format formatter( - "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorryserver_connect() : after memcpy (data dump) : " - "data begin = 0, data_size = %d, data = %s"); - formatter % copy_size % datadump; - putLogDebug(10127, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - it->send_end_size = it->send_possible_size; - it->send_possible_size = 0; - send_buffer_remian_size -= copy_size; - } - //buffer rest size is larger - else - { - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - std::string datadump; - dump_memory(recv_data.recive_buffer+ it->send_offset, send_buffer_remian_size, datadump); - - boost::format formatter( - "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorryserver_connect() : before memcpy (data dump) : " - "data begin = %d, data_size = %d, data = %s"); - formatter % it->send_offset - % send_buffer_remian_size % datadump; - putLogDebug(10128, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - //copy data by buffer rest size - memcpy(sendbuffer.data(), recv_data.recive_buffer - + it->send_offset, send_buffer_remian_size); - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - std::string datadump; - dump_memory(sendbuffer.data(), send_buffer_remian_size, datadump); - - boost::format formatter( - "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorryserver_connect() : after memcpy (data dump) : " - "data begin = 0, data_size = %d, data = %s"); - formatter % send_buffer_remian_size % datadump; - putLogDebug(10129, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - it->send_end_size = send_buffer_remian_size; - it->send_possible_size -= send_buffer_remian_size; - send_buffer_remian_size = 0; - } - } - - //set copyed data length - datalen = send_buffer_end_size - send_buffer_remian_size; - - status = SORRYSERVER_SEND; + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorryserver_connect(const boost::thread::id thread_id, " + "boost::array& sendbuffer, " + "size_t& datalen) : return_value = %d. thread id : %d."); + formatter % status % boost::this_thread::get_id(); + putLogDebug(100132, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + return status; } - catch (int e) + + //! called from after sorryserver connection fail + //! @param[in] upstream thread id + //! @param[in] sorryserver endpoint reference. + //! @return session use EVENT mode. + protocol_module_base::EVENT_TAG protocol_module_sessionless::handle_sorryserver_connection_fail( + const boost::thread::id thread_id, const boost::asio::ip::tcp::endpoint & sorry_endpoint) { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorryserver_connect() : catch exception e = %d. thread id : %d."); - formatter % e % boost::this_thread::get_id(); - putLogDebug(10130, formatter.str(), __FILE__, __LINE__ ); + boost::format formatter("in_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorryserver_connection_fail(const boost::thread::id thread_id, " + "const boost::asio::ip::tcp::endpoint & sorry_endpoint) : " + "thread_id = %d, sorry_endpoint = [%s]:%d."); + formatter % thread_id % sorry_endpoint.address().to_string() % sorry_endpoint.port(); + putLogDebug(100133, formatter.str(), __FILE__, __LINE__ ); } - status = FINALIZE; /*------DEBUG LOG END------*/ - } - catch (const std::exception& ex) - { - std::cerr << "protocol_module_sessionless::handle_sorryserver_connect() : exception : error = " << ex.what() << "." << std::endl; - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorryserver_connect() : exception : error = %s. thread id : %d."); - formatter % ex.what() % boost::this_thread::get_id(); - putLogError(17065, formatter.str(), __FILE__, __LINE__ ); - status = FINALIZE; - } - catch (...) - { - std::cerr << "protocol_module_sessionless::handle_sorryserver_connect() : Unknown exception." << std::endl; - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorryserver_connect() : Unknown exception. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogError(17066, formatter.str(), __FILE__, __LINE__ ); - status = FINALIZE; - } - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorryserver_connect(const boost::thread::id thread_id, " - "boost::array& sendbuffer, " - "size_t& datalen) : return_value = %d. thread id : %d."); - formatter % status % boost::this_thread::get_id(); - putLogDebug(10131, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ + EVENT_TAG status = FINALIZE; + thread_data_ptr session_data; + session_thread_data_map_it session_thread_it; - return status; -} + try + { + boost::mutex::scoped_lock slock(session_thread_data_map_mutex ); -//! called from after sorryserver connection fail -//! @param[in] upstream thread id -//! @param[in] sorryserver endpoint reference. -//! @return session use EVENT mode. -protocol_module_base::EVENT_TAG protocol_module_sessionless::handle_sorryserver_connection_fail( - const boost::thread::id thread_id, const boost::asio::ip::tcp::endpoint & sorry_endpoint) -{ - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - boost::format formatter("in_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorryserver_connection_fail(const boost::thread::id thread_id, " - "const boost::asio::ip::tcp::endpoint & sorry_endpoint) : " - "thread_id = %d, sorry_endpoint = [%s]:%d."); - formatter % thread_id % sorry_endpoint.address().to_string() % sorry_endpoint.port(); - putLogDebug(10132, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ + session_thread_it = session_thread_data_map.find(thread_id); + if (unlikely(session_thread_it == session_thread_data_map.end() || session_thread_it->second == NULL)) + { + boost::format formatter("Invalid thread id. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100070, formatter.str(), __FILE__, __LINE__ ); + throw -1; + } - EVENT_TAG status = FINALIZE; - thread_data_ptr session_data; - session_thread_data_map_it session_thread_it; + session_data = session_thread_it->second; - try - { - boost::mutex::scoped_lock slock(session_thread_data_map_mutex); + //set end flag on + session_data->end_flag = END_FLAG_ON; + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorryserver_connection_fail() : END_FLAG_ON. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogDebug(100134, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ - session_thread_it = session_thread_data_map.find(thread_id); - if (session_thread_it == session_thread_data_map.end() || session_thread_it->second == NULL) + status = CLIENT_DISCONNECT; + } + catch (int e) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorryserver_connection_fail() : catch exception e = %d. thread id : %d."); + formatter % e % boost::this_thread::get_id(); + putLogDebug(100135, formatter.str(), __FILE__, __LINE__ ); + } + status = FINALIZE; + /*------DEBUG LOG END------*/ + } + catch (const std::exception& ex) + { + std::cerr << "protocol_module_sessionless::handle_sorryserver_connection_fail() : exception : error=" << ex.what() << "." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorryserver_connection_fail() : exception : error = %s. thread id : %d."); + formatter % ex.what() % boost::this_thread::get_id(); + putLogError(100071, formatter.str(), __FILE__, __LINE__ ); + status = FINALIZE; + } + catch (...) { - boost::format formatter("Invalid thread id. thread id : %d."); + std::cerr << "protocol_module_sessionless::handle_sorryserver_connection_fail() : Unknown exception." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorryserver_connection_fail() : Unknown exception. thread id : %d."); formatter % boost::this_thread::get_id(); - putLogError(17067, formatter.str(), __FILE__, __LINE__ ); - throw -1; + putLogError(100072, formatter.str(), __FILE__, __LINE__ ); + status = FINALIZE; } - session_data = session_thread_it->second; - - //set end flag on - session_data->end_flag = END_FLAG_ON; /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorryserver_connection_fail() : END_FLAG_ON. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogDebug(10133, formatter.str(), __FILE__, __LINE__ ); + boost::format + formatter( + "out_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorryserver_connection_fail( const boost::thread::id thread_id, const boost::asio::ip::tcp::endpoint & sorry_endpoint) : return_value = %d." + " thread id : %d."); + formatter % status % boost::this_thread::get_id(); + putLogDebug(100136, formatter.str(), __FILE__, __LINE__ ); } /*------DEBUG LOG END------*/ - - status = CLIENT_DISCONNECT; + return status; } - catch (int e) + + //! called from after sorryserver send + //! @param[in] upstream thread id + //! @return session use EVENT mode. + protocol_module_base::EVENT_TAG protocol_module_sessionless::handle_sorryserver_send( + const boost::thread::id thread_id) { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorryserver_connection_fail() : catch exception e = %d. thread id : %d."); - formatter % e % boost::this_thread::get_id(); - putLogDebug(10134, formatter.str(), __FILE__, __LINE__ ); + boost::format formatter("in_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorryserver_send(const boost::thread::id thread_id) : " + "thread_id = %d."); + formatter % thread_id; + putLogDebug(100137, formatter.str(), __FILE__, __LINE__ ); } - status = FINALIZE; /*------DEBUG LOG END------*/ - } - catch (const std::exception& ex) - { - std::cerr << "protocol_module_sessionless::handle_sorryserver_connection_fail() : exception : error=" << ex.what() << "." << std::endl; - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorryserver_connection_fail() : exception : error = %s. thread id : %d."); - formatter % ex.what() % boost::this_thread::get_id(); - putLogError(17068, formatter.str(), __FILE__, __LINE__ ); - status = FINALIZE; - } - catch (...) - { - std::cerr << "protocol_module_sessionless::handle_sorryserver_connection_fail() : Unknown exception." << std::endl; - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorryserver_connection_fail() : Unknown exception. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogError(17069, formatter.str(), __FILE__, __LINE__ ); - status = FINALIZE; - } + EVENT_TAG status = FINALIZE; + thread_data_ptr session_data; + session_thread_data_map_it session_thread_it; + recive_data_map_it recive_data_it; - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - boost::format - formatter( - "out_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorryserver_connection_fail( const boost::thread::id thread_id, const boost::asio::ip::tcp::endpoint & sorry_endpoint) : return_value = %d." - " thread id : %d."); - formatter % status % boost::this_thread::get_id(); - putLogDebug(10135, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - return status; -} + try + { + { + boost::mutex::scoped_lock slock(session_thread_data_map_mutex ); -//! called from after sorryserver send -//! @param[in] upstream thread id -//! @return session use EVENT mode. -protocol_module_base::EVENT_TAG protocol_module_sessionless::handle_sorryserver_send( - const boost::thread::id thread_id) -{ - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - boost::format formatter("in_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorryserver_send(const boost::thread::id thread_id) : " - "thread_id = %d."); - formatter % thread_id; - putLogDebug(10136, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - EVENT_TAG status = FINALIZE; - thread_data_ptr session_data; - session_thread_data_map_it session_thread_it; - recive_data_map_it recive_data_it; + //thread_id check + session_thread_it = session_thread_data_map.find(thread_id); + if (unlikely(session_thread_it == session_thread_data_map.end() || session_thread_it->second == NULL)) + { + boost::format formatter("Invalid thread id. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100073, formatter.str(), __FILE__, __LINE__ ); + throw -1; + } - try - { - { - boost::mutex::scoped_lock slock(session_thread_data_map_mutex); + session_data = session_thread_it->second; + } - //thread_id check - session_thread_it = session_thread_data_map.find(thread_id); - if (session_thread_it == session_thread_data_map.end() || session_thread_it->second == NULL) + //endpoint check + recive_data_it = session_data->recive_data_map.find(session_data->client_endpoint_tcp); + if (unlikely(recive_data_it + == session_data->recive_data_map.end())) { - boost::format formatter("Invalid thread id. thread id : %d."); + boost::format formatter("Invalid endpoint. thread id : %d."); formatter % boost::this_thread::get_id(); - putLogError(17070, formatter.str(), __FILE__, __LINE__ ); + putLogError(100074, formatter.str(), __FILE__, __LINE__ ); throw -1; } - session_data = session_thread_it->second; - } - - //endpoint check - recive_data_it = session_data->recive_data_map.find(session_data->client_endpoint_tcp); - if (recive_data_it - == session_data->recive_data_map.end()) - { - boost::format formatter("Invalid endpoint. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogError(17071, formatter.str(), __FILE__, __LINE__ ); - throw -1; - } + recive_data& recv_data = recive_data_it->second; - recive_data& recv_data = recive_data_it->second; + send_status_it it = recv_data.send_status_list.begin(); + send_status_it it_end = recv_data.send_status_list.end(); + //status list check + it = std::adjacent_find(it, it_end, data_send_list_incorrect()); + if (unlikely(it != it_end)) + { + boost::format formatter("Sending possible data is invalid. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100075, formatter.str(), __FILE__, __LINE__ ); + throw -1; + } - send_status_it it = recv_data.send_status_list.begin(); - send_status_it it_end = recv_data.send_status_list.end(); - //status list check - it = std::adjacent_find(it, it_end, data_send_list_incorrect()); - if (it != it_end) - { - boost::format formatter("Sending possible data is invalid. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogError(17072, formatter.str(), __FILE__, __LINE__ ); - throw -1; - } + //status list check + it = recv_data.send_status_list.begin(); + it = find_if(it, it_end, data_send_ok()); + if (unlikely(it == it_end)) + { + boost::format formatter("Sending possible data is not existed. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100076, formatter.str(), __FILE__, __LINE__ ); + throw -1; + } - //status list check - it = recv_data.send_status_list.begin(); - it = find_if(it, it_end, data_send_ok()); - if (it == it_end) - { - boost::format formatter("Sending possible data is not existed. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogError(17073, formatter.str(), __FILE__, __LINE__ ); - throw -1; - } + //sending possible data is exist + if (it->send_possible_size > 0) + { + //status remain SEND_OK + it->status = SEND_OK; + //offset recalc + it->send_offset += it->send_end_size; - //sending possible data is exist - if (it->send_possible_size > 0) - { - //status remain SEND_OK - it->status = SEND_OK; - //offset recalc - it->send_offset += it->send_end_size; + //insert_posission recalc + for (std::list::iterator list_it = it->edit_data_list.begin(); list_it + != it->edit_data_list.end(); ++list_it) + { + list_it->insert_posission -= it->send_end_size; + } - //insert_posission recalc - for (std::list::iterator list_it = it->edit_data_list.begin(); list_it - != it->edit_data_list.end(); ++list_it) + //send_end_size recalc + it->send_end_size = 0; + } + //sending possible data is not exist + else { - list_it->insert_posission -= it->send_end_size; + //can recive from clent continue + if (it->send_rest_size > 0) + { + //change status from SEND_OK to SEND_CONTINUE + it->status = SEND_CONTINUE; + } + //can not recive from clent continue + else + { + //change status from SEND_OK to SEND_END + it->status = SEND_END; + } } - //send_end_size recalc - it->send_end_size = 0; - } - //sending possible data is not exist - else - { - //can recive from clent continue - if (it->send_rest_size > 0) + it = recv_data.send_status_list.begin(); + it = find_if(it, it_end, data_send_ok()); + //send_ok item is exist + if (it != it_end) { - //change status from SEND_OK to SEND_CONTINUE - it->status = SEND_CONTINUE; + status = SORRYSERVER_CONNECT; } - //can not recive from clent continue + //send_ok item is exist else { - //change status from SEND_OK to SEND_END - it->status = SEND_END; + status = CLIENT_RECV; } - } - it = recv_data.send_status_list.begin(); - it = find_if(it, it_end, data_send_ok()); - //send_ok item is exist - if (it != it_end) + } + catch (int e) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorryserver_send() : catch exception e = %d. thread id : %d."); + formatter % e % boost::this_thread::get_id(); + putLogDebug(100138, formatter.str(), __FILE__, __LINE__ ); + } + status = FINALIZE; + /*------DEBUG LOG END------*/ + } + catch (const std::exception& ex) { - status = SORRYSERVER_CONNECT; + std::cerr << "protocol_module_sessionless::handle_sorryserver_send() : exception : error = " << ex.what() << "." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorryserver_send() : exception : error = %s. thread id : %d."); + formatter % ex.what() % boost::this_thread::get_id(); + putLogError(100077, formatter.str(), __FILE__, __LINE__ ); + + status = FINALIZE; } - //send_ok item is exist - else + catch (...) { - status = CLIENT_RECV; + std::cerr << "protocol_module_sessionless::handle_sorryserver_send() : Unknown exception." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorryserver_send() : Unknown exception. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100078, formatter.str(), __FILE__, __LINE__ ); + status = FINALIZE; } - } - catch (int e) - { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorryserver_send() : catch exception e = %d. thread id : %d."); - formatter % e % boost::this_thread::get_id(); - putLogDebug(10137, formatter.str(), __FILE__, __LINE__ ); + boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorryserver_send(const boost::thread::id thread_id) : return_value = %d. thread id : %d."); + formatter % status % boost::this_thread::get_id(); + putLogDebug(100139, formatter.str(), __FILE__, __LINE__ ); } - status = FINALIZE; /*------DEBUG LOG END------*/ - } - catch (const std::exception& ex) - { - std::cerr << "protocol_module_sessionless::handle_sorryserver_send() : exception : error = " << ex.what() << "." << std::endl; - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorryserver_send() : exception : error = %s. thread id : %d."); - formatter % ex.what() % boost::this_thread::get_id(); - putLogError(17074, formatter.str(), __FILE__, __LINE__ ); - - status = FINALIZE; - } - catch (...) - { - std::cerr << "protocol_module_sessionless::handle_sorryserver_send() : Unknown exception." << std::endl; - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorryserver_send() : Unknown exception. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogError(17075, formatter.str(), __FILE__, __LINE__ ); - status = FINALIZE; - } - - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorryserver_send(const boost::thread::id thread_id) : return_value = %d. thread id : %d."); - formatter % status % boost::this_thread::get_id(); - putLogDebug(10138, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - - return status; -} -//! called from after realserver recive.for UDP -//! @param[in] downstream thread id -//! @param[in] realserver UDP endpoint reference -//! @param[in] recive from realserver buffer reference -//! @param[in] recv data length -//! @return session use EVENT mode. -protocol_module_base::EVENT_TAG protocol_module_sessionless::handle_realserver_recv( - const boost::thread::id thread_id, const boost::asio::ip::udp::endpoint& rs_endpoint, const boost::array& recvbuffer, const size_t recvlen) -{ - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - boost::format formatter("in/out_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_realserver_recv(const boost::thread::id thread_id, " - "const boost::asio::ip::udp::endpoint& rs_endpoint, " - "const boost::array& recvbuffer, " - "const size_t recvlen) : " - "return_value = %d. thread id : %d."); - formatter % STOP % boost::this_thread::get_id(); - putLogDebug(10139, formatter.str(), __FILE__, __LINE__ ); + return status; } - /*------DEBUG LOG END------*/ - return STOP; -} -//! called from after realserver recvive for TCP/IP -//! @param[in] downstream thread id -//! @param[in] realserver TCP/IP endpoint reference -//! @param[in] realserver recive buffer reference. -//! @param[in] recv data length -//! @return session use EVENT mode. -protocol_module_base::EVENT_TAG protocol_module_sessionless::handle_realserver_recv( - const boost::thread::id thread_id, const boost::asio::ip::tcp::endpoint& rs_endpoint, const boost::array& recvbuffer, const size_t recvlen) -{ - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - size_t buffer_size = recvbuffer.size() < recvlen ? recvbuffer.size() : recvlen; - std::string buffer(recvbuffer.data(), buffer_size); - boost::format formatter("in_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_realserver_recv(const boost::thread::id thread_id, " - "const boost::asio::ip::tcp::endpoint& rs_endpoint, " - "const boost::array& recvbuffer, " - "const size_t recvlen) : thread_id = %d, rs_endpoint = [%s]:%d, recvbuffer = %s, recvlen = %d."); - formatter % thread_id % rs_endpoint.address().to_string() % rs_endpoint.port() - % buffer % recvlen; - putLogDebug(10140, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - - EVENT_TAG status = FINALIZE; - size_t data_remain_start = 0; - size_t data_remain_size = 0; - size_t request_data_remain_size = 0; - size_t header_offset = 0; - size_t header_offset_len = 0; - size_t content_length_header_offset = 0; - size_t content_length_header_len = 0; - size_t content_len_value = 0; - size_t pos = 0; - size_t buffer_size = 0; - const size_t cr_lf_len = strlen("\r\n\r\n"); - thread_data_ptr session_data; - char* buffer1 = NULL; - char* buffer2 = NULL; - std::string str_value; - const std::string http_header = ""; - const std::string content_header = "Content-Length"; - bool bret = false; - CHECK_RESULT_TAG check_result; - session_thread_data_map_it session_thread_it; - recive_data_map_it recive_data_it; - - //parameter check - if (recvlen > recvbuffer.size()) + //! called from after realserver recive.for UDP + //! @param[in] downstream thread id + //! @param[in] realserver UDP endpoint reference + //! @param[in] recive from realserver buffer reference + //! @param[in] recv data length + //! @return session use EVENT mode. + protocol_module_base::EVENT_TAG protocol_module_sessionless::handle_realserver_recv( + const boost::thread::id thread_id, const boost::asio::ip::udp::endpoint& rs_endpoint, const boost::array& recvbuffer, const size_t recvlen) { - std::cerr << "protocol_module_sessionless::handle_realserver_recv() : Data size bigger than buffer size." << std::endl; - boost::format formatter("Data size bigger than buffer size. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogError(17076, formatter.str(), __FILE__, __LINE__ ); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + boost::format formatter("in/out_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" "handle_realserver_recv(const boost::thread::id thread_id, " - "const boost::asio::ip::tcp::endpoint& rs_endpoint, " + "const boost::asio::ip::udp::endpoint& rs_endpoint, " "const boost::array& recvbuffer, " - "const size_t recvlen) : return_value = %d. thread id : %d."); - formatter % FINALIZE % boost::this_thread::get_id(); - putLogDebug(10141, formatter.str(), __FILE__, __LINE__ ); + "const size_t recvlen) : " + "return_value = %d. thread id : %d."); + formatter % STOP % boost::this_thread::get_id(); + putLogDebug(100140, formatter.str(), __FILE__, __LINE__ ); } /*------DEBUG LOG END------*/ - return FINALIZE; + return STOP; } - try + //! called from after realserver recvive for TCP/IP + //! @param[in] downstream thread id + //! @param[in] realserver TCP/IP endpoint reference + //! @param[in] realserver recive buffer reference. + //! @param[in] recv data length + //! @return session use EVENT mode. + protocol_module_base::EVENT_TAG protocol_module_sessionless::handle_realserver_recv( + const boost::thread::id thread_id, const boost::asio::ip::tcp::endpoint& rs_endpoint, const boost::array& recvbuffer, const size_t recvlen) { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - boost::mutex::scoped_lock slock(session_thread_data_map_mutex); + size_t buffer_size = recvbuffer.size() < recvlen ? recvbuffer.size() : recvlen; + std::string buffer; + dump_memory(recvbuffer.data(), buffer_size, buffer); + boost::format formatter("in_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_realserver_recv(const boost::thread::id thread_id, " + "const boost::asio::ip::tcp::endpoint& rs_endpoint, " + "const boost::array& recvbuffer, " + "const size_t recvlen) : thread_id = %d, rs_endpoint = [%s]:%d, recvbuffer = %s, recvlen = %d."); + formatter % thread_id % rs_endpoint.address().to_string() % rs_endpoint.port() + % buffer % recvlen; + putLogDebug(100141, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ - session_thread_it = session_thread_data_map.find(thread_id); - if (session_thread_it == session_thread_data_map.end() - ||session_thread_it->second == NULL) + EVENT_TAG status = FINALIZE; + size_t data_remain_start = 0; + size_t data_remain_size = 0; + size_t request_data_remain_size = 0; + size_t header_offset = 0; + size_t header_offset_len = 0; + size_t content_length_header_offset = 0; + size_t content_length_header_len = 0; + size_t content_len_value = 0; + size_t pos = 0; + size_t buffer_size = 0; + const size_t cr_lf_len = strlen("\r\n\r\n"); + thread_data_ptr session_data; + char* buffer1 = NULL; + char* buffer2 = NULL; + std::string str_value; + const std::string http_header = ""; + const std::string content_header = "Content-Length"; + bool bret = false; + CHECK_RESULT_TAG check_result; + session_thread_data_map_it session_thread_it; + recive_data_map_it recive_data_it; + + //parameter check + if (recvlen > recvbuffer.size()) + { + std::cerr << "protocol_module_sessionless::handle_realserver_recv() : Data size bigger than buffer size." << std::endl; + boost::format formatter("Data size bigger than buffer size. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100079, formatter.str(), __FILE__, __LINE__ ); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - boost::format formatter("Invalid thread id. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogError(17077, formatter.str(), __FILE__, __LINE__ ); - throw -1; + boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_realserver_recv(const boost::thread::id thread_id, " + "const boost::asio::ip::tcp::endpoint& rs_endpoint, " + "const boost::array& recvbuffer, " + "const size_t recvlen) : return_value = %d. thread id : %d."); + formatter % FINALIZE % boost::this_thread::get_id(); + putLogDebug(100142, formatter.str(), __FILE__, __LINE__ ); } - - session_data = session_thread_it->second; + /*------DEBUG LOG END------*/ + return FINALIZE; } - recive_data_it = session_data->recive_data_map.find(rs_endpoint); - if (recive_data_it == session_data->recive_data_map.end()) + try { - recive_data recv_data; - session_data->recive_data_map[rs_endpoint] = recv_data; - session_data->target_endpoint = rs_endpoint; - } - - recive_data& recv_data = session_data->recive_data_map[rs_endpoint]; - - send_status_it it = recv_data.send_status_list.begin(); - send_status_it it_end = recv_data.send_status_list.end(); + { + boost::mutex::scoped_lock slock(session_thread_data_map_mutex ); - //status list check - it = std::find_if(it, it_end, data_send_ok()); - if (it != it_end) - { - boost::format formatter("Sending data is not correct. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogError(17078, formatter.str(), __FILE__, __LINE__ ); - throw -1; - } + session_thread_it = session_thread_data_map.find(thread_id); + if (unlikely(session_thread_it == session_thread_data_map.end() + ||session_thread_it->second == NULL)) + { + boost::format formatter("Invalid thread id. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100080, formatter.str(), __FILE__, __LINE__ ); + throw -1; + } - //status list check - it = recv_data.send_status_list.begin(); - it = std::adjacent_find(it, it_end, data_send_repeated()); - if (it != it_end) - { - boost::format formatter("Sending data is not correct. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogError(17079, formatter.str(), __FILE__, __LINE__ ); - throw -1; - } + session_data = session_thread_it->second; + } - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - std::string datadump; - boost::format formatter("\nitem[%d] : status = %d, send_end_size = %d, " - "send_rest_size = %d, send_possible_size = %d, " - "send_offset = %d, unsend_size = %d, edit_division = %d."); - int i = 0; - for (it = recv_data.send_status_list.begin(); - it != recv_data.send_status_list.end(); - ++it, ++i) + recive_data_it = session_data->recive_data_map.find(rs_endpoint); + if (recive_data_it == session_data->recive_data_map.end()) { - formatter % i % it->status % it->send_end_size - % it->send_rest_size % it->send_possible_size - % it->send_offset % it->unsend_size % it->edit_division; - datadump += formatter.str(); + recive_data recv_data; + session_data->recive_data_map[rs_endpoint] = recv_data; } - formatter.parse("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_realserver_recv() : send status list dump : send status list size = %d.%s"); + session_data->target_endpoint = rs_endpoint; - formatter % recv_data.send_status_list.size() % datadump; - putLogDebug(10142, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - it = recv_data.send_status_list.begin(); - //get original status info - while (it != it_end) - { - //item status is SEND_END - if (it->status == SEND_END) - { - //erase from list - recv_data.send_status_list.erase(it++); - continue; - } - //item status is SEND_CONTINUE - else if (it->status == SEND_CONTINUE) - { - it->send_offset += it->send_end_size; - data_remain_start = it->send_offset; - break; - } - //item status is SEND_NG - else + recive_data& recv_data = session_data->recive_data_map[rs_endpoint]; + + send_status_it it = recv_data.send_status_list.begin(); + send_status_it it_end = recv_data.send_status_list.end(); + + //status list check + it = std::find_if(it, it_end, data_send_ok()); + if (unlikely(it != it_end)) { - data_remain_start = it->send_offset; - data_remain_size = it->unsend_size; - break; + boost::format formatter("Sending data is not correct. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100081, formatter.str(), __FILE__, __LINE__ ); + throw -1; } - ++it; - } - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - std::string datadump; - boost::format formatter("\nitem[%d] : status = %d, send_end_size = %d, " - "send_rest_size = %d, send_possible_size = %d, " - "send_offset = %d, unsend_size = %d, edit_division = %d."); - int i = 0; - for (it = recv_data.send_status_list.begin(); - it != recv_data.send_status_list.end(); - ++it, ++i) + //status list check + it = recv_data.send_status_list.begin(); + it = std::adjacent_find(it, it_end, data_send_repeated()); + if (unlikely(it != it_end)) { - formatter % i % it->status % it->send_end_size - % it->send_rest_size % it->send_possible_size - % it->send_offset % it->unsend_size % it->edit_division; - datadump += formatter.str(); + boost::format formatter("Sending data is not correct. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100082, formatter.str(), __FILE__, __LINE__ ); + throw -1; } - formatter.parse("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_realserver_recv() : send status list dump : send status list size = %d.%s"); - - formatter % recv_data.send_status_list.size() % datadump; - putLogDebug(10143, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - //recive buffer process - //buffer rest size < request size - if (recv_data.recive_buffer_rest_size < recvlen) - { - //buffer max size < remain size + request size - //buffer is need reallocate - if (recv_data.recive_buffer_max_size < data_remain_size + recvlen) + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - //recive_buffer1's memory allocate and initialization - buffer_size = (data_remain_size + recvlen) > MAX_BUFFER_SIZE ? (data_remain_size + recvlen) : MAX_BUFFER_SIZE; - buffer1 = new char[buffer_size]; - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - boost::format formatter("new : address = &(%d), size = %lu."); - formatter % static_cast(buffer1) % buffer_size; - putLogDebug(10144, formatter.str(), __FILE__, __LINE__ ); - } - /*-------- DEBUG LOG --------*/ - memset(buffer1, 0, buffer_size); - //recive_buffer2's memory allocate and initialization - buffer2 = new char[buffer_size]; - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - boost::format formatter("new : address = &(%d), size = %lu."); - formatter % static_cast(buffer2) % buffer_size; - putLogDebug(10145, formatter.str(), __FILE__, __LINE__ ); + std::string datadump; + boost::format formatter("\nitem[%d] : status = %d, send_end_size = %d, " + "send_rest_size = %d, send_possible_size = %d, " + "send_offset = %d, unsend_size = %d, edit_division = %d."); + int i = 0; + for (it = recv_data.send_status_list.begin(); + it != recv_data.send_status_list.end(); + ++it, ++i) + { + formatter % i % it->status % it->send_end_size + % it->send_rest_size % it->send_possible_size + % it->send_offset % it->unsend_size % it->edit_division; + datadump += formatter.str(); } - /*-------- DEBUG LOG END--------*/ - memset(buffer2, 0, buffer_size); - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - std::string datadump; - dump_memory(recv_data.recive_buffer + data_remain_start, data_remain_size, datadump); + formatter.parse("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_realserver_recv() : send status list dump : send status list size = %d.%s"); - boost::format formatter( - "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_realserver_recv() : before memcpy (data dump) : " - "data begin = %d, data_size = %d, data = %s"); - formatter % data_remain_start % data_remain_size % datadump; - putLogDebug(10146, formatter.str(), __FILE__, __LINE__ ); + formatter % recv_data.send_status_list.size() % datadump; + putLogDebug(100143, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + it = recv_data.send_status_list.begin(); + //get original status info + while (it != it_end) + { + //item status is SEND_END + if (it->status == SEND_END) + { + //erase from list + recv_data.send_status_list.erase(it++); + continue; } - /*------DEBUG LOG END------*/ - //copy data from old buffer to new buffer - memcpy(buffer1, recv_data.recive_buffer + data_remain_start, data_remain_size); - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + //item status is SEND_CONTINUE + else if (it->status == SEND_CONTINUE) { - std::string datadump; - dump_memory(buffer1, data_remain_size, datadump); - - boost::format formatter( - "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_realserver_recv() : after memcpy (data dump) : " - "data begin = 0, data_size = %d, data = %s"); - formatter % data_remain_size % datadump; - putLogDebug(10147, formatter.str(), __FILE__, __LINE__ ); + it->send_offset += it->send_end_size; + data_remain_start = it->send_offset; + break; } - /*------DEBUG LOG END------*/ - - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + //item status is SEND_NG + else { - std::string datadump; - dump_memory(recvbuffer.data(), recvlen, datadump); - boost::format formatter( - "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_realserver_recv() : before memcpy (data dump) : " - "data begin = 0, data_size = %d, data = %s"); - formatter % recvlen % datadump; - putLogDebug(10148, formatter.str(), __FILE__, __LINE__ ); + data_remain_start = it->send_offset; + data_remain_size = it->unsend_size; + break; } - /*------DEBUG LOG END------*/ - memcpy(buffer1 + data_remain_size, recvbuffer.data(), recvlen); - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + + ++it; + } + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + boost::format formatter("\nitem[%d] : status = %d, send_end_size = %d, " + "send_rest_size = %d, send_possible_size = %d, " + "send_offset = %d, unsend_size = %d, edit_division = %d."); + int i = 0; + for (it = recv_data.send_status_list.begin(); + it != recv_data.send_status_list.end(); + ++it, ++i) { - std::string datadump; - dump_memory(buffer1 + data_remain_size, recvlen, datadump); - boost::format formatter( - "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_realserver_recv() : after memcpy (data dump) : " - "data begin = %d, data_size = %d, data = %s"); - formatter % data_remain_size % recvlen % datadump; - putLogDebug(10149, formatter.str(), __FILE__, __LINE__ ); + formatter % i % it->status % it->send_end_size + % it->send_rest_size % it->send_possible_size + % it->send_offset % it->unsend_size % it->edit_division; + datadump += formatter.str(); } - /*------DEBUG LOG END------*/ - //free old buffer1 and old buffer2 - if (recv_data.recive_buffer1 != NULL) + + formatter.parse("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_realserver_recv() : send status list dump : send status list size = %d.%s"); + + formatter % recv_data.send_status_list.size() % datadump; + putLogDebug(100144, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + //recive buffer process + //buffer rest size < request size + if (recv_data.recive_buffer_rest_size < recvlen) + { + //buffer max size < remain size + request size + //buffer is need reallocate + if (recv_data.recive_buffer_max_size < data_remain_size + recvlen) { + //the buffer's size that will be allocated is exceed the upper limit value + if (MAX_SESSIONLESS_MODULE_BUFFER_SIZE < data_remain_size + recvlen) + { + std::cerr << "protocol_module_sessionless::handle_realserver_recv() : the buffer's size that will be allacted is exceed the upper limit value." << std::endl; + boost::format formatter("The buffer's size that will be allocated is exceed the upper limit value. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100083, formatter.str(), __FILE__, __LINE__ ); + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_realserver_recv(const boost::thread::id thread_id, " + "const boost::asio::ip::tcp::endpoint& rs_endpoint, " + "const boost::array& recvbuffer, " + "const size_t recvlen) : return_value = %d. thread id : %d."); + formatter % FINALIZE % boost::this_thread::get_id(); + putLogDebug(100145, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + return FINALIZE; + } + //recive_buffer1's memory allocate and initialization + buffer_size = (data_remain_size + recvlen) > MAX_BUFFER_SIZE ? (data_remain_size + recvlen) : MAX_BUFFER_SIZE; + buffer1 = new char[buffer_size]; /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - boost::format formatter("delete : address = &(%d)."); - formatter % static_cast(recv_data.recive_buffer1); - putLogDebug(10150, formatter.str(), __FILE__, - __LINE__ ); + boost::format formatter("new : address = &(%d), size = %lu."); + formatter % static_cast(buffer1) % buffer_size; + putLogDebug(100146, formatter.str(), __FILE__, __LINE__ ); } - /*------DEBUG LOG END------*/ - delete[] recv_data.recive_buffer1; - recv_data.recive_buffer1 = NULL; - } - - if (recv_data.recive_buffer2 != NULL) - { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + memset(buffer1, 0, buffer_size); + //recive_buffer2's memory allocate and initialization + buffer2 = new char[buffer_size]; + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - boost::format formatter("delete : address = &(%d)."); - formatter % static_cast(recv_data.recive_buffer2); - putLogDebug(10151, formatter.str(), __FILE__, - __LINE__ ); + boost::format formatter("new : address = &(%d), size = %lu."); + formatter % static_cast(buffer2) % buffer_size; + putLogDebug(100147, formatter.str(), __FILE__, __LINE__ ); } - /*------DEBUG LOG END------*/ - delete[] recv_data.recive_buffer2; - recv_data.recive_buffer2 = NULL; - } + /*-------- DEBUG LOG END--------*/ + memset(buffer2, 0, buffer_size); - //set new buffer pointer - recv_data.recive_buffer1 = buffer1; - recv_data.recive_buffer2 = buffer2; - recv_data.recive_buffer = recv_data.recive_buffer1; - //set new buffer's max size - recv_data.recive_buffer_max_size = buffer_size; - } - //buffer's max size >= remain data size + requst size - //buffer isn't need reallocate, but switch - else - { - //pointer valid check - if (recv_data.recive_buffer1 == NULL || recv_data.recive_buffer2 == NULL) - { - boost::format formatter("Invalid pointer. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogError(17080, formatter.str(), __FILE__, __LINE__ ); - throw -1; - } - //using buffer is buffer1 - if (recv_data.recive_buffer == recv_data.recive_buffer1) - { - //buffer2 initialization - memset(recv_data.recive_buffer2, 0, recv_data.recive_buffer_max_size); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { std::string datadump; dump_memory(recv_data.recive_buffer + data_remain_start, data_remain_size, datadump); + boost::format formatter( "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" "handle_realserver_recv() : before memcpy (data dump) : " "data begin = %d, data_size = %d, data = %s"); formatter % data_remain_start % data_remain_size % datadump; - putLogDebug(10152, formatter.str(), __FILE__, __LINE__ ); + putLogDebug(100148, formatter.str(), __FILE__, __LINE__ ); } /*------DEBUG LOG END------*/ - //copy data from buffer1 to buffer2 - memcpy(recv_data.recive_buffer2, recv_data.recive_buffer + data_remain_start, data_remain_size); + //copy data from old buffer to new buffer + memcpy(buffer1, recv_data.recive_buffer + data_remain_start, data_remain_size); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { std::string datadump; - dump_memory(recv_data.recive_buffer2, data_remain_size, datadump); + dump_memory(buffer1, data_remain_size, datadump); + boost::format formatter( "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" "handle_realserver_recv() : after memcpy (data dump) : " "data begin = 0, data_size = %d, data = %s"); formatter % data_remain_size % datadump; - putLogDebug(10153, formatter.str(), __FILE__, __LINE__ ); + putLogDebug(100149, formatter.str(), __FILE__, __LINE__ ); } /*------DEBUG LOG END------*/ + /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { std::string datadump; dump_memory(recvbuffer.data(), recvlen, datadump); @@ -4541,265 +4537,582 @@ protocol_module_base::EVENT_TAG protocol_module_sessionless::handle_realserver_r "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" "handle_realserver_recv() : before memcpy (data dump) : " "data begin = 0, data_size = %d, data = %s"); - formatter % data_remain_size % datadump; - putLogDebug(10154, formatter.str(), __FILE__, __LINE__ ); + formatter % recvlen % datadump; + putLogDebug(100150, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + memcpy(buffer1 + data_remain_size, recvbuffer.data(), recvlen); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + dump_memory(buffer1 + data_remain_size, recvlen, datadump); + boost::format formatter( + "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_realserver_recv() : after memcpy (data dump) : " + "data begin = %d, data_size = %d, data = %s"); + formatter % data_remain_size % recvlen % datadump; + putLogDebug(100151, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + //free old buffer1 and old buffer2 + if (recv_data.recive_buffer1 != NULL) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("delete : address = &(%d)."); + formatter % static_cast(recv_data.recive_buffer1); + putLogDebug(100152, formatter.str(), __FILE__, + __LINE__ ); + } + /*------DEBUG LOG END------*/ + delete[] recv_data.recive_buffer1; + recv_data.recive_buffer1 = NULL; + } + + if (recv_data.recive_buffer2 != NULL) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("delete : address = &(%d)."); + formatter % static_cast(recv_data.recive_buffer2); + putLogDebug(100153, formatter.str(), __FILE__, + __LINE__ ); + } + /*------DEBUG LOG END------*/ + delete[] recv_data.recive_buffer2; + recv_data.recive_buffer2 = NULL; + } + + //set new buffer pointer + recv_data.recive_buffer1 = buffer1; + recv_data.recive_buffer2 = buffer2; + recv_data.recive_buffer = recv_data.recive_buffer1; + //set new buffer's max size + recv_data.recive_buffer_max_size = buffer_size; + } + //buffer's max size >= remain data size + requst size + //buffer isn't need reallocate, but switch + else + { + //pointer valid check + if (unlikely(recv_data.recive_buffer1 == NULL || recv_data.recive_buffer2 == NULL)) + { + boost::format formatter("Invalid pointer. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100084, formatter.str(), __FILE__, __LINE__ ); + throw -1; + } + //using buffer is buffer1 + if (recv_data.recive_buffer == recv_data.recive_buffer1) + { + //buffer2 initialization + memset(recv_data.recive_buffer2, 0, recv_data.recive_buffer_max_size); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + dump_memory(recv_data.recive_buffer + data_remain_start, data_remain_size, datadump); + boost::format formatter( + "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_realserver_recv() : before memcpy (data dump) : " + "data begin = %d, data_size = %d, data = %s"); + formatter % data_remain_start % data_remain_size % datadump; + putLogDebug(100154, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + //copy data from buffer1 to buffer2 + memcpy(recv_data.recive_buffer2, recv_data.recive_buffer + data_remain_start, data_remain_size); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + dump_memory(recv_data.recive_buffer2, data_remain_size, datadump); + boost::format formatter( + "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_realserver_recv() : after memcpy (data dump) : " + "data begin = 0, data_size = %d, data = %s"); + formatter % data_remain_size % datadump; + putLogDebug(100155, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + dump_memory(recvbuffer.data(), recvlen, datadump); + boost::format formatter( + "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_realserver_recv() : before memcpy (data dump) : " + "data begin = 0, data_size = %d, data = %s"); + formatter % data_remain_size % datadump; + putLogDebug(100156, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + memcpy(recv_data.recive_buffer2 + data_remain_size, recvbuffer.data(), recvlen); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + dump_memory(recv_data.recive_buffer2 + data_remain_size, recvlen, datadump); + + boost::format formatter( + "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_realserver_recv() : after memcpy (data dump) : " + "data begin = %d, data_size = %d, data = %s"); + formatter % data_remain_size % recvlen % datadump; + putLogDebug(100157, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + //set buffer2 as using buffer + recv_data.recive_buffer = recv_data.recive_buffer2; + } + //using buffer is buffer2 + else + { + //buffer1 initialization + memset(recv_data.recive_buffer1, 0, recv_data.recive_buffer_max_size); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + dump_memory(recv_data.recive_buffer + data_remain_start, data_remain_size, datadump); + + boost::format formatter( + "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_realserver_recv() : before memcpy (data dump) : " + "data begin = %d, data_size = %d, data = %s"); + formatter % data_remain_start % data_remain_size % datadump; + putLogDebug(100158, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + //copy data from buffer2 to buffer1 + memcpy(recv_data.recive_buffer1, recv_data.recive_buffer + data_remain_start, data_remain_size); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + dump_memory(recv_data.recive_buffer1, data_remain_size, datadump); + + boost::format formatter( + "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_realserver_recv() : after memcpy (data dump) : " + "data begin = 0, data_size = %d, data = %s"); + formatter % data_remain_size % datadump; + putLogDebug(100159, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + dump_memory(recvbuffer.data(), recvlen, datadump); + + boost::format formatter( + "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_realserver_recv() : before memcpy (data dump) : " + "data begin = 0, data_size = %d, data = %s"); + formatter % recvlen % datadump; + putLogDebug(100160, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + memcpy(recv_data.recive_buffer1 + data_remain_size, recvbuffer.data(), recvlen); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + dump_memory(recv_data.recive_buffer1 + data_remain_size, recvlen, datadump); + + boost::format formatter( + "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_realserver_recv() : after memcpy (data dump) : " + "data begin = %d, data_size = %d, data = %s"); + formatter % data_remain_size % recvlen % datadump; + putLogDebug(100161, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + //set buffer1 as using buffer + recv_data.recive_buffer = recv_data.recive_buffer1; + } + } + + //set buffer's rest size + recv_data.recive_buffer_rest_size = recv_data.recive_buffer_max_size - data_remain_size - recvlen; + + //remain_size recalc + data_remain_size += recvlen; + + send_status_it it_begin = recv_data.send_status_list.begin(); + send_status_it it_end = recv_data.send_status_list.end(); + //offset recalc + for (; it_begin != it_end; ++it_begin) + { + it_begin->send_offset -= data_remain_start; + } + } + //buffer's rest size >= request size + //copy directly + else + { + //pointer valid check + if (unlikely(recv_data.recive_buffer == NULL)) + { + boost::format formatter("Invalid pointer. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100085, formatter.str(), __FILE__, __LINE__ ); + throw -1; + } + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + dump_memory(recvbuffer.data(), recvlen, datadump); + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_realserver_recv() : before memcpy (data dump) : " + "data begin = 0, data_size = %d, data = %s"); + formatter % recvlen % datadump; + putLogDebug(100162, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + //copy data from parameter to using buffer + memcpy(recv_data.recive_buffer + recv_data.recive_buffer_max_size - recv_data.recive_buffer_rest_size, + recvbuffer.data(), recvlen); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + dump_memory(recv_data.recive_buffer + recv_data.recive_buffer_max_size - recv_data.recive_buffer_rest_size, + recvlen, datadump); + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_realserver_recv() : before memcpy (data dump) : " + "data begin = %d, data_size = %d, data = %s"); + formatter % (recv_data.recive_buffer_max_size - recv_data.recive_buffer_rest_size ) + % recvlen % datadump; + putLogDebug(100163, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + //buffer's rest size recalc + recv_data.recive_buffer_rest_size -= recvlen; + //remain data size recalc + data_remain_size += recvlen; + } + + it = recv_data.send_status_list.begin(); + it_end = recv_data.send_status_list.end(); + //request rest size initialization + request_data_remain_size = recvlen; + //original status process + for (; it != it_end; ++it) + { + //status is SEND_CONTINUE + if (it->status == SEND_CONTINUE) + { + //send rest size > request size + if (it->send_rest_size > request_data_remain_size) + { + //send possible size recalc + it->send_possible_size = request_data_remain_size; + //send rest size recalc + it->send_rest_size -= request_data_remain_size; + //send end size recalc + it->send_end_size = 0; + //request size recalc + request_data_remain_size = 0; + } + //send rest size <= request size + else + { + //send possible size recalc + it->send_possible_size = it->send_rest_size; + //send rest size recalc + request_data_remain_size -= it->send_rest_size; + //send end size recalc + it->send_end_size = 0; + //request size recalc + it->send_rest_size = 0; + } + //change status from SEND_CONTINUE to SEND_OK + it->status = SEND_OK; + } + //status is SEND_NG + else if (it->status == SEND_NG) + { + //check http method + check_result = check_status_code(recv_data.recive_buffer + it->send_offset, data_remain_size); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_realserver_recv() : call check_http_method : " + "return_value = %d. thread id : %d."); + formatter % check_result % boost::this_thread::get_id(); + putLogDebug(100164, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + //check http method result is OK + if (check_result == CHECK_OK) + { + //check http version + check_result = check_http_version(recv_data.recive_buffer + it->send_offset, data_remain_size); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_realserver_recv() : call check_http_version : " + "return_value = %d. thread id : %d."); + formatter % check_result % boost::this_thread::get_id(); + putLogDebug(100165, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + } + //check method and version result is OK + if (check_result == CHECK_OK) + { + //search http header + bret = find_http_header(recv_data.recive_buffer + it->send_offset, data_remain_size, http_header, + header_offset, header_offset_len); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_realserver_recv() : call find_http_header : " + "return_value = %d. thread id : %d."); + formatter % static_cast(bret) % boost::this_thread::get_id(); + putLogDebug(100166, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + //search http header result is OK + if (bret) + { + //search Content_Length header + bret = find_http_header(recv_data.recive_buffer + it->send_offset, data_remain_size, + content_header, content_length_header_offset, content_length_header_len); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_realserver_recv() : call find_http_header : " + "return_value = %d. thread id : %d."); + formatter % static_cast(bret) % boost::this_thread::get_id(); + putLogDebug(100167, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + //search Content_Length result is OK + if (bret) + { + //Get Content_Length header's numeric value + for (pos = 0; recv_data.recive_buffer[it->send_offset + content_length_header_offset + pos] != ':' && pos + < content_length_header_len; ++pos) + ; + if (pos == content_length_header_len) + { + throw std::string("Content_Length field's value is invalid."); + } + + ++pos; + + str_value.assign(recv_data.recive_buffer + it->send_offset + content_length_header_offset + pos, + content_length_header_len - pos); + + size_t pos_end = str_value.find_last_of('\r'); + if (pos_end != std::string::npos) + { + str_value = str_value.erase(pos_end); + } + + for (pos = 0; !isgraph(str_value[pos]) && str_value[pos] != '\0'; ++pos) + ; + + str_value = str_value.substr(pos); + + try + { + content_len_value = boost::lexical_cast(str_value.c_str()); + } + catch (const boost::bad_lexical_cast& ex) + { + throw std::string("Content_Length field's value is invalid."); + } + //send_rest_size recalc + //set whole http header's length + Content_Length's value + it->send_rest_size = header_offset + header_offset_len + cr_lf_len + content_len_value; + } + //search Content_Length result is NG + else + { + //send_rest_size recalc + //set whole http header's length + it->send_rest_size = header_offset + header_offset_len + cr_lf_len; + } + } + //search http header result is NG + else + { + it->unsend_size += request_data_remain_size; + request_data_remain_size = 0; + break; + } } - /*------DEBUG LOG END------*/ - memcpy(recv_data.recive_buffer2 + data_remain_size, recvbuffer.data(), recvlen); - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + //check method and version result is NG + else if (check_result == CHECK_NG) { - std::string datadump; - dump_memory(recv_data.recive_buffer2 + data_remain_size, recvlen, datadump); - - boost::format formatter( - "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_realserver_recv() : after memcpy (data dump) : " - "data begin = %d, data_size = %d, data = %s"); - formatter % data_remain_size % recvlen % datadump; - putLogDebug(10155, formatter.str(), __FILE__, __LINE__ ); + //send_rest_size recalc + it->send_rest_size = it->unsend_size + request_data_remain_size; } - /*------DEBUG LOG END------*/ - //set buffer2 as using buffer - recv_data.recive_buffer = recv_data.recive_buffer2; - } - //using buffer is buffer2 - else - { - //buffer1 initialization - memset(recv_data.recive_buffer1, 0, recv_data.recive_buffer_max_size); - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + //check method and version result is CHECK_INPOSSIBLE + else { - std::string datadump; - dump_memory(recv_data.recive_buffer + data_remain_start, data_remain_size, datadump); - - boost::format formatter( - "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_realserver_recv() : before memcpy (data dump) : " - "data begin = %d, data_size = %d, data = %s"); - formatter % data_remain_start % data_remain_size % datadump; - putLogDebug(10156, formatter.str(), __FILE__, __LINE__ ); + it->unsend_size += request_data_remain_size; + request_data_remain_size = 0; + break; } - /*------DEBUG LOG END------*/ - //copy data from buffer2 to buffer1 - memcpy(recv_data.recive_buffer1, recv_data.recive_buffer + data_remain_start, data_remain_size); - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - std::string datadump; - dump_memory(recv_data.recive_buffer1, data_remain_size, datadump); - boost::format formatter( - "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_realserver_recv() : after memcpy (data dump) : " - "data begin = 0, data_size = %d, data = %s"); - formatter % data_remain_size % datadump; - putLogDebug(10157, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + //recalc fields value according to send_rest_size and request rest size + if (it->send_rest_size > it->unsend_size + request_data_remain_size) { - std::string datadump; - dump_memory(recvbuffer.data(), recvlen, datadump); - - boost::format formatter( - "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_realserver_recv() : before memcpy (data dump) : " - "data begin = 0, data_size = %d, data = %s"); - formatter % recvlen % datadump; - putLogDebug(10158, formatter.str(), __FILE__, __LINE__ ); + it->send_possible_size = it->unsend_size+ request_data_remain_size; + it->send_rest_size -= (it->unsend_size + request_data_remain_size); + it->send_end_size = 0; + it->unsend_size = 0; + request_data_remain_size = 0; } - /*------DEBUG LOG END------*/ - memcpy(recv_data.recive_buffer1 + data_remain_size, recvbuffer.data(), recvlen); - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + else { - std::string datadump; - dump_memory(recv_data.recive_buffer1 + data_remain_size, recvlen, datadump); - - boost::format formatter( - "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_realserver_recv() : after memcpy (data dump) : " - "data begin = %d, data_size = %d, data = %s"); - formatter % data_remain_size % recvlen % datadump; - putLogDebug(10159, formatter.str(), __FILE__, __LINE__ ); + it->send_possible_size = it->send_rest_size; + request_data_remain_size = it->unsend_size + request_data_remain_size - it->send_rest_size; + it->send_end_size = 0; + it->unsend_size = 0; + it->send_rest_size = 0; } - /*------DEBUG LOG END------*/ - //set buffer1 as using buffer - recv_data.recive_buffer = recv_data.recive_buffer1; - } - } - //set buffer's rest size - recv_data.recive_buffer_rest_size = recv_data.recive_buffer_max_size - data_remain_size - recvlen; - - //remain_size recalc - data_remain_size += recvlen; - - send_status_it it_begin = recv_data.send_status_list.begin(); - send_status_it it_end = recv_data.send_status_list.end(); - //offset recalc - for (; it_begin != it_end; ++it_begin) - { - it_begin->send_offset -= data_remain_start; - } - } - //buffer's rest size >= request size - //copy directly - else - { - //pointer valid check - if (recv_data.recive_buffer == NULL) - { - boost::format formatter("Invalid pointer. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogError(17081, formatter.str(), __FILE__, __LINE__ ); - throw -1; - } - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - std::string datadump; - dump_memory(recvbuffer.data(), recvlen, datadump); - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_realserver_recv() : before memcpy (data dump) : " - "data begin = 0, data_size = %d, data = %s"); - formatter % recvlen % datadump; - putLogDebug(10160, formatter.str(), __FILE__, __LINE__ ); + //change status from SEND_NG to SEND_OK + it->status = SEND_OK; + } + //no request rest data to process + if (request_data_remain_size <= 0) + { + break; + } } - /*------DEBUG LOG END------*/ - //copy data from parameter to using buffer - memcpy(recv_data.recive_buffer + recv_data.recive_buffer_max_size - recv_data.recive_buffer_rest_size, - recvbuffer.data(), recvlen); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { std::string datadump; - dump_memory(recv_data.recive_buffer + recv_data.recive_buffer_max_size - recv_data.recive_buffer_rest_size, - recvlen, datadump); - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_realserver_recv() : before memcpy (data dump) : " - "data begin = %d, data_size = %d, data = %s"); - formatter % (recv_data.recive_buffer_max_size - recv_data.recive_buffer_rest_size ) - % recvlen % datadump; - putLogDebug(10161, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - //buffer's rest size recalc - recv_data.recive_buffer_rest_size -= recvlen; - //remain data size recalc - data_remain_size += recvlen; - } - - it = recv_data.send_status_list.begin(); - it_end = recv_data.send_status_list.end(); - //request rest size initialization - request_data_remain_size = recvlen; - //original status process - for (; it != it_end; ++it) - { - //status is SEND_CONTINUE - if (it->status == SEND_CONTINUE) - { - //send rest size > request size - if (it->send_rest_size > request_data_remain_size) - { - //send possible size recalc - it->send_possible_size = request_data_remain_size; - //send rest size recalc - it->send_rest_size -= request_data_remain_size; - //send end size recalc - it->send_end_size = 0; - //request size recalc - request_data_remain_size = 0; - } - //send rest size <= request size - else + boost::format formatter("\nitem[%d] : status = %d, send_end_size = %d, " + "send_rest_size = %d, send_possible_size = %d, " + "send_offset = %d, unsend_size = %d, edit_division = %d."); + int i = 0; + for (it = recv_data.send_status_list.begin(); + it != recv_data.send_status_list.end(); + ++it, ++i) { - //send possible size recalc - it->send_possible_size = it->send_rest_size; - //send rest size recalc - request_data_remain_size -= it->send_rest_size; - //send end size recalc - it->send_end_size = 0; - //request size recalc - it->send_rest_size = 0; + formatter % i % it->status % it->send_end_size + % it->send_rest_size % it->send_possible_size + % it->send_offset % it->unsend_size % it->edit_division; + datadump += formatter.str(); } - //change status from SEND_CONTINUE to SEND_OK - it->status = SEND_OK; + + formatter.parse("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_realserver_recv() : send status list dump : send status list size = %d.%s"); + + formatter % recv_data.send_status_list.size() % datadump; + putLogDebug(100168, formatter.str(), __FILE__, __LINE__ ); } - //status is SEND_NG - else if (it->status == SEND_NG) + /*------DEBUG LOG END------*/ + //there are still rest data need to process + //new status created and add to status list + while (request_data_remain_size > 0) { + //new status created + send_status new_send_state; + new_send_state.edit_division = EDIT_DIVISION_NO_EDIT; + new_send_state.send_end_size = 0; + new_send_state.send_offset = 0; + new_send_state.send_possible_size = 0; + new_send_state.unsend_size = 0; + new_send_state.send_rest_size = 0; + //status initialize to SEND_NG + new_send_state.status = SEND_NG; + //add new status to status_list + recv_data.send_status_list.push_back(new_send_state); + std::list::reverse_iterator new_send_it = recv_data.send_status_list.rbegin(); + //calc offset + new_send_it->send_offset = recv_data.recive_buffer_max_size - recv_data.recive_buffer_rest_size + - request_data_remain_size; + //check http method - check_result = check_status_code(recv_data.recive_buffer + it->send_offset, data_remain_size); + check_result = check_status_code(recv_data.recive_buffer + new_send_it->send_offset, + request_data_remain_size); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" "handle_realserver_recv() : call check_http_method : " "return_value = %d. thread id : %d."); formatter % check_result % boost::this_thread::get_id(); - putLogDebug(10162, formatter.str(), __FILE__, __LINE__ ); + putLogDebug(100169, formatter.str(), __FILE__, __LINE__ ); } /*------DEBUG LOG END------*/ //check http method result is OK if (check_result == CHECK_OK) { //check http version - check_result = check_http_version(recv_data.recive_buffer + it->send_offset, data_remain_size); + check_result = check_http_version(recv_data.recive_buffer + new_send_it->send_offset, + request_data_remain_size); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" "handle_realserver_recv() : call check_http_version : " "return_value = %d. thread id : %d."); formatter % check_result % boost::this_thread::get_id(); - putLogDebug(10163, formatter.str(), __FILE__, __LINE__ ); + putLogDebug(100170, formatter.str(), __FILE__, __LINE__ ); } /*------DEBUG LOG END------*/ } - //check method and version result is OK + //check http method and version result is OK if (check_result == CHECK_OK) { - //search http header - bret = find_http_header(recv_data.recive_buffer + it->send_offset, data_remain_size, http_header, - header_offset, header_offset_len); + //search whole http header, get whole http header's offset and length + bret = find_http_header(recv_data.recive_buffer + new_send_it->send_offset, request_data_remain_size, + http_header, header_offset, header_offset_len); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" "handle_realserver_recv() : call find_http_header : " "return_value = %d. thread id : %d."); formatter % static_cast(bret) % boost::this_thread::get_id(); - putLogDebug(10164, formatter.str(), __FILE__, __LINE__ ); + putLogDebug(100171, formatter.str(), __FILE__, __LINE__ ); } /*------DEBUG LOG END------*/ - //search http header result is OK + //searched whole http header if (bret) { - //search Content_Length header - bret = find_http_header(recv_data.recive_buffer + it->send_offset, data_remain_size, - content_header, content_length_header_offset, content_length_header_len); + //search ContentLength http header, get ContentLength header's offset and length + bret = find_http_header(recv_data.recive_buffer + new_send_it->send_offset, + request_data_remain_size, content_header, content_length_header_offset, content_length_header_len); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" "handle_realserver_recv() : call find_http_header : " "return_value = %d. thread id : %d."); formatter % static_cast(bret) % boost::this_thread::get_id(); - putLogDebug(10165, formatter.str(), __FILE__, __LINE__ ); + putLogDebug(100172, formatter.str(), __FILE__, __LINE__ ); } /*------DEBUG LOG END------*/ - //search Content_Length result is OK + + //searched ContentLength http header if (bret) { //Get Content_Length header's numeric value - for (pos = 0; recv_data.recive_buffer[it->send_offset + content_length_header_offset + pos] != ':' && pos - < content_length_header_len; ++pos) + for (pos = 0; recv_data.recive_buffer[new_send_it->send_offset + content_length_header_offset + pos] != ':' + && pos < content_length_header_len; ++pos) ; if (pos == content_length_header_len) { @@ -4808,7 +5121,7 @@ protocol_module_base::EVENT_TAG protocol_module_sessionless::handle_realserver_r ++pos; - str_value.assign(recv_data.recive_buffer + it->send_offset + content_length_header_offset + pos, + str_value.assign(recv_data.recive_buffer + new_send_it->send_offset + content_length_header_offset + pos, content_length_header_len - pos); size_t pos_end = str_value.find_last_of('\r'); @@ -4821,7 +5134,6 @@ protocol_module_base::EVENT_TAG protocol_module_sessionless::handle_realserver_r ; str_value = str_value.substr(pos); - try { content_len_value = boost::lexical_cast(str_value.c_str()); @@ -4831,718 +5143,424 @@ protocol_module_base::EVENT_TAG protocol_module_sessionless::handle_realserver_r throw std::string("Content_Length field's value is invalid."); } //send_rest_size recalc - //set whole http header's length + Content_Length's value - it->send_rest_size = header_offset + header_offset_len + cr_lf_len + content_len_value; + //set whole http header's + whole http header's length + Content_Length's value + new_send_it->send_rest_size = header_offset + header_offset_len + cr_lf_len + content_len_value; } - //search Content_Length result is NG + //not searched ContentLength http header else { //send_rest_size recalc - //set whole http header's length - it->send_rest_size = header_offset + header_offset_len + cr_lf_len; + //set whole http header's + whole http header's length + new_send_it->send_rest_size = header_offset + header_offset_len + cr_lf_len; } } - //search http header result is NG + //not searched whole http header else { - it->unsend_size += request_data_remain_size; + new_send_it->unsend_size = request_data_remain_size; request_data_remain_size = 0; break; } } - //check method and version result is NG + //check http method or version result is NG else if (check_result == CHECK_NG) { - //send_rest_size recalc - it->send_rest_size = it->unsend_size + request_data_remain_size; + new_send_it->send_rest_size = request_data_remain_size; } - //check method and version result is CHECK_INPOSSIBLE + //check http method or version result is impossible else { - it->unsend_size += request_data_remain_size; + new_send_it->unsend_size = request_data_remain_size; request_data_remain_size = 0; break; } //recalc fields value according to send_rest_size and request rest size - if (it->send_rest_size > it->unsend_size + request_data_remain_size) + if (new_send_it->send_rest_size > request_data_remain_size) { - it->send_possible_size = it->unsend_size+ request_data_remain_size; - it->send_rest_size -= (it->unsend_size + request_data_remain_size); - it->send_end_size = 0; - it->unsend_size = 0; + new_send_it->send_possible_size = request_data_remain_size; + new_send_it->send_rest_size -= request_data_remain_size; + new_send_it->send_end_size = 0; + new_send_it->send_end_size = 0; request_data_remain_size = 0; } - else - { - it->send_possible_size = it->send_rest_size; - request_data_remain_size = it->unsend_size + request_data_remain_size - it->send_rest_size; - it->send_end_size = 0; - it->unsend_size = 0; - it->send_rest_size = 0; - } - - //change status from SEND_NG to SEND_OK - it->status = SEND_OK; - } - //no request rest data to process - if (request_data_remain_size <= 0) - { - break; - } - } - - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - std::string datadump; - boost::format formatter("\nitem[%d] : status = %d, send_end_size = %d, " - "send_rest_size = %d, send_possible_size = %d, " - "send_offset = %d, unsend_size = %d, edit_division = %d."); - int i = 0; - for (it = recv_data.send_status_list.begin(); - it != recv_data.send_status_list.end(); - ++it, ++i) - { - formatter % i % it->status % it->send_end_size - % it->send_rest_size % it->send_possible_size - % it->send_offset % it->unsend_size % it->edit_division; - datadump += formatter.str(); - } - - formatter.parse("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_realserver_recv() : send status list dump : send status list size = %d.%s"); - - formatter % recv_data.send_status_list.size() % datadump; - putLogDebug(10166, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - //there are still rest data need to process - //new status created and add to status list - while (request_data_remain_size > 0) - { - //new status created - send_status new_send_state; - new_send_state.edit_division = EDIT_DIVISION_NO_EDIT; - new_send_state.send_end_size = 0; - new_send_state.send_offset = 0; - new_send_state.send_possible_size = 0; - new_send_state.unsend_size = 0; - new_send_state.send_rest_size = 0; - //status initialize to SEND_NG - new_send_state.status = SEND_NG; - //add new status to status_list - recv_data.send_status_list.push_back(new_send_state); - std::list::reverse_iterator new_send_it = recv_data.send_status_list.rbegin(); - //calc offset - new_send_it->send_offset = recv_data.recive_buffer_max_size - recv_data.recive_buffer_rest_size - - request_data_remain_size; - - //check http method - check_result = check_status_code(recv_data.recive_buffer + new_send_it->send_offset, - request_data_remain_size); - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_realserver_recv() : call check_http_method : " - "return_value = %d. thread id : %d."); - formatter % check_result % boost::this_thread::get_id(); - putLogDebug(10167, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - //check http method result is OK - if (check_result == CHECK_OK) - { - //check http version - check_result = check_http_version(recv_data.recive_buffer + new_send_it->send_offset, - request_data_remain_size); - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_realserver_recv() : call check_http_version : " - "return_value = %d. thread id : %d."); - formatter % check_result % boost::this_thread::get_id(); - putLogDebug(10168, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - } - //check http method and version result is OK - if (check_result == CHECK_OK) - { - //search whole http header, get whole http header's offset and length - bret = find_http_header(recv_data.recive_buffer + new_send_it->send_offset, request_data_remain_size, - http_header, header_offset, header_offset_len); - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_realserver_recv() : call find_http_header : " - "return_value = %d. thread id : %d."); - formatter % static_cast(bret) % boost::this_thread::get_id(); - putLogDebug(10169, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - //searched whole http header - if (bret) - { - //search ContentLength http header, get ContentLength header's offset and length - bret = find_http_header(recv_data.recive_buffer + new_send_it->send_offset, - request_data_remain_size, content_header, content_length_header_offset, content_length_header_len); - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_realserver_recv() : call find_http_header : " - "return_value = %d. thread id : %d."); - formatter % static_cast(bret) % boost::this_thread::get_id(); - putLogDebug(10170, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - - //searched ContentLength http header - if (bret) - { - //Get Content_Length header's numeric value - for (pos = 0; recv_data.recive_buffer[new_send_it->send_offset + content_length_header_offset + pos] != ':' - && pos < content_length_header_len; ++pos) - ; - if (pos == content_length_header_len) - { - throw std::string("Content_Length field's value is invalid."); - } - - ++pos; - - str_value.assign(recv_data.recive_buffer + new_send_it->send_offset + content_length_header_offset + pos, - content_length_header_len - pos); - - size_t pos_end = str_value.find_last_of('\r'); - if (pos_end != std::string::npos) - { - str_value = str_value.erase(pos_end); - } - - for (pos = 0; !isgraph(str_value[pos]) && str_value[pos] != '\0'; ++pos) - ; - - str_value = str_value.substr(pos); - try - { - content_len_value = boost::lexical_cast(str_value.c_str()); - } - catch (const boost::bad_lexical_cast& ex) - { - throw std::string("Content_Length field's value is invalid."); - } - //send_rest_size recalc - //set whole http header's + whole http header's length + Content_Length's value - new_send_it->send_rest_size = header_offset + header_offset_len + cr_lf_len + content_len_value; - } - //not searched ContentLength http header - else - { - //send_rest_size recalc - //set whole http header's + whole http header's length - new_send_it->send_rest_size = header_offset + header_offset_len + cr_lf_len; - } - } - //not searched whole http header - else - { - new_send_it->unsend_size = request_data_remain_size; - request_data_remain_size = 0; - break; + else + { + new_send_it->send_possible_size = new_send_it->send_rest_size; + request_data_remain_size -= new_send_it->send_rest_size; + new_send_it->send_end_size = 0; + new_send_it->send_rest_size = 0; } + + //change status from SEND_NG to SEND_OK + new_send_it->status = SEND_OK; } - //check http method or version result is NG - else if (check_result == CHECK_NG) - { - new_send_it->send_rest_size = request_data_remain_size; - } - //check http method or version result is impossible - else + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - new_send_it->unsend_size = request_data_remain_size; - request_data_remain_size = 0; - break; + std::string datadump; + boost::format formatter("\nitem[%d] : status = %d, send_end_size = %d, " + "send_rest_size = %d, send_possible_size = %d, " + "send_offset = %d, unsend_size = %d, edit_division = %d."); + int i = 0; + for (it = recv_data.send_status_list.begin(); + it != recv_data.send_status_list.end(); + ++it, ++i) + { + formatter % i % it->status % it->send_end_size + % it->send_rest_size % it->send_possible_size + % it->send_offset % it->unsend_size % it->edit_division; + datadump += formatter.str(); + } + + formatter.parse("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_realserver_recv() : send status list dump : send status list size = %d.%s"); + + formatter % recv_data.send_status_list.size() % datadump; + putLogDebug(100173, formatter.str(), __FILE__, __LINE__ ); } + /*------DEBUG LOG END------*/ - //recalc fields value according to send_rest_size and request rest size - if (new_send_it->send_rest_size > request_data_remain_size) + //search for send_possible item in status list + send_status_it it_find = find_if(recv_data.send_status_list.begin(), recv_data.send_status_list.end(), + data_send_possible()); + //the data that can be sent possible is exist + if (it_find != recv_data.send_status_list.end()) { - new_send_it->send_possible_size = request_data_remain_size; - new_send_it->send_rest_size -= request_data_remain_size; - new_send_it->send_end_size = 0; - new_send_it->send_end_size = 0; - request_data_remain_size = 0; + status = CLIENT_CONNECTION_CHECK; } + //the data that can be sent possible is not exist else { - new_send_it->send_possible_size = new_send_it->send_rest_size; - request_data_remain_size -= new_send_it->send_rest_size; - new_send_it->send_end_size = 0; - new_send_it->send_rest_size = 0; + status = REALSERVER_RECV; } - - //change status from SEND_NG to SEND_OK - new_send_it->status = SEND_OK; } - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + catch (int e) { - std::string datadump; - boost::format formatter("\nitem[%d] : status = %d, send_end_size = %d, " - "send_rest_size = %d, send_possible_size = %d, " - "send_offset = %d, unsend_size = %d, edit_division = %d."); - int i = 0; - for (it = recv_data.send_status_list.begin(); - it != recv_data.send_status_list.end(); - ++it, ++i) + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - formatter % i % it->status % it->send_end_size - % it->send_rest_size % it->send_possible_size - % it->send_offset % it->unsend_size % it->edit_division; - datadump += formatter.str(); + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_realserver_recv() : catch exception e = %d. thread id : %d."); + formatter % e % boost::this_thread::get_id(); + putLogDebug(100174, formatter.str(), __FILE__, __LINE__ ); } - - formatter.parse("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_realserver_recv() : send status list dump : send status list size = %d.%s"); - - formatter % recv_data.send_status_list.size() % datadump; - putLogDebug(10171, formatter.str(), __FILE__, __LINE__ ); + /*------DEBUG LOG END------*/ + status = FINALIZE; } - /*------DEBUG LOG END------*/ - - //search for send_possible item in status list - send_status_it it_find = find_if(recv_data.send_status_list.begin(), recv_data.send_status_list.end(), - data_send_possible()); - //the data that can be sent possible is exist - if (it_find != recv_data.send_status_list.end()) + catch (const std::string& ex) { - status = CLIENT_CONNECTION_CHECK; + std::cerr << "protocol_module_sessionless::handle_realserver_recv() : exception : " << ex << std::endl; + boost::format formatter("protocol_module_sessionless::handle_realserver_recv() : exception : %s. thread id : %d."); + formatter % ex.c_str() % boost::this_thread::get_id(); + putLogError(100086, formatter.str(), __FILE__, __LINE__ ); + status = FINALIZE; } - //the data that can be sent possible is not exist - else + catch (const std::bad_alloc&) { - status = REALSERVER_RECV; + std::cerr << "protocol_module_sessionless::handle_realserver_recv() : exception : Could not allocate memory." << std::endl; + boost::format formatter("Could not allocate memory. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100087, formatter.str(), __FILE__, __LINE__ ); + status = FINALIZE; } - } - catch (int e) - { - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + catch (const std::exception& ex) { + std::cerr << "protocol_module_sessionless::handle_realserver_recv() : exception : error = " << ex.what() << "." << std::endl; boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_realserver_recv() : catch exception e = %d. thread id : %d."); - formatter % e % boost::this_thread::get_id(); - putLogDebug(10172, formatter.str(), __FILE__, __LINE__ ); + "handle_realserver_recv() : exception : error = %s. thread id : %d."); + formatter % ex.what() % boost::this_thread::get_id(); + putLogError(100088, formatter.str(), __FILE__, __LINE__ ); + + status = FINALIZE; + } + catch (...) + { + std::cerr << "protocol_module_sessionless::handle_realserver_recv() : Unknown exception." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG " + "protocol_module_sessionless::handle_realserver_recv() : " + "Unknown exception. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100089, formatter.str(), __FILE__, __LINE__ ); + status = FINALIZE; } - /*------DEBUG LOG END------*/ - status = FINALIZE; - } - catch (const std::string& ex) - { - std::cerr << "protocol_module_sessionless::handle_realserver_recv() : exception : " << ex << std::endl; - boost::format formatter("protocol_module_sessionless::handle_realserver_recv() : exception : %s. thread id : %d."); - formatter % ex.c_str() % boost::this_thread::get_id(); - putLogError(17082, formatter.str(), __FILE__, __LINE__ ); - status = FINALIZE; - } - catch (const std::bad_alloc&) - { - std::cerr << "protocol_module_sessionless::handle_realserver_recv() : exception : Could not allocate memory." << std::endl; - boost::format formatter("Could not allocate memory. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogError(17083, formatter.str(), __FILE__, __LINE__ ); - status = FINALIZE; - } - catch (const std::exception& ex) - { - std::cerr << "protocol_module_sessionless::handle_realserver_recv() : exception : error = " << ex.what() << "." << std::endl; - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_realserver_recv() : exception : error = %s. thread id : %d."); - formatter % ex.what() % boost::this_thread::get_id(); - putLogError(17084, formatter.str(), __FILE__, __LINE__ ); - status = FINALIZE; - } - catch (...) - { - std::cerr << "protocol_module_sessionless::handle_realserver_recv() : Unknown exception." << std::endl; - boost::format formatter("function : protocol_module_base::EVENT_TAG " - "protocol_module_sessionless::handle_realserver_recv() : " - "Unknown exception. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogError(17085, formatter.str(), __FILE__, __LINE__ ); - status = FINALIZE; - } + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_realserver_recv(const boost::thread::id thread_id, " + "const boost::asio::ip::tcp::endpoint& rs_endpoint, " + "const boost::array& recvbuffer, " + "const size_t recvlen) : return_value = %d. thread id : %d."); + formatter % status % boost::this_thread::get_id(); + putLogDebug(100175, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_realserver_recv(const boost::thread::id thread_id, " - "const boost::asio::ip::tcp::endpoint& rs_endpoint, " - "const boost::array& recvbuffer, " - "const size_t recvlen) : return_value = %d. thread id : %d."); - formatter % status % boost::this_thread::get_id(); - putLogDebug(10173, formatter.str(), __FILE__, __LINE__ ); + return status; } - /*------DEBUG LOG END------*/ - - return status; -} -//! called from after sorryserver recive -//! @param[in] downstream thread id -//! @param[in] sorryserver endpoint reference -//! @param[in] recive from realserver buffer reference. -//! @param[in] recv data length -//! @return session use EVENT mode -protocol_module_base::EVENT_TAG protocol_module_sessionless::handle_sorryserver_recv( - const boost::thread::id thread_id, const boost::asio::ip::tcp::endpoint& sorry_endpoint, const boost::array< - char, MAX_BUFFER_SIZE>& recvbuffer, const size_t recvlen) -{ - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - size_t buffer_size = recvbuffer.size() < recvlen ? recvbuffer.size() : recvlen; - std::string buffer(recvbuffer.data(), buffer_size); - boost::format formatter("in_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorryserver_recv(const boost::thread::id thread_id, " - "const boost::asio::ip::tcp::endpoint& sorry_endpoint, " - "const boost::array& recvbuffer, " - "const size_t recvlen) : thread_id = %d, sorry_endpoint = [%s]:%d, recvbuffer = %s, recvlen = %d."); - formatter % thread_id % sorry_endpoint.address().to_string() % sorry_endpoint.port() - % buffer % recvlen; - putLogDebug(10174, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - - EVENT_TAG status = FINALIZE; - size_t data_remain_start = 0; - size_t data_remain_size = 0; - size_t request_data_remain_size = 0; - size_t header_offset = 0; - size_t header_offset_len = 0; - size_t content_length_header_offset = 0; - size_t content_length_header_len = 0; - size_t content_len_value = 0; - size_t pos = 0; - size_t buffer_size = 0; - const size_t cr_lf_len = strlen("\r\n\r\n"); - std::string str_value; - const std::string http_header = ""; - const std::string content_header = "Content-Length"; - thread_data_ptr session_data; - char* buffer1 = NULL; - char* buffer2 = NULL; - bool bret = false; - CHECK_RESULT_TAG check_result; - session_thread_data_map_it session_thread_it; - recive_data_map_it recive_data_it; - - //parameter check - if (recvlen > recvbuffer.size()) + //! called from after sorryserver recive + //! @param[in] downstream thread id + //! @param[in] sorryserver endpoint reference + //! @param[in] recive from realserver buffer reference. + //! @param[in] recv data length + //! @return session use EVENT mode + protocol_module_base::EVENT_TAG protocol_module_sessionless::handle_sorryserver_recv( + const boost::thread::id thread_id, const boost::asio::ip::tcp::endpoint& sorry_endpoint, const boost::array< + char, MAX_BUFFER_SIZE>& recvbuffer, const size_t recvlen) { - std::cerr << "protocol_module_sessionless::handle_sorryserver_recv() : Data size bigger than buffer size." << std::endl; - boost::format formatter("Data size bigger than buffer size. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogError(17086, formatter.str(), __FILE__, - __LINE__ ); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + size_t buffer_size = recvbuffer.size() < recvlen ? recvbuffer.size() : recvlen; + std::string buffer; + dump_memory(recvbuffer.data(), buffer_size, buffer); + boost::format formatter("in_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" "handle_sorryserver_recv(const boost::thread::id thread_id, " "const boost::asio::ip::tcp::endpoint& sorry_endpoint, " "const boost::array& recvbuffer, " - "const size_t recvlen) : return_value = %d. thread id : %d."); - formatter % FINALIZE % boost::this_thread::get_id(); - putLogDebug(10175, formatter.str(), __FILE__, __LINE__ ); + "const size_t recvlen) : thread_id = %d, sorry_endpoint = [%s]:%d, recvbuffer = %s, recvlen = %d."); + formatter % thread_id % sorry_endpoint.address().to_string() % sorry_endpoint.port() + % buffer % recvlen; + putLogDebug(100176, formatter.str(), __FILE__, __LINE__ ); } /*------DEBUG LOG END------*/ - return FINALIZE; - } - - try - { - { - boost::mutex::scoped_lock slock(session_thread_data_map_mutex); - session_thread_it = session_thread_data_map.find(thread_id); - if (session_thread_it == session_thread_data_map.end() || session_thread_it->second == NULL) + EVENT_TAG status = FINALIZE; + size_t data_remain_start = 0; + size_t data_remain_size = 0; + size_t request_data_remain_size = 0; + size_t header_offset = 0; + size_t header_offset_len = 0; + size_t content_length_header_offset = 0; + size_t content_length_header_len = 0; + size_t content_len_value = 0; + size_t pos = 0; + size_t buffer_size = 0; + const size_t cr_lf_len = strlen("\r\n\r\n"); + std::string str_value; + const std::string http_header = ""; + const std::string content_header = "Content-Length"; + thread_data_ptr session_data; + char* buffer1 = NULL; + char* buffer2 = NULL; + bool bret = false; + CHECK_RESULT_TAG check_result; + session_thread_data_map_it session_thread_it; + recive_data_map_it recive_data_it; + + //parameter check + if (recvlen > recvbuffer.size()) + { + std::cerr << "protocol_module_sessionless::handle_sorryserver_recv() : Data size bigger than buffer size." << std::endl; + boost::format formatter("Data size bigger than buffer size. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100090, formatter.str(), __FILE__, + __LINE__ ); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - boost::format formatter("Invalid thread id. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogError(17087, formatter.str(), __FILE__, __LINE__ ); - throw -1; + boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorryserver_recv(const boost::thread::id thread_id, " + "const boost::asio::ip::tcp::endpoint& sorry_endpoint, " + "const boost::array& recvbuffer, " + "const size_t recvlen) : return_value = %d. thread id : %d."); + formatter % FINALIZE % boost::this_thread::get_id(); + putLogDebug(100177, formatter.str(), __FILE__, __LINE__ ); } - - session_data = session_thread_it->second; + /*------DEBUG LOG END------*/ + return FINALIZE; } - recive_data_it = session_data->recive_data_map.find(sorry_endpoint); - if (recive_data_it == session_data->recive_data_map.end()) + try { - recive_data recv_data; - session_data->recive_data_map[sorry_endpoint] = recv_data; - session_data->target_endpoint = sorry_endpoint; - } - - recive_data& recv_data = session_data->recive_data_map[sorry_endpoint]; + { + boost::mutex::scoped_lock slock(session_thread_data_map_mutex ); - //status list check - send_status_it it = recv_data.send_status_list.begin(); - send_status_it it_end = recv_data.send_status_list.end(); - it = std::find_if(it, it_end, data_send_ok()); - if (it != it_end) - { - boost::format formatter("Sending data is invalid. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogError(17088, formatter.str(), __FILE__, __LINE__ ); - throw -1; - } + session_thread_it = session_thread_data_map.find(thread_id); + if (unlikely(session_thread_it == session_thread_data_map.end() || session_thread_it->second == NULL)) + { + boost::format formatter("Invalid thread id. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100091, formatter.str(), __FILE__, __LINE__ ); + throw -1; + } - //status list check - it = recv_data.send_status_list.begin(); - it = std::adjacent_find(it, it_end, data_send_repeated()); - if (it != it_end) - { - boost::format formatter("Sending data is invalid. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogError(17089, formatter.str(), __FILE__, __LINE__ ); - throw -1; - } + session_data = session_thread_it->second; + } - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - std::string datadump; - boost::format formatter("\nitem[%d] : status = %d, send_end_size = %d, " - "send_rest_size = %d, send_possible_size = %d, " - "send_offset = %d, unsend_size = %d, edit_division = %d."); - int i = 0; - for (it = recv_data.send_status_list.begin(); - it != recv_data.send_status_list.end(); - ++it, ++i) + recive_data_it = session_data->recive_data_map.find(sorry_endpoint); + if (unlikely(recive_data_it == session_data->recive_data_map.end())) { - formatter % i % it->status % it->send_end_size - % it->send_rest_size % it->send_possible_size - % it->send_offset % it->unsend_size % it->edit_division; - datadump += formatter.str(); + recive_data recv_data; + session_data->recive_data_map[sorry_endpoint] = recv_data; } - formatter.parse("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorryserver_recv() : send status list dump : send status list size = %d.%s"); + session_data->target_endpoint = sorry_endpoint; - formatter % recv_data.send_status_list.size() % datadump; - putLogDebug(10176, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ + recive_data& recv_data = session_data->recive_data_map[sorry_endpoint]; - it = recv_data.send_status_list.begin(); - //get original status info - while (it != it_end) - { - //item status is SEND_END - if (it->status == SEND_END) - { - //erase from list - recv_data.send_status_list.erase(it++); - continue; - } - //item status is SEND_CONTINUE - else if (it->status == SEND_CONTINUE) - { - it->send_offset += it->send_end_size; - data_remain_start = it->send_offset; - break; - } - //item status is SEND_NG - else + //status list check + send_status_it it = recv_data.send_status_list.begin(); + send_status_it it_end = recv_data.send_status_list.end(); + it = std::find_if(it, it_end, data_send_ok()); + if (unlikely(it != it_end)) { - data_remain_start = it->send_offset; - data_remain_size = it->unsend_size; - break; + boost::format formatter("Sending data is invalid. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100092, formatter.str(), __FILE__, __LINE__ ); + throw -1; } - ++it; - } - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - std::string datadump; - boost::format formatter("\nitem[%d] : status = %d, send_end_size = %d, " - "send_rest_size = %d, send_possible_size = %d, " - "send_offset = %d, unsend_size = %d, edit_division = %d."); - int i = 0; - for (it = recv_data.send_status_list.begin(); - it != recv_data.send_status_list.end(); - ++it, ++i) + //status list check + it = recv_data.send_status_list.begin(); + it = std::adjacent_find(it, it_end, data_send_repeated()); + if (unlikely(it != it_end)) { - formatter % i % it->status % it->send_end_size - % it->send_rest_size % it->send_possible_size - % it->send_offset % it->unsend_size % it->edit_division; - datadump += formatter.str(); + boost::format formatter("Sending data is invalid. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100093, formatter.str(), __FILE__, __LINE__ ); + throw -1; } - formatter.parse("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorryserver_recv() : send status list dump : send status list size = %d.%s"); - - formatter % recv_data.send_status_list.size() % datadump; - putLogDebug(10177, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - //recive buffer process - //buffer rest size < request size - if (recv_data.recive_buffer_rest_size < recvlen) - { - //buffer max size < remain size + request size - //buffer is need reallocate - if (recv_data.recive_buffer_max_size < data_remain_size + recvlen) + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - //recive_buffer1's memory allocate and initialization - buffer_size = (data_remain_size + recvlen) > MAX_BUFFER_SIZE ? (data_remain_size + recvlen) : MAX_BUFFER_SIZE; - buffer1 = new char[buffer_size]; - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - boost::format formatter("new : address = &(%d), size = %lu."); - formatter % static_cast(buffer1) % buffer_size; - putLogDebug(10178, formatter.str(), __FILE__, __LINE__ ); - } - /*-------- DEBUG LOG --------*/ - memset(buffer1, 0, buffer_size); - //recive_buffer2's memory allocate and initialization - buffer2 = new char[buffer_size]; - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + std::string datadump; + boost::format formatter("\nitem[%d] : status = %d, send_end_size = %d, " + "send_rest_size = %d, send_possible_size = %d, " + "send_offset = %d, unsend_size = %d, edit_division = %d."); + int i = 0; + for (it = recv_data.send_status_list.begin(); + it != recv_data.send_status_list.end(); + ++it, ++i) { - boost::format formatter("new : address = &(%d), size = %lu."); - formatter % static_cast(buffer2) % buffer_size; - putLogDebug(10179, formatter.str(), __FILE__, __LINE__ ); + formatter % i % it->status % it->send_end_size + % it->send_rest_size % it->send_possible_size + % it->send_offset % it->unsend_size % it->edit_division; + datadump += formatter.str(); } - /*-------- DEBUG LOG END--------*/ - memset(buffer2, 0, buffer_size); - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + formatter.parse("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorryserver_recv() : send status list dump : send status list size = %d.%s"); + + formatter % recv_data.send_status_list.size() % datadump; + putLogDebug(100178, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + it = recv_data.send_status_list.begin(); + //get original status info + while (it != it_end) + { + //item status is SEND_END + if (it->status == SEND_END) { - std::string datadump; - dump_memory(recv_data.recive_buffer + data_remain_start, data_remain_size, datadump); - boost::format formatter( - "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorryserver_recv() : before memcpy (data dump) : " - "data begin = %d, data_size = %d, data = %s"); - formatter % data_remain_start % data_remain_size % datadump; - putLogDebug(10180, formatter.str(), __FILE__, __LINE__ ); + //erase from list + recv_data.send_status_list.erase(it++); + continue; } - /*------DEBUG LOG END------*/ - //copy data from old buffer to new buffer - memcpy(buffer1, recv_data.recive_buffer + data_remain_start, data_remain_size); - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + //item status is SEND_CONTINUE + else if (it->status == SEND_CONTINUE) { - std::string datadump; - dump_memory(buffer1, data_remain_size, datadump); - boost::format formatter( - "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorryserver_recv() : after memcpy (data dump) : " - "data begin = 0, data_size = %d, data = %s"); - formatter % data_remain_size % datadump; - putLogDebug(10181, formatter.str(), __FILE__, __LINE__ ); + it->send_offset += it->send_end_size; + data_remain_start = it->send_offset; + break; } - /*------DEBUG LOG END------*/ - - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + //item status is SEND_NG + else { - std::string datadump; - dump_memory(recvbuffer.data(), recvlen, datadump); - boost::format formatter( - "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorryserver_recv() : before memcpy (data dump) : " - "data begin = 0, data_size = %d, data = %s"); - formatter % recvlen % datadump; - putLogDebug(10182, formatter.str(), __FILE__, __LINE__ ); + data_remain_start = it->send_offset; + data_remain_size = it->unsend_size; + break; } - /*------DEBUG LOG END------*/ - memcpy(buffer1 + data_remain_size, recvbuffer.data(), recvlen); - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + + ++it; + } + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + boost::format formatter("\nitem[%d] : status = %d, send_end_size = %d, " + "send_rest_size = %d, send_possible_size = %d, " + "send_offset = %d, unsend_size = %d, edit_division = %d."); + int i = 0; + for (it = recv_data.send_status_list.begin(); + it != recv_data.send_status_list.end(); + ++it, ++i) { - std::string datadump; - dump_memory(buffer1 + data_remain_size, recvlen, datadump); - boost::format formatter( - "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorryserver_recv() : after memcpy (data dump) : " - "data begin = %d, data_size = %d, data = %s"); - formatter % data_remain_size % recvlen % datadump; - putLogDebug(10183, formatter.str(), __FILE__, __LINE__ ); + formatter % i % it->status % it->send_end_size + % it->send_rest_size % it->send_possible_size + % it->send_offset % it->unsend_size % it->edit_division; + datadump += formatter.str(); } - /*------DEBUG LOG END------*/ - //free old buffer1 and old buffer2 - if (recv_data.recive_buffer1 != NULL) + + formatter.parse("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorryserver_recv() : send status list dump : send status list size = %d.%s"); + + formatter % recv_data.send_status_list.size() % datadump; + putLogDebug(100179, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + //recive buffer process + //buffer rest size < request size + if (recv_data.recive_buffer_rest_size < recvlen) + { + //buffer max size < remain size + request size + //buffer is need reallocate + if (recv_data.recive_buffer_max_size < data_remain_size + recvlen) { + //the buffer's size that will be allocated is exceed the upper limit value + if (MAX_SESSIONLESS_MODULE_BUFFER_SIZE < data_remain_size + recvlen) + { + std::cerr << "protocol_module_sessionless::handle_sorryserver_recv() : the buffer's size that will be allacted is exceed the upper limit value." << std::endl; + boost::format formatter("The buffer's size that will be allocated is exceed the upper limit value. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100094, formatter.str(), __FILE__, __LINE__ ); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorryserver_recv(const boost::thread::id thread_id, " + "const boost::asio::ip::tcp::endpoint& sorry_endpoint, " + "const boost::array& recvbuffer, " + "const size_t recvlen) : return_value = %d. thread id : %d."); + formatter % FINALIZE % boost::this_thread::get_id(); + putLogDebug(100180, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + return FINALIZE; + } + //recive_buffer1's memory allocate and initialization + buffer_size = (data_remain_size + recvlen) > MAX_BUFFER_SIZE ? (data_remain_size + recvlen) : MAX_BUFFER_SIZE; + buffer1 = new char[buffer_size]; /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - boost::format formatter("delete : address = &(%d)."); - formatter % static_cast(recv_data.recive_buffer1); - putLogDebug(10184, formatter.str(), __FILE__, - __LINE__ ); + boost::format formatter("new : address = &(%d), size = %lu."); + formatter % static_cast(buffer1) % buffer_size; + putLogDebug(100181, formatter.str(), __FILE__, __LINE__ ); } - /*------DEBUG LOG END------*/ - delete[] recv_data.recive_buffer1; - recv_data.recive_buffer1 = NULL; - } - - if (recv_data.recive_buffer2 != NULL) - { + /*-------- DEBUG LOG END--------*/ + memset(buffer1, 0, buffer_size); + //recive_buffer2's memory allocate and initialization + buffer2 = new char[buffer_size]; /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - boost::format formatter("delete : address = &(%d)."); - formatter % static_cast(recv_data.recive_buffer2); - putLogDebug(10185, formatter.str(), __FILE__, - __LINE__ ); + boost::format formatter("new : address = &(%d), size = %lu."); + formatter % static_cast(buffer2) % buffer_size; + putLogDebug(100182, formatter.str(), __FILE__, __LINE__ ); } - /*------DEBUG LOG END------*/ - delete[] recv_data.recive_buffer2; - recv_data.recive_buffer2 = NULL; - } + /*-------- DEBUG LOG END--------*/ + memset(buffer2, 0, buffer_size); - //set new buffer pointer - recv_data.recive_buffer1 = buffer1; - recv_data.recive_buffer2 = buffer2; - recv_data.recive_buffer = recv_data.recive_buffer1; - //set new buffer's max size - recv_data.recive_buffer_max_size = buffer_size; - } - //buffer's max size >= remain data size + requst size - //buffer isn't need reallocate, but switch - else - { - //pointer valid check - if (recv_data.recive_buffer1 == NULL || recv_data.recive_buffer2 == NULL) - { - boost::format formatter("Invalid pointer. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogError(17090, formatter.str(), __FILE__, __LINE__ ); - throw -1; - } - //using buffer is buffer1 - if (recv_data.recive_buffer == recv_data.recive_buffer1) - { - //buffer2 initialization - memset(recv_data.recive_buffer2, 0, recv_data.recive_buffer_max_size); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { std::string datadump; dump_memory(recv_data.recive_buffer + data_remain_start, data_remain_size, datadump); @@ -5551,26 +5569,27 @@ protocol_module_base::EVENT_TAG protocol_module_sessionless::handle_sorryserver_ "handle_sorryserver_recv() : before memcpy (data dump) : " "data begin = %d, data_size = %d, data = %s"); formatter % data_remain_start % data_remain_size % datadump; - putLogDebug(10186, formatter.str(), __FILE__, __LINE__ ); + putLogDebug(100183, formatter.str(), __FILE__, __LINE__ ); } /*------DEBUG LOG END------*/ - //copy data from buffer1 to buffer2 - memcpy(recv_data.recive_buffer2, recv_data.recive_buffer + data_remain_start, data_remain_size); + //copy data from old buffer to new buffer + memcpy(buffer1, recv_data.recive_buffer + data_remain_start, data_remain_size); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { std::string datadump; - dump_memory(recv_data.recive_buffer2, data_remain_size, datadump); + dump_memory(buffer1, data_remain_size, datadump); boost::format formatter( "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" "handle_sorryserver_recv() : after memcpy (data dump) : " "data begin = 0, data_size = %d, data = %s"); formatter % data_remain_size % datadump; - putLogDebug(10187, formatter.str(), __FILE__, __LINE__ ); + putLogDebug(100184, formatter.str(), __FILE__, __LINE__ ); } /*------DEBUG LOG END------*/ + /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { std::string datadump; dump_memory(recvbuffer.data(), recvlen, datadump); @@ -5579,261 +5598,576 @@ protocol_module_base::EVENT_TAG protocol_module_sessionless::handle_sorryserver_ "handle_sorryserver_recv() : before memcpy (data dump) : " "data begin = 0, data_size = %d, data = %s"); formatter % recvlen % datadump; - putLogDebug(10188, formatter.str(), __FILE__, __LINE__ ); + putLogDebug(100185, formatter.str(), __FILE__, __LINE__ ); } /*------DEBUG LOG END------*/ - memcpy(recv_data.recive_buffer2 + data_remain_size, recvbuffer.data(), recvlen); + memcpy(buffer1 + data_remain_size, recvbuffer.data(), recvlen); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { std::string datadump; - dump_memory(recv_data.recive_buffer2 + data_remain_size, recvlen, datadump); + dump_memory(buffer1 + data_remain_size, recvlen, datadump); boost::format formatter( "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" "handle_sorryserver_recv() : after memcpy (data dump) : " "data begin = %d, data_size = %d, data = %s"); formatter % data_remain_size % recvlen % datadump; - putLogDebug(10189, formatter.str(), __FILE__, __LINE__ ); + putLogDebug(100186, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + //free old buffer1 and old buffer2 + if (recv_data.recive_buffer1 != NULL) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("delete : address = &(%d)."); + formatter % static_cast(recv_data.recive_buffer1); + putLogDebug(100187, formatter.str(), __FILE__, + __LINE__ ); + } + /*------DEBUG LOG END------*/ + delete[] recv_data.recive_buffer1; + recv_data.recive_buffer1 = NULL; + } + + if (recv_data.recive_buffer2 != NULL) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("delete : address = &(%d)."); + formatter % static_cast(recv_data.recive_buffer2); + putLogDebug(100188, formatter.str(), __FILE__, + __LINE__ ); + } + /*------DEBUG LOG END------*/ + delete[] recv_data.recive_buffer2; + recv_data.recive_buffer2 = NULL; + } + + //set new buffer pointer + recv_data.recive_buffer1 = buffer1; + recv_data.recive_buffer2 = buffer2; + recv_data.recive_buffer = recv_data.recive_buffer1; + //set new buffer's max size + recv_data.recive_buffer_max_size = buffer_size; + } + //buffer's max size >= remain data size + requst size + //buffer isn't need reallocate, but switch + else + { + //pointer valid check + if (unlikely(recv_data.recive_buffer1 == NULL || recv_data.recive_buffer2 == NULL)) + { + boost::format formatter("Invalid pointer. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100095, formatter.str(), __FILE__, __LINE__ ); + throw -1; + } + //using buffer is buffer1 + if (recv_data.recive_buffer == recv_data.recive_buffer1) + { + //buffer2 initialization + memset(recv_data.recive_buffer2, 0, recv_data.recive_buffer_max_size); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + dump_memory(recv_data.recive_buffer + data_remain_start, data_remain_size, datadump); + boost::format formatter( + "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorryserver_recv() : before memcpy (data dump) : " + "data begin = %d, data_size = %d, data = %s"); + formatter % data_remain_start % data_remain_size % datadump; + putLogDebug(100189, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + //copy data from buffer1 to buffer2 + memcpy(recv_data.recive_buffer2, recv_data.recive_buffer + data_remain_start, data_remain_size); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + dump_memory(recv_data.recive_buffer2, data_remain_size, datadump); + boost::format formatter( + "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorryserver_recv() : after memcpy (data dump) : " + "data begin = 0, data_size = %d, data = %s"); + formatter % data_remain_size % datadump; + putLogDebug(100190, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + dump_memory(recvbuffer.data(), recvlen, datadump); + boost::format formatter( + "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorryserver_recv() : before memcpy (data dump) : " + "data begin = 0, data_size = %d, data = %s"); + formatter % recvlen % datadump; + putLogDebug(100191, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + memcpy(recv_data.recive_buffer2 + data_remain_size, recvbuffer.data(), recvlen); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + dump_memory(recv_data.recive_buffer2 + data_remain_size, recvlen, datadump); + boost::format formatter( + "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorryserver_recv() : after memcpy (data dump) : " + "data begin = %d, data_size = %d, data = %s"); + formatter % data_remain_size % recvlen % datadump; + putLogDebug(100192, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + //set buffer2 as using buffer + recv_data.recive_buffer = recv_data.recive_buffer2; + } + //using buffer is buffer2 + else + { + //buffer1 initializtion + memset(recv_data.recive_buffer1, 0, recv_data.recive_buffer_max_size); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + dump_memory(recv_data.recive_buffer + data_remain_start, data_remain_size, datadump); + boost::format formatter( + "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorryserver_recv() : before memcpy (data dump) : " + "data begin = %d, data_size = %d, data = %s"); + formatter % data_remain_start % data_remain_size % datadump; + putLogDebug(100193, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + //copy data from buffer2 to buffer1 + memcpy(recv_data.recive_buffer1, recv_data.recive_buffer + data_remain_start, data_remain_size); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + dump_memory(recv_data.recive_buffer1, data_remain_size, datadump); + boost::format formatter( + "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorryserver_recv() : after memcpy (data dump) : " + "data begin = 0, data_size = %d, data = %s"); + formatter % data_remain_size % datadump; + putLogDebug(100194, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + dump_memory(recvbuffer.data(), recvlen, datadump); + boost::format formatter( + "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorryserver_recv() : before memcpy (data dump) : " + "data begin = 0, data_size = %d, data = %s"); + formatter % recvlen % datadump; + putLogDebug(100195, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + memcpy(recv_data.recive_buffer1 + data_remain_size, recvbuffer.data(), recvlen); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + dump_memory(recv_data.recive_buffer1 + data_remain_size, recvlen, datadump); + boost::format formatter( + "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorryserver_recv() : after memcpy (data dump) : " + "data begin = %d, data_size = %d, data = %s"); + formatter % data_remain_size % recvlen % datadump; + putLogDebug(100196, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + //set buffer1 as using buffer + recv_data.recive_buffer = recv_data.recive_buffer1; + } + } + + //set buffer's rest size + recv_data.recive_buffer_rest_size = recv_data.recive_buffer_max_size - data_remain_size - recvlen; + + //remain_size recalc + data_remain_size += recvlen; + + send_status_it it_begin = recv_data.send_status_list.begin(); + send_status_it it_end = recv_data.send_status_list.end(); + //offset recalc + for (; it_begin != it_end; ++it_begin) + { + it_begin->send_offset -= data_remain_start; + } + } + //buffer's rest size >= request size + //copy directly + else + { + //pointer valid check + if (unlikely(recv_data.recive_buffer == NULL)) + { + boost::format formatter("Invalid pointer. thread id : %d"); + formatter % boost::this_thread::get_id(); + putLogError(100096, formatter.str(), __FILE__, __LINE__ ); + throw -1; + } + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + dump_memory(recvbuffer.data(), recvlen, datadump); + boost::format formatter( + "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorryserver_recv() : before memcpy (data dump) : " + "data begin = 0, data_size = %d, data = %s"); + formatter % recvlen % datadump; + putLogDebug(100197, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + + //copy data from parameter to using buffer + memcpy(recv_data.recive_buffer + recv_data.recive_buffer_max_size - recv_data.recive_buffer_rest_size, + recvbuffer.data(), recvlen); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + dump_memory(recv_data.recive_buffer + recv_data.recive_buffer_max_size - recv_data.recive_buffer_rest_size, recvlen, datadump); + boost::format formatter( + "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorryserver_recv() : after memcpy (data dump) : " + "data begin = %d, data_size = %d, data = %s"); + formatter % (recv_data.recive_buffer_max_size - recv_data.recive_buffer_rest_size) % recvlen % datadump; + putLogDebug(100198, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + //buffer's rest size recalc + recv_data.recive_buffer_rest_size -= recvlen; + //remain data size recalc + data_remain_size += recvlen; + } + + it = recv_data.send_status_list.begin(); + it_end = recv_data.send_status_list.end(); + //request rest size initialization + request_data_remain_size = recvlen; + //original status process + for (; it != it_end; ++it) + { + //status is SEND_CONTINUE + if (it->status == SEND_CONTINUE) + { + // + if (it->send_rest_size > request_data_remain_size) + { + it->send_possible_size = request_data_remain_size; + it->send_rest_size -= request_data_remain_size; + it->send_end_size = 0; + request_data_remain_size = 0; + } + else + { + it->send_possible_size = it->send_rest_size; + request_data_remain_size -= it->send_rest_size; + it->send_end_size = 0; + it->send_rest_size = 0; } - /*------DEBUG LOG END------*/ - //set buffer2 as using buffer - recv_data.recive_buffer = recv_data.recive_buffer2; + + //change status from SEND_CONTINUE to SEND_OK + it->status = SEND_OK; } - //using buffer is buffer2 - else + //status is SEND_NG + else if (it->status == SEND_NG) { - //buffer1 initializtion - memset(recv_data.recive_buffer1, 0, recv_data.recive_buffer_max_size); + //check http method + check_result = check_status_code(recv_data.recive_buffer + it->send_offset, data_remain_size); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - std::string datadump; - dump_memory(recv_data.recive_buffer + data_remain_start, data_remain_size, datadump); - boost::format formatter( - "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorryserver_recv() : before memcpy (data dump) : " - "data begin = %d, data_size = %d, data = %s"); - formatter % data_remain_start % data_remain_size % datadump; - putLogDebug(10190, formatter.str(), __FILE__, __LINE__ ); + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorryserver_recv() : call check_status_code : " + "return_value = %d. thread id : %d."); + formatter % check_result % boost::this_thread::get_id(); + putLogDebug(100199, formatter.str(), __FILE__, __LINE__ ); } /*------DEBUG LOG END------*/ - //copy data from buffer2 to buffer1 - memcpy(recv_data.recive_buffer1, recv_data.recive_buffer + data_remain_start, data_remain_size); - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + //check http method result is OK + if (check_result == CHECK_OK) { - std::string datadump; - dump_memory(recv_data.recive_buffer1, data_remain_size, datadump); - boost::format formatter( - "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorryserver_recv() : after memcpy (data dump) : " - "data begin = 0, data_size = %d, data = %s"); - formatter % data_remain_size % datadump; - putLogDebug(10191, formatter.str(), __FILE__, __LINE__ ); + //check http version + check_result = check_http_version(recv_data.recive_buffer + it->send_offset, data_remain_size); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorryserver_recv() : call check_http_version : " + "return_value = %d. thread id : %d."); + formatter % check_result % boost::this_thread::get_id(); + putLogDebug(100200, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ } - /*------DEBUG LOG END------*/ + //check method and version result is OK + if (check_result == CHECK_OK) + { + //search http header + bret = find_http_header(recv_data.recive_buffer + it->send_offset, data_remain_size, http_header, + header_offset, header_offset_len); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorryserver_recv() : call find_http_header : " + "return_value = %d. thread id : %d."); + formatter % static_cast(bret) % boost::this_thread::get_id(); + putLogDebug(100201, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + //search http header result is OK + if (bret) + { + //search Content_Length header + bret = find_http_header(recv_data.recive_buffer + it->send_offset, data_remain_size, + content_header, content_length_header_offset, content_length_header_len); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorryserver_recv() : call find_http_header : " + "return_value = %d. thread id : %d."); + formatter % static_cast(bret) %boost::this_thread::get_id(); + putLogDebug(100202, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + //search Content_Length result is OK + if (bret) + { + //Get Content_Length header's numeric value + for (pos = 0; recv_data.recive_buffer[it->send_offset + content_length_header_offset + pos] != ':' && pos + < content_length_header_len; ++pos) + ; + if (pos == content_length_header_len) + { + throw std::string("Content_Length field's value is invalid."); + } - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + ++pos; + + str_value.assign(recv_data.recive_buffer + it->send_offset + content_length_header_offset + pos, + content_length_header_len - pos); + + size_t pos_end = str_value.find_last_of('\r'); + if (pos_end != std::string::npos) + { + str_value = str_value.erase(pos_end); + } + + for (pos = 0; !isgraph(str_value[pos]) && str_value[pos] != '\0'; ++pos) + ; + + str_value = str_value.substr(pos); + + try + { + content_len_value = boost::lexical_cast(str_value.c_str()); + } + catch (const boost::bad_lexical_cast& ex) + { + throw std::string("Content_Length field's value is invalid."); + } + //send_rest_size recalc + //set whole http header's length + Content_Length's value + it->send_rest_size = header_offset + header_offset_len + cr_lf_len + content_len_value; + } + //search Content_Length result is NG + else + { + //send_rest_size recalc + //set whole http header's length + it->send_rest_size = header_offset + header_offset_len + cr_lf_len; + } + } + //search http header result is NG + else + { + it->unsend_size += request_data_remain_size; + request_data_remain_size = 0; + break; + } + } + //check method or version result is NG + else if (check_result == CHECK_NG) { - std::string datadump; - dump_memory(recvbuffer.data(), recvlen, datadump); - boost::format formatter( - "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorryserver_recv() : before memcpy (data dump) : " - "data begin = 0, data_size = %d, data = %s"); - formatter % recvlen % datadump; - putLogDebug(10192, formatter.str(), __FILE__, __LINE__ ); + it->send_rest_size = it->unsend_size+request_data_remain_size; } - /*------DEBUG LOG END------*/ - memcpy(recv_data.recive_buffer1 + data_remain_size, recvbuffer.data(), recvlen); - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + //check method and version result is CHECK_INPOSSIBLE + else { - std::string datadump; - dump_memory(recv_data.recive_buffer1 + data_remain_size, recvlen, datadump); - boost::format formatter( - "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorryserver_recv() : after memcpy (data dump) : " - "data begin = %d, data_size = %d, data = %s"); - formatter % data_remain_size % recvlen % datadump; - putLogDebug(10193, formatter.str(), __FILE__, __LINE__ ); + it->unsend_size += request_data_remain_size; + request_data_remain_size = 0; + break; } - /*------DEBUG LOG END------*/ - //set buffer1 as using buffer - recv_data.recive_buffer = recv_data.recive_buffer1; - } - } - //set buffer's rest size - recv_data.recive_buffer_rest_size = recv_data.recive_buffer_max_size - data_remain_size - recvlen; - - //remain_size recalc - data_remain_size += recvlen; + //recalc fields value according to send_rest_size and request rest size + if (it->send_rest_size > it->unsend_size + request_data_remain_size) + { + it->send_possible_size = it->unsend_size + request_data_remain_size; + it->send_rest_size -= (it->unsend_size + request_data_remain_size); + it->send_end_size = 0; + it->unsend_size = 0; + request_data_remain_size = 0; + } + else + { + it->send_possible_size = it->send_rest_size; + request_data_remain_size = it->unsend_size + request_data_remain_size - it->send_rest_size; + it->send_end_size = 0; + it->unsend_size = 0; + it->send_rest_size = 0; + } - send_status_it it_begin = recv_data.send_status_list.begin(); - send_status_it it_end = recv_data.send_status_list.end(); - //offset recalc - for (; it_begin != it_end; ++it_begin) - { - it_begin->send_offset -= data_remain_start; - } - } - //buffer's rest size >= request size - //copy directly - else - { - //pointer valid check - if (recv_data.recive_buffer == NULL) - { - boost::format formatter("Invalid pointer. thread id : %d"); - formatter % boost::this_thread::get_id(); - putLogError(17091, formatter.str(), __FILE__, __LINE__ ); - throw -1; + //change status from SEND_NG to SEND_OK + it->status = SEND_OK; + } + //no request rest data to process + if (request_data_remain_size <= 0) + { + break; + } } /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { std::string datadump; - dump_memory(recvbuffer.data(), recvlen, datadump); - boost::format formatter( - "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorryserver_recv() : before memcpy (data dump) : " - "data begin = 0, data_size = %d, data = %s"); - formatter % recvlen % datadump; - putLogDebug(10194, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ + boost::format formatter("\nitem[%d] : status = %d, send_end_size = %d, " + "send_rest_size = %d, send_possible_size = %d, " + "send_offset = %d, unsend_size = %d, edit_division = %d."); + int i = 0; + for (it = recv_data.send_status_list.begin(); + it != recv_data.send_status_list.end(); + ++it, ++i) + { + formatter % i % it->status % it->send_end_size + % it->send_rest_size % it->send_possible_size + % it->send_offset % it->unsend_size % it->edit_division; + datadump += formatter.str(); + } - //copy data from parameter to using buffer - memcpy(recv_data.recive_buffer + recv_data.recive_buffer_max_size - recv_data.recive_buffer_rest_size, - recvbuffer.data(), recvlen); - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - std::string datadump; - dump_memory(recv_data.recive_buffer + recv_data.recive_buffer_max_size - recv_data.recive_buffer_rest_size, recvlen, datadump); - boost::format formatter( - "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorryserver_recv() : after memcpy (data dump) : " - "data begin = %d, data_size = %d, data = %s"); - formatter % (recv_data.recive_buffer_max_size - recv_data.recive_buffer_rest_size) % recvlen % datadump; - putLogDebug(10195, formatter.str(), __FILE__, __LINE__ ); + formatter.parse("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorryserver_recv() : send status list dump : send status list size = %d.%s"); + + formatter % recv_data.send_status_list.size() % datadump; + putLogDebug(100203, formatter.str(), __FILE__, __LINE__ ); } /*------DEBUG LOG END------*/ - //buffer's rest size recalc - recv_data.recive_buffer_rest_size -= recvlen; - //remain data size recalc - data_remain_size += recvlen; - } - it = recv_data.send_status_list.begin(); - it_end = recv_data.send_status_list.end(); - //request rest size initialization - request_data_remain_size = recvlen; - //original status process - for (; it != it_end; ++it) - { - //status is SEND_CONTINUE - if (it->status == SEND_CONTINUE) + //there are still rest data need to process + //new status created and add to status list + while (request_data_remain_size > 0) { - // - if (it->send_rest_size > request_data_remain_size) - { - it->send_possible_size = request_data_remain_size; - it->send_rest_size -= request_data_remain_size; - it->send_end_size = 0; - request_data_remain_size = 0; - } - else - { - it->send_possible_size = it->send_rest_size; - request_data_remain_size -= it->send_rest_size; - it->send_end_size = 0; - it->send_rest_size = 0; - } + //new status created + send_status new_send_state; + new_send_state.edit_division = EDIT_DIVISION_NO_EDIT; + new_send_state.send_end_size = 0; + new_send_state.send_offset = 0; + new_send_state.send_possible_size = 0; + new_send_state.unsend_size = 0; + new_send_state.send_rest_size = 0; + //status initialize to SEND_NG + new_send_state.status = SEND_NG; + //add new status to status_list + recv_data.send_status_list.push_back(new_send_state); + std::list::reverse_iterator new_send_it = recv_data.send_status_list.rbegin(); + //cacl offset + new_send_it->send_offset = recv_data.recive_buffer_max_size - recv_data.recive_buffer_rest_size + - request_data_remain_size; - //change status from SEND_CONTINUE to SEND_OK - it->status = SEND_OK; - } - //status is SEND_NG - else if (it->status == SEND_NG) - { //check http method - check_result = check_status_code(recv_data.recive_buffer + it->send_offset, data_remain_size); + check_result = check_status_code(recv_data.recive_buffer + new_send_it->send_offset, + request_data_remain_size); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" "handle_sorryserver_recv() : call check_status_code : " "return_value = %d. thread id : %d."); formatter % check_result % boost::this_thread::get_id(); - putLogDebug(10196, formatter.str(), __FILE__, __LINE__ ); + putLogDebug(100204, formatter.str(), __FILE__, __LINE__ ); } /*------DEBUG LOG END------*/ //check http method result is OK if (check_result == CHECK_OK) { //check http version - check_result = check_http_version(recv_data.recive_buffer + it->send_offset, data_remain_size); + check_result = check_http_version(recv_data.recive_buffer + new_send_it->send_offset, + request_data_remain_size); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" "handle_sorryserver_recv() : call check_http_version : " "return_value = %d. thread id : %d."); formatter % check_result % boost::this_thread::get_id(); - putLogDebug(10197, formatter.str(), __FILE__, __LINE__ ); + putLogDebug(100205, formatter.str(), __FILE__, __LINE__ ); } /*------DEBUG LOG END------*/ } - //check method and version result is OK + //check http method and version result is OK if (check_result == CHECK_OK) { - //search http header - bret = find_http_header(recv_data.recive_buffer + it->send_offset, data_remain_size, http_header, - header_offset, header_offset_len); + //search whole http header, get whole http header's offset and length + bret = find_http_header(recv_data.recive_buffer + new_send_it->send_offset, request_data_remain_size, + http_header, header_offset, header_offset_len); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" "handle_sorryserver_recv() : call find_http_header : " "return_value = %d. thread id : %d."); formatter % static_cast(bret) % boost::this_thread::get_id(); - putLogDebug(10198, formatter.str(), __FILE__, __LINE__ ); + putLogDebug(100206, formatter.str(), __FILE__, __LINE__ ); } /*------DEBUG LOG END------*/ - //search http header result is OK + //searched whole http header if (bret) { - //search Content_Length header - bret = find_http_header(recv_data.recive_buffer + it->send_offset, data_remain_size, - content_header, content_length_header_offset, content_length_header_len); + //search ContentLength http header, get ContentLength header's offset and length + bret = find_http_header(recv_data.recive_buffer + new_send_it->send_offset, + request_data_remain_size, content_header, content_length_header_offset, content_length_header_len); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" "handle_sorryserver_recv() : call find_http_header : " "return_value = %d. thread id : %d."); - formatter % static_cast(bret) %boost::this_thread::get_id(); - putLogDebug(10199, formatter.str(), __FILE__, __LINE__ ); + formatter % static_cast(bret) % boost::this_thread::get_id(); + putLogDebug(100207, formatter.str(), __FILE__, __LINE__ ); } /*------DEBUG LOG END------*/ - //search Content_Length result is OK + + //searched ContentLength http header if (bret) { //Get Content_Length header's numeric value - for (pos = 0; recv_data.recive_buffer[it->send_offset + content_length_header_offset + pos] != ':' && pos - < content_length_header_len; ++pos) + for (pos = 0; recv_data.recive_buffer[new_send_it->send_offset + content_length_header_offset + pos] != ':' + && pos < content_length_header_len; ++pos) ; if (pos == content_length_header_len) { throw std::string("Content_Length field's value is invalid."); } - ++pos; - str_value.assign(recv_data.recive_buffer + it->send_offset + content_length_header_offset + pos, + str_value.assign(recv_data.recive_buffer + new_send_it->send_offset + content_length_header_offset + pos, content_length_header_len - pos); size_t pos_end = str_value.find_last_of('\r'); @@ -5846,7 +6180,6 @@ protocol_module_base::EVENT_TAG protocol_module_sessionless::handle_sorryserver_ ; str_value = str_value.substr(pos); - try { content_len_value = boost::lexical_cast(str_value.c_str()); @@ -5856,1300 +6189,1129 @@ protocol_module_base::EVENT_TAG protocol_module_sessionless::handle_sorryserver_ throw std::string("Content_Length field's value is invalid."); } //send_rest_size recalc - //set whole http header's length + Content_Length's value - it->send_rest_size = header_offset + header_offset_len + cr_lf_len + content_len_value; + //set whole http header's + whole http header's length + Content_Length's value + new_send_it->send_rest_size = header_offset + header_offset_len + cr_lf_len + content_len_value; } - //search Content_Length result is NG + //not searched ContentLength http header else { //send_rest_size recalc - //set whole http header's length - it->send_rest_size = header_offset + header_offset_len + cr_lf_len; + //set whole http header's + whole http header's length + new_send_it->send_rest_size = header_offset + header_offset_len + cr_lf_len; } } - //search http header result is NG + //not searched whole http header else { - it->unsend_size += request_data_remain_size; + new_send_it->unsend_size = request_data_remain_size; request_data_remain_size = 0; break; } } - //check method or version result is NG + //check http method or version result is NG else if (check_result == CHECK_NG) { - it->send_rest_size = it->unsend_size+request_data_remain_size; + new_send_it->send_rest_size = request_data_remain_size; } - //check method and version result is CHECK_INPOSSIBLE + //check http method or version result is impossible else { - it->unsend_size += request_data_remain_size; + new_send_it->unsend_size = request_data_remain_size; request_data_remain_size = 0; break; } //recalc fields value according to send_rest_size and request rest size - if (it->send_rest_size > it->unsend_size + request_data_remain_size) + if (new_send_it->send_rest_size > request_data_remain_size) { - it->send_possible_size = it->unsend_size + request_data_remain_size; - it->send_rest_size -= (it->unsend_size + request_data_remain_size); - it->send_end_size = 0; - it->unsend_size = 0; + new_send_it->send_possible_size = request_data_remain_size; + new_send_it->send_rest_size -= request_data_remain_size; + new_send_it->send_end_size = 0; request_data_remain_size = 0; } else { - it->send_possible_size = it->send_rest_size; - request_data_remain_size = it->unsend_size + request_data_remain_size - it->send_rest_size; - it->send_end_size = 0; - it->unsend_size = 0; - it->send_rest_size = 0; + new_send_it->send_possible_size = new_send_it->send_rest_size; + request_data_remain_size -= new_send_it->send_rest_size; + new_send_it->send_end_size = 0; + new_send_it->send_rest_size = 0; } //change status from SEND_NG to SEND_OK - it->status = SEND_OK; - } - //no request rest data to process - if (request_data_remain_size <= 0) - { - break; - } - } - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - std::string datadump; - boost::format formatter("\nitem[%d] : status = %d, send_end_size = %d, " - "send_rest_size = %d, send_possible_size = %d, " - "send_offset = %d, unsend_size = %d, edit_division = %d."); - int i = 0; - for (it = recv_data.send_status_list.begin(); - it != recv_data.send_status_list.end(); - ++it, ++i) - { - formatter % i % it->status % it->send_end_size - % it->send_rest_size % it->send_possible_size - % it->send_offset % it->unsend_size % it->edit_division; - datadump += formatter.str(); + new_send_it->status = SEND_OK; } - - formatter.parse("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorryserver_recv() : send status list dump : send status list size = %d.%s"); - - formatter % recv_data.send_status_list.size() % datadump; - putLogDebug(10200, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - - //there are still rest data need to process - //new status created and add to status list - while (request_data_remain_size > 0) - { - //new status created - send_status new_send_state; - new_send_state.edit_division = EDIT_DIVISION_NO_EDIT; - new_send_state.send_end_size = 0; - new_send_state.send_offset = 0; - new_send_state.send_possible_size = 0; - new_send_state.unsend_size = 0; - new_send_state.send_rest_size = 0; - //status initialize to SEND_NG - new_send_state.status = SEND_NG; - //add new status to status_list - recv_data.send_status_list.push_back(new_send_state); - std::list::reverse_iterator new_send_it = recv_data.send_status_list.rbegin(); - //cacl offset - new_send_it->send_offset = recv_data.recive_buffer_max_size - recv_data.recive_buffer_rest_size - - request_data_remain_size; - - //check http method - check_result = check_status_code(recv_data.recive_buffer + new_send_it->send_offset, - request_data_remain_size); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorryserver_recv() : call check_status_code : " - "return_value = %d. thread id : %d."); - formatter % check_result % boost::this_thread::get_id(); - putLogDebug(10201, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - //check http method result is OK - if (check_result == CHECK_OK) - { - //check http version - check_result = check_http_version(recv_data.recive_buffer + new_send_it->send_offset, - request_data_remain_size); - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorryserver_recv() : call check_http_version : " - "return_value = %d. thread id : %d."); - formatter % check_result % boost::this_thread::get_id(); - putLogDebug(10202, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - } - //check http method and version result is OK - if (check_result == CHECK_OK) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - //search whole http header, get whole http header's offset and length - bret = find_http_header(recv_data.recive_buffer + new_send_it->send_offset, request_data_remain_size, - http_header, header_offset, header_offset_len); - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + std::string datadump; + boost::format formatter("\nitem[%d] : status = %d, send_end_size = %d, " + "send_rest_size = %d, send_possible_size = %d, " + "send_offset = %d, unsend_size = %d, edit_division = %d."); + int i = 0; + for (it = recv_data.send_status_list.begin(); + it != recv_data.send_status_list.end(); + ++it, ++i) { - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorryserver_recv() : call find_http_header : " - "return_value = %d. thread id : %d."); - formatter % static_cast(bret) % boost::this_thread::get_id(); - putLogDebug(10203, formatter.str(), __FILE__, __LINE__ ); + formatter % i % it->status % it->send_end_size + % it->send_rest_size % it->send_possible_size + % it->send_offset % it->unsend_size % it->edit_division; + datadump += formatter.str(); } - /*------DEBUG LOG END------*/ - //searched whole http header - if (bret) - { - //search ContentLength http header, get ContentLength header's offset and length - bret = find_http_header(recv_data.recive_buffer + new_send_it->send_offset, - request_data_remain_size, content_header, content_length_header_offset, content_length_header_len); - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorryserver_recv() : call find_http_header : " - "return_value = %d. thread id : %d."); - formatter % static_cast(bret) % boost::this_thread::get_id(); - putLogDebug(10204, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - - //searched ContentLength http header - if (bret) - { - //Get Content_Length header's numeric value - for (pos = 0; recv_data.recive_buffer[new_send_it->send_offset + content_length_header_offset + pos] != ':' - && pos < content_length_header_len; ++pos) - ; - if (pos == content_length_header_len) - { - throw std::string("Content_Length field's value is invalid."); - } - ++pos; - - str_value.assign(recv_data.recive_buffer + new_send_it->send_offset + content_length_header_offset + pos, - content_length_header_len - pos); - - size_t pos_end = str_value.find_last_of('\r'); - if (pos_end != std::string::npos) - { - str_value = str_value.erase(pos_end); - } - for (pos = 0; !isgraph(str_value[pos]) && str_value[pos] != '\0'; ++pos) - ; + formatter.parse("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorryserver_recv() : send status list dump : send status list size = %d.%s"); - str_value = str_value.substr(pos); - try - { - content_len_value = boost::lexical_cast(str_value.c_str()); - } - catch (const boost::bad_lexical_cast& ex) - { - throw std::string("Content_Length field's value is invalid."); - } - //send_rest_size recalc - //set whole http header's + whole http header's length + Content_Length's value - new_send_it->send_rest_size = header_offset + header_offset_len + cr_lf_len + content_len_value; - } - //not searched ContentLength http header - else - { - //send_rest_size recalc - //set whole http header's + whole http header's length - new_send_it->send_rest_size = header_offset + header_offset_len + cr_lf_len; - } - } - //not searched whole http header - else - { - new_send_it->unsend_size = request_data_remain_size; - request_data_remain_size = 0; - break; - } - } - //check http method or version result is NG - else if (check_result == CHECK_NG) - { - new_send_it->send_rest_size = request_data_remain_size; - } - //check http method or version result is impossible - else - { - new_send_it->unsend_size = request_data_remain_size; - request_data_remain_size = 0; - break; + formatter % recv_data.send_status_list.size() % datadump; + putLogDebug(100208, formatter.str(), __FILE__, __LINE__ ); } + /*------DEBUG LOG END------*/ - //recalc fields value according to send_rest_size and request rest size - if (new_send_it->send_rest_size > request_data_remain_size) + //search for send_possible item in status list + send_status_it it_find = find_if(recv_data.send_status_list.begin(), recv_data.send_status_list.end(), + data_send_possible()); + //the data that can be sent possible is exist + if (it_find != recv_data.send_status_list.end()) { - new_send_it->send_possible_size = request_data_remain_size; - new_send_it->send_rest_size -= request_data_remain_size; - new_send_it->send_end_size = 0; - request_data_remain_size = 0; + status = CLIENT_CONNECTION_CHECK; } + //the data that can be sent possible is not exist else { - new_send_it->send_possible_size = new_send_it->send_rest_size; - request_data_remain_size -= new_send_it->send_rest_size; - new_send_it->send_end_size = 0; - new_send_it->send_rest_size = 0; + status = SORRYSERVER_RECV; } - - //change status from SEND_NG to SEND_OK - new_send_it->status = SEND_OK; } - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + catch (int e) { - std::string datadump; - boost::format formatter("\nitem[%d] : status = %d, send_end_size = %d, " - "send_rest_size = %d, send_possible_size = %d, " - "send_offset = %d, unsend_size = %d, edit_division = %d."); - int i = 0; - for (it = recv_data.send_status_list.begin(); - it != recv_data.send_status_list.end(); - ++it, ++i) + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - formatter % i % it->status % it->send_end_size - % it->send_rest_size % it->send_possible_size - % it->send_offset % it->unsend_size % it->edit_division; - datadump += formatter.str(); + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorryserver_recv() : catch exception e = %d. thread id : %d."); + formatter % e % boost::this_thread::get_id(); + putLogDebug(100209, formatter.str(), __FILE__, __LINE__ ); } - - formatter.parse("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorryserver_recv() : send status list dump : send status list size = %d.%s"); - - formatter % recv_data.send_status_list.size() % datadump; - putLogDebug(10205, formatter.str(), __FILE__, __LINE__ ); + /*------DEBUG LOG END------*/ + status = FINALIZE; } - /*------DEBUG LOG END------*/ - - //search for send_possible item in status list - send_status_it it_find = find_if(recv_data.send_status_list.begin(), recv_data.send_status_list.end(), - data_send_possible()); - //the data that can be sent possible is exist - if (it_find != recv_data.send_status_list.end()) + catch (const std::string& ex) { - status = CLIENT_CONNECTION_CHECK; + std::cerr << "protocol_module_sessionless::handle_sorryserver_recv() : exception : " << ex << std::endl; + boost::format formatter("protocol_module_sessionless::handle_sorryserver_recv() : exception : %s. thread id : %d."); + formatter % ex.c_str() % boost::this_thread::get_id(); + putLogError(100097, formatter.str(), __FILE__, __LINE__ ); + status = FINALIZE; } - //the data that can be sent possible is not exist - else + catch (const std::bad_alloc&) { - status = SORRYSERVER_RECV; + std::cerr << "protocol_module_sessionless::handle_sorryserver_recv() : exception : Could not allocate memory." << std::endl; + boost::format formatter("Could not allocate memory. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100098, formatter.str(), __FILE__, __LINE__ ); + status = FINALIZE; } - } - catch (int e) - { - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + catch (const std::exception& ex) { + std::cerr << "protocol_module_sessionless::handle_sorryserver_recv() : exception : error = " << ex.what() << "." << std::endl; boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorryserver_recv() : catch exception e = %d. thread id : %d."); - formatter % e % boost::this_thread::get_id(); - putLogDebug(10206, formatter.str(), __FILE__, __LINE__ ); + "handle_sorryserver_recv() : exception : error = %s. thread id : %d."); + formatter % ex.what() % boost::this_thread::get_id(); + putLogError(100099, formatter.str(), __FILE__, __LINE__ ); + + status = FINALIZE; + } + catch (...) + { + std::cerr << "protocol_module_sessionless::handle_sorryserver_recv() : Unknown exception." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG " + "protocol_module_sessionless::handle_sorryserver_recv() : " + "Unknown exception. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100100, formatter.str(), __FILE__, __LINE__ ); + status = FINALIZE; + } + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorryserver_recv(const boost::thread::id thread_id, " + "const boost::asio::ip::tcp::endpoint& sorry_endpoint, " + "const boost::array& recvbuffer, " + "const size_t recvlen) : return_value = %d. thread id : %d."); + formatter % status % boost::this_thread::get_id(); + putLogDebug(100210, formatter.str(), __FILE__, __LINE__ ); } /*------DEBUG LOG END------*/ - status = FINALIZE; - } - catch (const std::string& ex) - { - std::cerr << "protocol_module_sessionless::handle_sorryserver_recv() : exception : " << ex << std::endl; - boost::format formatter("protocol_module_sessionless::handle_sorryserver_recv() : exception : %s. thread id : %d."); - formatter % ex.c_str() % boost::this_thread::get_id(); - putLogError(17092, formatter.str(), __FILE__, __LINE__ ); - status = FINALIZE; - } - catch (const std::bad_alloc&) - { - std::cerr << "protocol_module_sessionless::handle_sorryserver_recv() : exception : Could not allocate memory." << std::endl; - boost::format formatter("Could not allocate memory. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogError(17093, formatter.str(), __FILE__, __LINE__ ); - status = FINALIZE; - } - catch (const std::exception& ex) - { - std::cerr << "protocol_module_sessionless::handle_sorryserver_recv() : exception : error = " << ex.what() << "." << std::endl; - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorryserver_recv() : exception : error = %s. thread id : %d."); - formatter % ex.what() % boost::this_thread::get_id(); - putLogError(17094, formatter.str(), __FILE__, __LINE__ ); - status = FINALIZE; - } - catch (...) - { - std::cerr << "protocol_module_sessionless::handle_sorryserver_recv() : Unknown exception." << std::endl; - boost::format formatter("function : protocol_module_base::EVENT_TAG " - "protocol_module_sessionless::handle_sorryserver_recv() : " - "Unknown exception. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogError(17095, formatter.str(), __FILE__, __LINE__ ); - status = FINALIZE; + return status; } - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + //! called from UPSTEEARM thread. make module original message. + //! @param[in] downstream thread id. + //! @return session use EVENT mode + protocol_module_base::EVENT_TAG protocol_module_sessionless::handle_response_send_inform( + const boost::thread::id thread_id) { - boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorryserver_recv(const boost::thread::id thread_id, " - "const boost::asio::ip::tcp::endpoint& sorry_endpoint, " - "const boost::array& recvbuffer, " - "const size_t recvlen) : return_value = %d. thread id : %d."); - formatter % status % boost::this_thread::get_id(); - putLogDebug(10207, formatter.str(), __FILE__, __LINE__ ); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("in/out_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_response_send_inform(const boost::thread::id thread_id) : " + "return_value = %d. thread id : %d."); + formatter % STOP % boost::this_thread::get_id(); + putLogDebug(100211, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + return STOP; } - /*------DEBUG LOG END------*/ - - return status; -} -//! called from UPSTEEARM thread. make module original message. -//! @param[in] downstream thread id. -//! @return session use EVENT mode -protocol_module_base::EVENT_TAG protocol_module_sessionless::handle_response_send_inform( - const boost::thread::id thread_id) -{ - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + //! called from after client connection check. use TCP/IP only. create client send message. + //! @param[in] downstream thread id + //! @param[out] send budffer reference + //! @param[out] send data length + //! @return session use EVENT mode + protocol_module_base::EVENT_TAG protocol_module_sessionless::handle_client_connection_check( + const boost::thread::id thread_id, boost::array& sendbuffer, size_t& datalen) { - boost::format formatter("in/out_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_response_send_inform(const boost::thread::id thread_id) : " - "return_value = %d. thread id : %d."); - formatter % STOP % boost::this_thread::get_id(); - putLogDebug(10208, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - return STOP; -} -//! called from after client connection check. use TCP/IP only. create client send message. -//! @param[in] downstream thread id -//! @param[out] send budffer reference -//! @param[out] send data length -//! @return session use EVENT mode -protocol_module_base::EVENT_TAG protocol_module_sessionless::handle_client_connection_check( - const boost::thread::id thread_id, boost::array& sendbuffer, size_t& datalen) -{ - - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - boost::format formatter("in_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_client_connection_check(const boost::thread::id thread_id, " - "boost::array& sendbuffer, size_t& datalen) : " - "thread_id = %d."); - formatter % thread_id; - putLogDebug(10209, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("in_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_client_connection_check(const boost::thread::id thread_id, " + "boost::array& sendbuffer, size_t& datalen) : " + "thread_id = %d."); + formatter % thread_id; + putLogDebug(100212, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ - EVENT_TAG status = FINALIZE; - size_t send_buffer_size = sendbuffer.max_size(); - thread_data_ptr session_data; - session_thread_data_map_it session_thread_it; - recive_data_map_it recive_data_it; + EVENT_TAG status = FINALIZE; + size_t send_buffer_size = sendbuffer.max_size(); + thread_data_ptr session_data; + session_thread_data_map_it session_thread_it; + recive_data_map_it recive_data_it; - try - { + try { - boost::mutex::scoped_lock sclock(session_thread_data_map_mutex); + { + boost::mutex::scoped_lock sclock(session_thread_data_map_mutex); - session_thread_it = session_thread_data_map.find(thread_id); - if (session_thread_it == session_thread_data_map.end() || session_thread_it->second == NULL) + session_thread_it = session_thread_data_map.find(thread_id); + if (unlikely(session_thread_it == session_thread_data_map.end() || session_thread_it->second == NULL)) + { + boost::format formatter("Invalid thread id. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100101, formatter.str(), __FILE__, __LINE__ ); + throw -1; + } + + session_data = session_thread_it->second; + } + + recive_data_it = session_data->recive_data_map.find(session_data->target_endpoint); + if (unlikely(recive_data_it == session_data->recive_data_map.end())) { - boost::format formatter("Invalid thread id. thread id : %d."); + boost::format formatter("Invalid endpoint. thread id : %d."); formatter % boost::this_thread::get_id(); - putLogError(17096, formatter.str(), __FILE__, __LINE__ ); + putLogError(100102, formatter.str(), __FILE__, __LINE__ ); throw -1; } - session_data = session_thread_it->second; - } - - recive_data_it = session_data->recive_data_map.find(session_data->target_endpoint); - if (recive_data_it == session_data->recive_data_map.end()) - { - boost::format formatter("Invalid endpoint. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogError(17097, formatter.str(), __FILE__, __LINE__ ); - throw -1; - } - - recive_data& recv_data = recive_data_it->second; + recive_data& recv_data = recive_data_it->second; - //get the data that can be sent possible - send_status_it it = find_if(recv_data.send_status_list.begin(), recv_data.send_status_list.end(), - data_send_possible()); - if (it == recv_data.send_status_list.end()) - { - boost::format formatter("Sending possible data is not existed. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogError(17098, formatter.str(), __FILE__, __LINE__ ); - throw -1; - } + //get the data that can be sent possible + send_status_it it = find_if(recv_data.send_status_list.begin(), recv_data.send_status_list.end(), + data_send_possible()); + if (unlikely(it == recv_data.send_status_list.end())) + { + boost::format formatter("Sending possible data is not existed. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100103, formatter.str(), __FILE__, __LINE__ ); + throw -1; + } - //buffer size >= sending_possible size - if (send_buffer_size > it->send_possible_size) - { - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + //buffer size >= sending_possible size + if (send_buffer_size > it->send_possible_size) { - std::string datadump; - dump_memory(recv_data.recive_buffer + it->send_offset, it->send_possible_size, datadump); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + dump_memory(recv_data.recive_buffer + it->send_offset, it->send_possible_size, datadump); + + boost::format formatter( + "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_client_connection_check() : before memcpy (data dump) : " + "data begin = %d, data_size = %d, data = %s"); + formatter % it->send_offset % (it->send_possible_size) % datadump; + putLogDebug(100213, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + //copy data from recive_buffer to sendbuffer by sending_possible size + memcpy(sendbuffer.data(), recv_data.recive_buffer + it->send_offset, it->send_possible_size); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + dump_memory(sendbuffer.data(), it->send_possible_size, datadump); - boost::format formatter( - "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_client_connection_check() : before memcpy (data dump) : " - "data begin = %d, data_size = %d, data = %s"); - formatter % it->send_offset % (it->send_possible_size) % datadump; - putLogDebug(10210, formatter.str(), __FILE__, __LINE__ ); + boost::format formatter( + "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_client_connection_check() : after memcpy (data dump) : " + "data begin = 0, data_size = %d, data = %s"); + formatter % (it->send_possible_size) % datadump; + putLogDebug(100214, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + //send_end_size recalc + it->send_end_size = it->send_possible_size; + //set copyed data length + datalen = it->send_possible_size; + //sending_possible size recalc + it->send_possible_size = 0; } - /*------DEBUG LOG END------*/ - //copy data from recive_buffer to sendbuffer by sending_possible size - memcpy(sendbuffer.data(), recv_data.recive_buffer + it->send_offset, it->send_possible_size); - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + //buffer size < sending_possible size + else { - std::string datadump; - dump_memory(sendbuffer.data(), it->send_possible_size, datadump); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + dump_memory(recv_data.recive_buffer + it->send_offset, send_buffer_size, datadump); + + boost::format formatter( + "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_client_connection_check() : before memcpy (data dump) : " + "data begin = %d, data_size = %d, data = %s"); + formatter % it->send_offset % send_buffer_size % datadump; + putLogDebug(100215, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + //copy data from recive_buffer to sendbuffer by buffer size + memcpy(sendbuffer.data(), recv_data.recive_buffer + it->send_offset, send_buffer_size); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + std::string datadump; + dump_memory(sendbuffer.data(), send_buffer_size, datadump); - boost::format formatter( - "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_client_connection_check() : after memcpy (data dump) : " - "data begin = 0, data_size = %d, data = %s"); - formatter % (it->send_possible_size) % datadump; - putLogDebug(10211, formatter.str(), __FILE__, __LINE__ ); + boost::format formatter( + "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_client_connection_check() : after memcpy (data dump) : " + "data begin = 0, data_size = %d, data = %s"); + formatter % send_buffer_size % datadump; + putLogDebug(100216, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + //send_end_size recalc + it->send_end_size = send_buffer_size; + //sending_possible size recalc + it->send_possible_size -= send_buffer_size; + //set copyed data length + datalen = send_buffer_size; } - /*------DEBUG LOG END------*/ - //send_end_size recalc - it->send_end_size = it->send_possible_size; - //set copyed data length - datalen = it->send_possible_size; - //sending_possible size recalc - it->send_possible_size = 0; + + status = CLIENT_SEND; } - //buffer size < sending_possible size - else + catch (int e) { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - std::string datadump; - dump_memory(recv_data.recive_buffer + it->send_offset, send_buffer_size, datadump); - - boost::format formatter( - "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_client_connection_check() : before memcpy (data dump) : " - "data begin = %d, data_size = %d, data = %s"); - formatter % it->send_offset % send_buffer_size % datadump; - putLogDebug(10212, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - //copy data from recive_buffer to sendbuffer by buffer size - memcpy(sendbuffer.data(), recv_data.recive_buffer + it->send_offset, send_buffer_size); - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - std::string datadump; - dump_memory(sendbuffer.data(), send_buffer_size, datadump); - - boost::format formatter( - "function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_client_connection_check() : after memcpy (data dump) : " - "data begin = 0, data_size = %d, data = %s"); - formatter % send_buffer_size % datadump; - putLogDebug(10213, formatter.str(), __FILE__, __LINE__ ); + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_client_connection_check() : catch exception e = %d. thread id : %d."); + formatter % e % boost::this_thread::get_id(); + putLogDebug(100217, formatter.str(), __FILE__, __LINE__ ); } /*------DEBUG LOG END------*/ - //send_end_size recalc - it->send_end_size = send_buffer_size; - //sending_possible size recalc - it->send_possible_size -= send_buffer_size; - //set copyed data length - datalen = send_buffer_size; + status = FINALIZE; } - - status = CLIENT_SEND; - } - catch (int e) - { + catch (const std::exception& ex) + { + std::cerr << "protocol_module_sessionless::handle_client_connection_check() : exception : error = " << ex.what() << "." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_client_connection_check() : exception : error = %s. thread id : %d."); + formatter % ex.what() % boost::this_thread::get_id(); + putLogError(100104, formatter.str(), __FILE__, __LINE__ ); + status = FINALIZE; + } + catch (...) + { + std::cerr << "protocol_module_sessionless::handle_client_connection_check() : Unknown exception." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_client_connection_check() : Unknown exception. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100105, formatter.str(), __FILE__, __LINE__ ); + status = FINALIZE; + } + /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_client_connection_check() : catch exception e = %d. thread id : %d."); - formatter % e % boost::this_thread::get_id(); - putLogDebug(10214, formatter.str(), __FILE__, __LINE__ ); + boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_client_connection_check(const boost::thread::id thread_id, " + "boost::array& sendbuffer, size_t& datalen)" + " : return_value = %d. thread id : %d."); + formatter % status % boost::this_thread::get_id(); + putLogDebug(100218, formatter.str(), __FILE__, __LINE__ ); } /*------DEBUG LOG END------*/ - status = FINALIZE; - } - catch (const std::exception& ex) - { - std::cerr << "protocol_module_sessionless::handle_client_connection_check() : exception : error = " << ex.what() << "." << std::endl; - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_client_connection_check() : exception : error = %s. thread id : %d."); - formatter % ex.what() % boost::this_thread::get_id(); - putLogError(17099, formatter.str(), __FILE__, __LINE__ ); - status = FINALIZE; - } - catch (...) - { - std::cerr << "protocol_module_sessionless::handle_client_connection_check() : Unknown exception." << std::endl; - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_client_connection_check() : Unknown exception. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogError(17100, formatter.str(), __FILE__, __LINE__ ); - status = FINALIZE; + return status; } - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + //! called from after client select. use UDP only + //! @param[in] downstream thread id + //! @param[in] client udp endpoint + //! @param[out] send buffer reference + //! @param[out] send data length + //! @return session use EVENT mode + protocol_module_base::EVENT_TAG protocol_module_sessionless::handle_client_select( + const boost::thread::id thread_id, boost::asio::ip::udp::endpoint& cl_endpoint, boost::array& sendbuffer, size_t& datalen) { - boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_client_connection_check(const boost::thread::id thread_id, " - "boost::array& sendbuffer, size_t& datalen)" - " : return_value = %d. thread id : %d."); - formatter % status % boost::this_thread::get_id(); - putLogDebug(10215, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - return status; -} - -//! called from after client select. use UDP only -//! @param[in] downstream thread id -//! @param[in] client udp endpoint -//! @param[out] send buffer reference -//! @param[out] send data length -//! @return session use EVENT mode -protocol_module_base::EVENT_TAG protocol_module_sessionless::handle_client_select( - const boost::thread::id thread_id, boost::asio::ip::udp::endpoint& cl_endpoint, boost::array& sendbuffer, size_t& datalen) -{ - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - boost::format formatter("in/out_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_client_select(const boost::thread::id thread_id, " - "boost::asio::ip::udp::endpoint& cl_endpoint, " - "boost::array& sendbuffer, " - "size_t& datalen) : " - "return_value = %d. thread id : %d."); - formatter % STOP % boost::this_thread::get_id(); - putLogDebug(10216, formatter.str(), __FILE__, __LINE__ ); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("in/out_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_client_select(const boost::thread::id thread_id, " + "boost::asio::ip::udp::endpoint& cl_endpoint, " + "boost::array& sendbuffer, " + "size_t& datalen) : " + "return_value = %d. thread id : %d."); + formatter % STOP % boost::this_thread::get_id(); + putLogDebug(100219, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + return STOP; } - /*------DEBUG LOG END------*/ - return STOP; -} -//! called from after client send -//! @param[in] downstream thread id -//! @return session use EVENT mode -protocol_module_base::EVENT_TAG protocol_module_sessionless::handle_client_send( - const boost::thread::id thread_id) -{ - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + //! called from after client send + //! @param[in] downstream thread id + //! @return session use EVENT mode + protocol_module_base::EVENT_TAG protocol_module_sessionless::handle_client_send( + const boost::thread::id thread_id) { - boost::format formatter("in_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_client_send(const boost::thread::id thread_id) : " - "thread_id = %d."); - formatter % thread_id; - putLogDebug(10217, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - EVENT_TAG status = FINALIZE; - thread_data_ptr session_data; - session_thread_data_map_it session_thread_it; - recive_data_map_it recive_data_it; + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("in_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_client_send(const boost::thread::id thread_id) : " + "thread_id = %d."); + formatter % thread_id; + putLogDebug(100220, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + EVENT_TAG status = FINALIZE; + thread_data_ptr session_data; + session_thread_data_map_it session_thread_it; + recive_data_map_it recive_data_it; - try - { + try { - boost::mutex::scoped_lock sclock(session_thread_data_map_mutex); - //thread_id check - session_thread_it = session_thread_data_map.find(thread_id); - if (session_thread_it == session_thread_data_map.end() || session_thread_it->second == NULL) { - boost::format formatter("Invalid thread id. thread id : %d."); + boost::mutex::scoped_lock sclock(session_thread_data_map_mutex); + //thread_id check + session_thread_it = session_thread_data_map.find(thread_id); + if (unlikely(session_thread_it == session_thread_data_map.end() || session_thread_it->second == NULL)) + { + boost::format formatter("Invalid thread id. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100106, formatter.str(), __FILE__, __LINE__ ); + throw -1; + } + session_data = session_thread_it->second; + } + //endpoint check + recive_data_it = session_data->recive_data_map.find(session_data->target_endpoint); + if (unlikely(recive_data_it == session_data->recive_data_map.end())) + { + boost::format formatter("Invalid endpoint. thread id : %d."); formatter % boost::this_thread::get_id(); - putLogError(17101, formatter.str(), __FILE__, __LINE__ ); + putLogError(100107, formatter.str(), __FILE__, __LINE__ ); throw -1; } - session_data = session_thread_it->second; - } - //endpoint check - recive_data_it = session_data->recive_data_map.find(session_data->target_endpoint); - if (recive_data_it == session_data->recive_data_map.end()) - { - boost::format formatter("Invalid endpoint. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogError(17102, formatter.str(), __FILE__, __LINE__ ); - throw -1; - } - recive_data& recv_data = recive_data_it->second; + recive_data& recv_data = recive_data_it->second; - send_status_it it = recv_data.send_status_list.begin(); - send_status_it it_end = recv_data.send_status_list.end(); + send_status_it it = recv_data.send_status_list.begin(); + send_status_it it_end = recv_data.send_status_list.end(); - //check status list - it = std::adjacent_find(it, it_end, data_send_list_incorrect()); - if (it != it_end) - { - boost::format formatter("Sending possible data is invalid. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogError(17103, formatter.str(), __FILE__, __LINE__ ); - throw -1; - } - //status list check - it = recv_data.send_status_list.begin(); - it = find_if(it, it_end, data_send_ok()); - if (it == it_end) - { - boost::format formatter("Sending possible data is not existed. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogError(17104, formatter.str(), __FILE__, __LINE__ ); - throw -1; - } + //check status list + it = std::adjacent_find(it, it_end, data_send_list_incorrect()); + if (unlikely(it != it_end)) + { + boost::format formatter("Sending possible data is invalid. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100108, formatter.str(), __FILE__, __LINE__ ); + throw -1; + } + //status list check + it = recv_data.send_status_list.begin(); + it = find_if(it, it_end, data_send_ok()); + if (unlikely(it == it_end)) + { + boost::format formatter("Sending possible data is not existed. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100109, formatter.str(), __FILE__, __LINE__ ); + throw -1; + } - //sending possible data is exist - if (it->send_possible_size > 0) - { - //status remain SEND_OK - it->status = SEND_OK; - //offset recalc - it->send_offset += it->send_end_size; - //send_end_size recalc - it->send_end_size = 0; - } - //sending possible data is not exist - else - { - //can recive from clent continue - if (it->send_rest_size > 0) + //sending possible data is exist + if (it->send_possible_size > 0) { - //change status from SEND_OK to SEND_CONTINUE - it->status = SEND_CONTINUE; + //status remain SEND_OK + it->status = SEND_OK; + //offset recalc + it->send_offset += it->send_end_size; + //send_end_size recalc + it->send_end_size = 0; } - //can not recive from clent continue + //sending possible data is not exist else { - //change status from SEND_OK to SEND_END - it->status = SEND_END; + //can recive from clent continue + if (it->send_rest_size > 0) + { + //change status from SEND_OK to SEND_CONTINUE + it->status = SEND_CONTINUE; + } + //can not recive from clent continue + else + { + //change status from SEND_OK to SEND_END + it->status = SEND_END; + } } - } - it = recv_data.send_status_list.begin(); - it = find_if(it, it_end, data_send_ok()); - //send_ok item is exist - if (it != it_end) - { - status = CLIENT_CONNECTION_CHECK; - } - //send_ok item is not exist - else - { - //end flag is on - if (session_data->end_flag == END_FLAG_ON) + it = recv_data.send_status_list.begin(); + it = find_if(it, it_end, data_send_ok()); + //send_ok item is exist + if (it != it_end) { - status = CLIENT_DISCONNECT; + status = CLIENT_CONNECTION_CHECK; } - //end flag is off + //send_ok item is not exist else { - //sorry flag is on - if (session_data->sorry_flag == SORRY_FLAG_ON) + //end flag is on + if (session_data->end_flag == END_FLAG_ON) { - status = SORRYSERVER_RECV; + status = CLIENT_DISCONNECT; } - //sorry flag is off + //end flag is off else { - status = REALSERVER_RECV; + //sorry flag is on + if (session_data->sorry_flag == SORRY_FLAG_ON) + { + status = SORRYSERVER_RECV; + } + //sorry flag is off + else + { + status = REALSERVER_RECV; + } } } } - } - catch (int e) - { - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + catch (int e) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_client_send() : catch exception e = %d. thread id : %d."); + formatter % e % boost::this_thread::get_id(); + putLogDebug(100221, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + status = FINALIZE; + } + catch (const std::exception& ex) + { + std::cerr << "protocol_module_sessionless::handle_client_send() : exception : error = " << ex.what() << "." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_client_send() : exception : error = %s. thread id : %d."); + formatter % ex.what() % boost::this_thread::get_id(); + putLogError(100110, formatter.str(), __FILE__, __LINE__ ); + status = FINALIZE; + } + catch (...) { + std::cerr << "protocol_module_sessionless::handle_client_send() : Unknown exception." << std::endl; boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_client_send() : catch exception e = %d. thread id : %d."); - formatter % e % boost::this_thread::get_id(); - putLogDebug(10218, formatter.str(), __FILE__, __LINE__ ); + "handle_client_send() : Unknown exception. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100111, formatter.str(), __FILE__, __LINE__ ); + status = FINALIZE; + } + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_client_send(const boost::thread::id thread_id) : return_value = %d. thread id : %d."); + formatter % status % boost::this_thread::get_id(); + putLogDebug(100222, formatter.str(), __FILE__, __LINE__ ); } /*------DEBUG LOG END------*/ - status = FINALIZE; - } - catch (const std::exception& ex) - { - std::cerr << "protocol_module_sessionless::handle_client_send() : exception : error = " << ex.what() << "." << std::endl; - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_client_send() : exception : error = %s. thread id : %d."); - formatter % ex.what() % boost::this_thread::get_id(); - putLogError(17105, formatter.str(), __FILE__, __LINE__ ); - status = FINALIZE; - } - catch (...) - { - std::cerr << "protocol_module_sessionless::handle_client_send() : Unknown exception." << std::endl; - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_client_send() : Unknown exception. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogError(17106, formatter.str(), __FILE__, __LINE__ ); - status = FINALIZE; - } - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_client_send(const boost::thread::id thread_id) : return_value = %d. thread id : %d."); - formatter % status % boost::this_thread::get_id(); - putLogDebug(10219, formatter.str(), __FILE__, __LINE__ ); + return status; } - /*------DEBUG LOG END------*/ - - return status; -} -//! call from client disconnect event. use upstream thread and downstream thread. -//! @param[in] upstream and downstream thread id( check! one thread one event! ) -//! @return session use EVENT mode -protocol_module_base::EVENT_TAG protocol_module_sessionless::handle_client_disconnect( - const boost::thread::id thread_id) -{ - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + //! call from client disconnect event. use upstream thread and downstream thread. + //! @param[in] upstream and downstream thread id( check! one thread one event! ) + //! @return session use EVENT mode + protocol_module_base::EVENT_TAG protocol_module_sessionless::handle_client_disconnect( + const boost::thread::id thread_id) { - boost::format formatter("in/out_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_client_disconnect(const boost::thread::id thread_id) : return_value = %d. thread id : %d."); - formatter % FINALIZE % boost::this_thread::get_id(); - putLogDebug(10220, formatter.str(), __FILE__, __LINE__ ); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("in/out_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_client_disconnect(const boost::thread::id thread_id) : return_value = %d. thread id : %d."); + formatter % FINALIZE % boost::this_thread::get_id(); + putLogDebug(100223, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + return FINALIZE; } - /*------DEBUG LOG END------*/ - return FINALIZE; -} -//! call from sorry mode event. use upstream thread and downstream thread -//! @param[in] upstream and downstream thread id( check! one thread one event and first time call pattern ) -//! @return session use EVENT mode -protocol_module_base::EVENT_TAG protocol_module_sessionless::handle_sorry_enable( - const boost::thread::id thread_id) -{ - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - boost::format formatter("in_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorry_enable(const boost::thread::id thread_id) : " - "thread_id = %d."); - formatter % thread_id; - putLogDebug(10221, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - - EVENT_TAG status = FINALIZE; - boost::asio::ip::tcp::endpoint endpoint; - bool send_possible = false; - bool send_continue = false; - bool send_disable = false; - thread_data_ptr session_data; - session_thread_data_map_it session_thread_it; - recive_data_map_it recive_data_it; - - try + //! call from sorry mode event. use upstream thread and downstream thread + //! @param[in] upstream and downstream thread id( check! one thread one event and first time call pattern ) + //! @return session use EVENT mode + protocol_module_base::EVENT_TAG protocol_module_sessionless::handle_sorry_enable( + const boost::thread::id thread_id) { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - boost::mutex::scoped_lock sclock(session_thread_data_map_mutex); - //check thread_id - session_thread_it = session_thread_data_map.find(thread_id); - if (session_thread_it == session_thread_data_map.end() || session_thread_it->second == NULL) - { - boost::format formatter("Invalid thread id. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogError(17107, formatter.str(), __FILE__, __LINE__ ); - throw -1; - } - - session_data = session_thread_it->second; + boost::format formatter("in_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorry_enable(const boost::thread::id thread_id) : " + "thread_id = %d."); + formatter % thread_id; + putLogDebug(100224, formatter.str(), __FILE__, __LINE__ ); } - //check endpoint - endpoint = session_data->thread_division == THREAD_DIVISION_UP_STREAM ? session_data->client_endpoint_tcp - : session_data->target_endpoint; - recive_data_it = session_data->recive_data_map.find(endpoint); - if (recive_data_it == session_data->recive_data_map.end()) + /*------DEBUG LOG END------*/ + + EVENT_TAG status = FINALIZE; + boost::asio::ip::tcp::endpoint endpoint; + bool send_possible = false; + bool send_continue = false; + bool send_disable = false; + thread_data_ptr session_data; + session_thread_data_map_it session_thread_it; + recive_data_map_it recive_data_it; + + try { - //must be down thread - if (session_data->thread_division == THREAD_DIVISION_UP_STREAM) { - boost::format formatter("Invalid endpoint. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogError(17108, formatter.str(), __FILE__, __LINE__ ); - throw -1; + boost::mutex::scoped_lock slock(session_thread_data_map_mutex); + //check thread_id + session_thread_it = session_thread_data_map.find(thread_id); + if (unlikely(session_thread_it == session_thread_data_map.end() || session_thread_it->second == NULL)) + { + boost::format formatter("Invalid thread id. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100112, formatter.str(), __FILE__, __LINE__ ); + throw -1; + } + + session_data = session_thread_it->second; } - session_data->sorry_flag = SORRY_FLAG_ON; - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + //check endpoint + endpoint = session_data->thread_division == THREAD_DIVISION_UP_STREAM ? session_data->client_endpoint_tcp + : session_data->target_endpoint; + recive_data_it = session_data->recive_data_map.find(endpoint); + if (unlikely(recive_data_it == session_data->recive_data_map.end())) { - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorry_enable() : SORRY_FLAG_ON. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogDebug(10222, formatter.str(), __FILE__, __LINE__ ); + //must be down thread + if (unlikely(session_data->thread_division == THREAD_DIVISION_UP_STREAM)) + { + boost::format formatter("Invalid endpoint. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100113, formatter.str(), __FILE__, __LINE__ ); + throw -1; + } + session_data->sorry_flag = SORRY_FLAG_ON; + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorry_enable() : SORRY_FLAG_ON. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogDebug(100225, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + status = SORRYSERVER_RECV; } - /*------DEBUG LOG END------*/ - status = SORRYSERVER_RECV; - } - else - { - recive_data& recv_data = recive_data_it->second; - - //get this thread sending possible data - send_status_it it = find_if(recv_data.send_status_list.begin(), recv_data.send_status_list.end(), - data_send_possible()); - if (it != recv_data.send_status_list.end()) + else { - send_possible = true; - } + recive_data& recv_data = recive_data_it->second; - it = find_if(recv_data.send_status_list.begin(), recv_data.send_status_list.end(), data_send_continue()); - if (it != recv_data.send_status_list.end()) - { - send_continue = true; - } + //get this thread sending possible data + send_status_it it = find_if(recv_data.send_status_list.begin(), recv_data.send_status_list.end(), + data_send_possible()); + if (it != recv_data.send_status_list.end()) + { + send_possible = true; + } - it = find_if(recv_data.send_status_list.begin(), recv_data.send_status_list.end(), data_send_disable()); - if (it != recv_data.send_status_list.end()) - { - send_disable = true; - } + it = find_if(recv_data.send_status_list.begin(), recv_data.send_status_list.end(), data_send_continue()); + if (it != recv_data.send_status_list.end()) + { + send_continue = true; + } - //up thread - if (session_data->thread_division == THREAD_DIVISION_UP_STREAM) - { - //accept_end_flag is off - if (session_data->accept_end_flag == ACCEPT_END_FLAG_OFF) + it = find_if(recv_data.send_status_list.begin(), recv_data.send_status_list.end(), data_send_disable()); + if (it != recv_data.send_status_list.end()) { - //set sorry flag on - session_data->sorry_flag = SORRY_FLAG_ON; - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorry_enable() : SORRY_FLAG_ON. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogDebug(10223, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - status = ACCEPT; + send_disable = true; } - //accept_end_flag is on - else + + //up thread + if (session_data->thread_division == THREAD_DIVISION_UP_STREAM) { - //set sorry flag on - if (session_data->sorry_flag == SORRY_FLAG_ON) + //accept_end_flag is off + if (session_data->accept_end_flag == ACCEPT_END_FLAG_OFF) { - //sending possible data is exist - if (send_possible) - { - status = SORRYSERVER_SELECT; - } - //sending possible data is not exist - else + //set sorry flag on + session_data->sorry_flag = SORRY_FLAG_ON; + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - status = CLIENT_RECV; + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorry_enable() : SORRY_FLAG_ON. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogDebug(100226, formatter.str(), __FILE__, __LINE__ ); } + /*------DEBUG LOG END------*/ + status = ACCEPT; } - //set sorry flag off + //accept_end_flag is on else { - //the data that can be sent continue is exist - if (send_continue) + //set sorry flag on + if (session_data->sorry_flag == SORRY_FLAG_ON) { - //set end flag on - session_data->end_flag = END_FLAG_ON; - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (send_possible) { - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorry_enable() : END_FLAG_ON. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogDebug(10224, formatter.str(), __FILE__, __LINE__ ); + status = SORRYSERVER_CONNECT; } - /*------DEBUG LOG END------*/ - status = REALSERVER_DISCONNECT; + else + { + status = SORRYSERVER_SELECT; + } + } - //the data that can be sent continue is not exist + //set sorry flag off else { - //set sorryserver_switch_flag on - session_data->sorryserver_switch_flag = SORRYSERVER_SWITCH_FLAG_ON; - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + //the data that can be sent continue is exist + if (send_continue) { - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorry_enable() : SORRYSERVER_SWITCH_FLAG_ON. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogDebug(10225, formatter.str(), __FILE__, __LINE__ ); + //set end flag on + session_data->end_flag = END_FLAG_ON; + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorry_enable() : END_FLAG_ON. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogDebug(100227, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + status = REALSERVER_DISCONNECT; } - /*------DEBUG LOG END------*/ - //set sorry_flag on - session_data->sorry_flag = SORRY_FLAG_ON; - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + //the data that can be sent continue is not exist + else { - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorry_enable() : SORRY_FLAG_ON. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogDebug(10226, formatter.str(), __FILE__, __LINE__ ); + //set sorryserver_switch_flag on + session_data->sorryserver_switch_flag = SORRYSERVER_SWITCH_FLAG_ON; + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorry_enable() : SORRYSERVER_SWITCH_FLAG_ON. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogDebug(100228, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + //set sorry_flag on + session_data->sorry_flag = SORRY_FLAG_ON; + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorry_enable() : SORRY_FLAG_ON. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogDebug(100229, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + status = REALSERVER_DISCONNECT; } - /*------DEBUG LOG END------*/ - status = REALSERVER_DISCONNECT; } } } - } - //down thread - else - { - //sorry_flag is on - if (session_data->sorry_flag == SORRY_FLAG_ON) - { - //sending possible data is exist - if (send_possible) - { - status = CLIENT_CONNECTION_CHECK; - } - //sending possible data is not exist - else - { - status = SORRYSERVER_RECV; - } - } - //sorry_flag is off + //down thread else { - //sending possible data is exist or send_rest_size > 0 - if (send_disable) + //sorry_flag is on + if (session_data->sorry_flag == SORRY_FLAG_ON) { - //set end flag on - session_data->end_flag = END_FLAG_ON; - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + //sending possible data is exist + if (send_possible) + { + status = CLIENT_CONNECTION_CHECK; + } + //sending possible data is not exist + else { - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorry_enable() : END_FLAG_ON. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogDebug(10227, formatter.str(), __FILE__, __LINE__ ); + status = SORRYSERVER_RECV; } - /*------DEBUG LOG END------*/ - status = REALSERVER_DISCONNECT; } - // + //sorry_flag is off else { //set sorry_flag on session_data->sorry_flag = SORRY_FLAG_ON; /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" "handle_sorry_enable() : SORRY_FLAG_ON. thread id : %d."); formatter % boost::this_thread::get_id(); - putLogDebug(10228, formatter.str(), __FILE__, __LINE__ ); + putLogDebug(100230, formatter.str(), __FILE__, __LINE__ ); } /*------DEBUG LOG END------*/ - //sending possible data is exist - if (send_possible) + session_data->sorryserver_switch_flag = SORRYSERVER_SWITCH_FLAG_ON; + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - status = CLIENT_CONNECTION_CHECK; + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorry_enable() : SORRYSERVER_SWITCH_FLAG_ON. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogDebug(100231, formatter.str(), __FILE__, __LINE__ ); } - //sending possible data is not exist + /*------DEBUG LOG END------*/ + + //sending ng data is exist or send_rest_size > 0 + if (send_disable) + { + //set end flag on + session_data->end_flag = END_FLAG_ON; + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorry_enable() : END_FLAG_ON. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogDebug(100232, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + status = REALSERVER_DISCONNECT; + } + // else { - status = SORRYSERVER_RECV; + //sending possible data is exist + if (send_possible) + { + status = CLIENT_CONNECTION_CHECK; + } + //sending possible data is not exist + else + { + status = SORRYSERVER_RECV; + } } } } } } - } - catch (int e) - { - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + catch (int e) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorry_enable() : catch exception e = %d. thread id : %d."); + formatter % e % boost::this_thread::get_id(); + putLogDebug(100233, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + status = FINALIZE; + } + catch (const std::exception& ex) { + std::cerr << "protocol_module_sessionless::handle_sorry_enable() : exception : error = " << ex.what() << "." << std::endl; boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorry_enable() : catch exception e = %d. thread id : %d."); - formatter % e % boost::this_thread::get_id(); - putLogDebug(10229, formatter.str(), __FILE__, __LINE__ ); + "handle_sorry_enable() : exception : error = %s. thread id : %d."); + formatter % ex.what() % boost::this_thread::get_id(); + putLogError(100114, formatter.str(), __FILE__, __LINE__ ); + status = FINALIZE; + } + catch (...) + { + std::cerr << "protocol_module_sessionless::handle_sorry_enable() : Unknown exception." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorry_enable() : Unknown exception. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100115, formatter.str(), __FILE__, __LINE__ ); + status = FINALIZE; + } + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorry_enable(const boost::thread::id thread_id) : return_value = %d. thread id : %d."); + formatter % status % boost::this_thread::get_id(); + putLogDebug(100234, formatter.str(), __FILE__, __LINE__ ); } /*------DEBUG LOG END------*/ - status = FINALIZE; - } - catch (const std::exception& ex) - { - std::cerr << "protocol_module_sessionless::handle_sorry_enable() : exception : error = " << ex.what() << "." << std::endl; - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorry_enable() : exception : error = %s. thread id : %d."); - formatter % ex.what() % boost::this_thread::get_id(); - putLogError(17109, formatter.str(), __FILE__, __LINE__ ); - status = FINALIZE; - } - catch (...) - { - std::cerr << "protocol_module_sessionless::handle_sorry_enable() : Unknown exception." << std::endl; - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorry_enable() : Unknown exception. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogError(17110, formatter.str(), __FILE__, __LINE__ ); - status = FINALIZE; - } - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorry_enable(const boost::thread::id thread_id) : return_value = %d. thread id : %d."); - formatter % status % boost::this_thread::get_id(); - putLogDebug(10230, formatter.str(), __FILE__, __LINE__ ); + return status; } - /*------DEBUG LOG END------*/ - - return status; -} -//! call from sorry mode disable. use upstream thread and downstream thread. -//! @param[in] upstream and downstream thread id( check! one thread one event ) -//! @return session use EVENT mode -protocol_module_base::EVENT_TAG protocol_module_sessionless::handle_sorry_disable( - const boost::thread::id thread_id) -{ - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - boost::format formatter("in_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorry_disable(const boost::thread::id thread_id) : " - "thread_id = %d."); - formatter % thread_id; - putLogDebug(10231, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - EVENT_TAG status = FINALIZE; - boost::asio::ip::tcp::endpoint endpoint; - bool send_possible = false; - bool send_disable = false; - bool send_continue = false; - thread_data_ptr session_data; - - try + //! call from sorry mode disable. use upstream thread and downstream thread. + //! @param[in] upstream and downstream thread id( check! one thread one event ) + //! @return session use EVENT mode + protocol_module_base::EVENT_TAG protocol_module_sessionless::handle_sorry_disable( + const boost::thread::id thread_id) { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - boost::mutex::scoped_lock sclock(session_thread_data_map_mutex); - //check thread_id - session_thread_data_map_it session_thread_it = session_thread_data_map.find(thread_id); - if (session_thread_it == session_thread_data_map.end() || session_thread_it->second == NULL) - { - boost::format formatter("Invalid thread id. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogError(17111, formatter.str(), __FILE__, __LINE__ ); - throw -1; - } - //check pointer - session_data = session_thread_it->second; + boost::format formatter("in_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorry_disable(const boost::thread::id thread_id) : " + "thread_id = %d."); + formatter % thread_id; + putLogDebug(100235, formatter.str(), __FILE__, __LINE__ ); } - //check endpoint - endpoint = session_data->thread_division == THREAD_DIVISION_UP_STREAM ? session_data->client_endpoint_tcp - : session_data->target_endpoint; - recive_data_map_it recive_data_it = session_data->recive_data_map.find(endpoint); - if (recive_data_it == session_data->recive_data_map.end()) + /*------DEBUG LOG END------*/ + EVENT_TAG status = FINALIZE; + boost::asio::ip::tcp::endpoint endpoint; + bool send_possible = false; + bool send_disable = false; + bool send_continue = false; + thread_data_ptr session_data; + + try { - //must be down thread - if (session_data->thread_division == THREAD_DIVISION_UP_STREAM) { - boost::format formatter("Invalid endpoint. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogError(17112, formatter.str(), __FILE__, __LINE__ ); - throw -1; + boost::mutex::scoped_lock sclock(session_thread_data_map_mutex); + //check thread_id + session_thread_data_map_it session_thread_it = session_thread_data_map.find(thread_id); + if (unlikely(session_thread_it == session_thread_data_map.end() || session_thread_it->second == NULL)) + { + boost::format formatter("Invalid thread id. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100116, formatter.str(), __FILE__, __LINE__ ); + throw -1; + } + //check pointer + session_data = session_thread_it->second; } - - session_data->sorry_flag = SORRY_FLAG_OFF; - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + //check endpoint + endpoint = session_data->thread_division == THREAD_DIVISION_UP_STREAM ? session_data->client_endpoint_tcp + : session_data->target_endpoint; + recive_data_map_it recive_data_it = session_data->recive_data_map.find(endpoint); + if (unlikely(recive_data_it == session_data->recive_data_map.end())) { - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorry_disable() : SORRY_FLAG_OFF. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogDebug(10232, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - status = REALSERVER_RECV; - } - else - { - recive_data& recv_data = recive_data_it->second; + //must be down thread + if (unlikely(session_data->thread_division == THREAD_DIVISION_UP_STREAM)) + { + boost::format formatter("Invalid endpoint. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100117, formatter.str(), __FILE__, __LINE__ ); + throw -1; + } - //get this thread sending possible data - send_status_it it = find_if(recv_data.send_status_list.begin(), recv_data.send_status_list.end(), - data_send_possible()); - if (it != recv_data.send_status_list.end()) - { - send_possible = true; + session_data->sorry_flag = SORRY_FLAG_OFF; + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorry_disable() : SORRY_FLAG_OFF. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogDebug(100236, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + status = REALSERVER_RECV; } - - //sending possible data is exist or send_rest_size > 0 - it = find_if(recv_data.send_status_list.begin(), recv_data.send_status_list.end(), data_send_disable()); - if (it != recv_data.send_status_list.end()) + else { - send_disable = true; - } + recive_data& recv_data = recive_data_it->second; - //the data that can be sent continue is exist - it = find_if(recv_data.send_status_list.begin(), recv_data.send_status_list.end(), data_send_continue()); - if (it != recv_data.send_status_list.end()) - { - send_continue = true; - } + //get this thread sending possible data + send_status_it it = find_if(recv_data.send_status_list.begin(), recv_data.send_status_list.end(), + data_send_possible()); + if (it != recv_data.send_status_list.end()) + { + send_possible = true; + } - //up thread - if (session_data->thread_division == THREAD_DIVISION_UP_STREAM) - { - //accept_end_flag is off - if (session_data->accept_end_flag == ACCEPT_END_FLAG_OFF) + //sending ng data is exist or send_rest_size > 0 + it = find_if(recv_data.send_status_list.begin(), recv_data.send_status_list.end(), data_send_disable()); + if (it != recv_data.send_status_list.end()) { - //set sorry flag off - session_data->sorry_flag = SORRY_FLAG_OFF; - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorry_disable() : SORRY_FLAG_OFF. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogDebug(10233, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ + send_disable = true; + } - status = ACCEPT; + //the data that can be sent continue is exist + it = find_if(recv_data.send_status_list.begin(), recv_data.send_status_list.end(), data_send_continue()); + if (it != recv_data.send_status_list.end()) + { + send_continue = true; } - //accept_end_flag is on - else + + //up thread + if (session_data->thread_division == THREAD_DIVISION_UP_STREAM) { - //sorry flag is on - if (session_data->sorry_flag == SORRY_FLAG_ON) + //accept_end_flag is off + if (session_data->accept_end_flag == ACCEPT_END_FLAG_OFF) { - //the data that can be sent continue is exist - if (send_continue) + //set sorry flag off + session_data->sorry_flag = SORRY_FLAG_OFF; + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - //set end flag on - session_data->end_flag = END_FLAG_ON; - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorry_disable() : END_FLAG_ON. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogDebug(10234, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - status = SORRYSERVER_DISCONNECT; + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorry_disable() : SORRY_FLAG_OFF. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogDebug(100237, formatter.str(), __FILE__, __LINE__ ); } - //the data that can be sent continue is not exist - else + /*------DEBUG LOG END------*/ + + status = ACCEPT; + } + //accept_end_flag is on + else + { + //sorry flag is on + if (session_data->sorry_flag == SORRY_FLAG_ON) { - //set realserver_switch_flag on - session_data->realserver_switch_flag = REALSERVER_SWITCH_FLAG_ON; - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + //the data that can be sent continue is exist + if (send_continue) { - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorry_disable() : REALSERVER_SWITCH_FLAG_ON. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogDebug(10235, formatter.str(), __FILE__, __LINE__ ); + //set end flag on + session_data->end_flag = END_FLAG_ON; + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorry_disable() : END_FLAG_ON. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogDebug(100238, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + status = SORRYSERVER_DISCONNECT; } - /*------DEBUG LOG END------*/ - //set sorry_flag off - session_data->sorry_flag = SORRY_FLAG_OFF; - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + //the data that can be sent continue is not exist + else { - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorry_disable() : SORRY_FLAG_OFF. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogDebug(10236, formatter.str(), __FILE__, __LINE__ ); + //set realserver_switch_flag on + session_data->realserver_switch_flag = REALSERVER_SWITCH_FLAG_ON; + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorry_disable() : REALSERVER_SWITCH_FLAG_ON. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogDebug(100239, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + //set sorry_flag off + session_data->sorry_flag = SORRY_FLAG_OFF; + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorry_disable() : SORRY_FLAG_OFF. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogDebug(100240, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + status = SORRYSERVER_DISCONNECT; } - /*------DEBUG LOG END------*/ - status = SORRYSERVER_DISCONNECT; - } - } - //sorry flag is off - else - { - //the data that can be sent possible is exist - if (send_possible) - { - status = REALSERVER_SELECT; } - //the data that can be sent possible is not exist + //sorry flag is off else { - status = CLIENT_RECV; + if (send_possible) + { + status = REALSERVER_CONNECT; + } + else + { + status = REALSERVER_SELECT; + } } } } - } - //down thread - else - { - //sorry_flag is on - if (session_data->sorry_flag == SORRY_FLAG_ON) + //down thread + else { - //sending possible data is exist or send_rest_size > 0 - if (send_disable) + //sorry_flag is on + if (session_data->sorry_flag == SORRY_FLAG_ON) { - //set end flag on - session_data->end_flag = END_FLAG_ON; + //set sorry_flag off + session_data->sorry_flag = SORRY_FLAG_OFF; /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorry_disable() : END_FLAG_ON. thread id : %d."); + "handle_sorry_disable() : SORRY_FLAG_OFF. thread id : %d."); formatter % boost::this_thread::get_id(); - putLogDebug(10237, formatter.str(), __FILE__, __LINE__ ); + putLogDebug(100241, formatter.str(), __FILE__, __LINE__ ); } /*------DEBUG LOG END------*/ - status = SORRYSERVER_DISCONNECT; - } - // - else - { - //set sorry_flag off - session_data->sorry_flag = SORRY_FLAG_OFF; + session_data->realserver_switch_flag = REALSERVER_SWITCH_FLAG_ON; /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorry_disable() : SORRY_FLAG_OFF. thread id : %d."); + "handle_sorry_disable() : REALSERVER_SWITCH_FLAG_ON. thread id : %d."); formatter % boost::this_thread::get_id(); - putLogDebug(10238, formatter.str(), __FILE__, __LINE__ ); + putLogDebug(100242, formatter.str(), __FILE__, __LINE__ ); } /*------DEBUG LOG END------*/ + //sending ng data is exist or send_rest_size > 0 + if (send_disable) + { + //set end flag on + session_data->end_flag = END_FLAG_ON; + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorry_disable() : END_FLAG_ON. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogDebug(100243, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + status = SORRYSERVER_DISCONNECT; + } + // + else + { + //sending possible data is exist + if (send_possible) + { + status = CLIENT_CONNECTION_CHECK; + } + //sending possible data is not exist + else + { + status = REALSERVER_RECV; + } + } + } + //sorry_flag is off + else + { //sending possible data is exist if (send_possible) { @@ -7162,457 +7324,487 @@ protocol_module_base::EVENT_TAG protocol_module_sessionless::handle_sorry_disabl } } } - //sorry_flag is off - else - { - //sending possible data is exist - if (send_possible) - { - status = CLIENT_CONNECTION_CHECK; - } - //sending possible data is not exist - else - { - status = REALSERVER_RECV; - } - } } - } - } - catch (int e) - { - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + } + catch (int e) + { + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorry_disable() : catch exception e = %d. thread id : %d."); + formatter % e % boost::this_thread::get_id(); + putLogDebug(100244, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + status = FINALIZE; + } + catch (std::exception& ex) { + std::cerr << "protocol_module_sessionless::handle_sorry_disable() : exception : error = " << ex.what() << "." << std::endl; boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorry_disable() : catch exception e = %d. thread id : %d."); - formatter % e % boost::this_thread::get_id(); - putLogDebug(10239, formatter.str(), __FILE__, __LINE__ ); + "handle_sorry_disable() : exception : error = %s. thread id : %d."); + formatter % ex.what() % boost::this_thread::get_id(); + putLogError(100118, formatter.str(), __FILE__, __LINE__ ); + status = FINALIZE; } - /*------DEBUG LOG END------*/ - status = FINALIZE; - } - catch (std::exception& ex) - { - std::cerr << "protocol_module_sessionless::handle_sorry_disable() : exception : error = " << ex.what() << "." << std::endl; - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorry_disable() : exception : error = %s. thread id : %d."); - formatter % ex.what() % boost::this_thread::get_id(); - putLogError(17113, formatter.str(), __FILE__, __LINE__ ); - status = FINALIZE; - } - catch (...) - { - std::cerr << "protocol_module_sessionless::handle_sorry_disable() : Unknown exception." << std::endl; - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorry_disable() : Unknown exception. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogError(17114, formatter.str(), __FILE__, __LINE__ ); - status = FINALIZE; - } + catch (...) + { + std::cerr << "protocol_module_sessionless::handle_sorry_disable() : Unknown exception." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorry_disable() : Unknown exception. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100119, formatter.str(), __FILE__, __LINE__ ); + status = FINALIZE; + } + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorry_disable(const boost::thread::id thread_id) : return_value = %d. thread id : %d."); + formatter % status % boost::this_thread::get_id(); + putLogDebug(100245, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorry_disable(const boost::thread::id thread_id) : return_value = %d. thread id : %d."); - formatter % status % boost::this_thread::get_id(); - putLogDebug(10240, formatter.str(), __FILE__, __LINE__ ); + return status; } - /*------DEBUG LOG END------*/ - - return status; -} -//! call from realserver disconnect. use upstream thread and downstream thread -//! @param[in] upstream and downstream thread id( check! one thread one event ) -//! @param[in] disconnected realserver endpoint. -//! @return session use EVENT mode -protocol_module_base::EVENT_TAG protocol_module_sessionless::handle_realserver_disconnect( - const boost::thread::id thread_id, const boost::asio::ip::tcp::endpoint & rs_endpoint) -{ - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + //! call from realserver disconnect. use upstream thread and downstream thread + //! @param[in] upstream and downstream thread id( check! one thread one event ) + //! @param[in] disconnected realserver endpoint. + //! @return session use EVENT mode + protocol_module_base::EVENT_TAG protocol_module_sessionless::handle_realserver_disconnect( + const boost::thread::id thread_id, const boost::asio::ip::tcp::endpoint & rs_endpoint) { - boost::format formatter("in_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_realserver_disconnect(const boost::thread::id thread_id, const boost::asio::ip::tcp::endpoint & rs_endpoint) : " - "thread_id = %d, rs_endpoint = [%s]:%d."); - formatter % thread_id % rs_endpoint.address().to_string() % rs_endpoint.port(); - putLogDebug(10241, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - EVENT_TAG status = FINALIZE; - bool possible_flag = false; - thread_data_ptr session_data; - boost::asio::ip::tcp::endpoint endpoint; + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("in_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_realserver_disconnect(const boost::thread::id thread_id, const boost::asio::ip::tcp::endpoint & rs_endpoint) : " + "thread_id = %d, rs_endpoint = [%s]:%d."); + formatter % thread_id % rs_endpoint.address().to_string() % rs_endpoint.port(); + putLogDebug(100246, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + EVENT_TAG status = FINALIZE; + bool possible_flag = false; + thread_data_ptr session_data; + boost::asio::ip::tcp::endpoint endpoint; - try - { + try { - boost::mutex::scoped_lock sclock(session_thread_data_map_mutex); + { + boost::mutex::scoped_lock sclock(session_thread_data_map_mutex); + + session_thread_data_map_it session_thread_it = session_thread_data_map.find(thread_id); + if (unlikely(session_thread_it == session_thread_data_map.end() || session_thread_it->second == NULL)) + { + boost::format formatter("Invalid thread id. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100120, formatter.str(), __FILE__, __LINE__ ); + throw -1; + } + + session_data = session_thread_it->second; + } - session_thread_data_map_it session_thread_it = session_thread_data_map.find(thread_id); - if (session_thread_it == session_thread_data_map.end() || session_thread_it->second == NULL) + endpoint = session_data->thread_division == THREAD_DIVISION_UP_STREAM ? session_data->client_endpoint_tcp + : session_data->target_endpoint; + recive_data_map_it recive_data_it = session_data->recive_data_map.find(endpoint); + if (unlikely(recive_data_it == session_data->recive_data_map.end())) { - boost::format formatter("Invalid thread id. thread id : %d."); + boost::format formatter("Invalid endpoint. thread id : %d."); formatter % boost::this_thread::get_id(); - putLogError(17115, formatter.str(), __FILE__, __LINE__ ); + putLogError(100121, formatter.str(), __FILE__, __LINE__ ); throw -1; } - session_data = session_thread_it->second; - } - - endpoint = session_data->thread_division == THREAD_DIVISION_UP_STREAM ? session_data->client_endpoint_tcp - : session_data->target_endpoint; - recive_data_map_it recive_data_it = session_data->recive_data_map.find(endpoint); - if (recive_data_it == session_data->recive_data_map.end()) - { - boost::format formatter("Invalid endpoint. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogError(17116, formatter.str(), __FILE__, __LINE__ ); - throw -1; - } - - recive_data& recv_data = recive_data_it->second; - - //the data that can be sent possible is exist - send_status_it it = find_if(recv_data.send_status_list.begin(), recv_data.send_status_list.end(), - data_send_possible()); - if (it != recv_data.send_status_list.end()) - { - possible_flag = true; - } + recive_data& recv_data = recive_data_it->second; - //up thread - if (session_data->thread_division == THREAD_DIVISION_UP_STREAM) - { - //end flag is on - if (session_data->end_flag == END_FLAG_ON) + //the data that can be sent possible is exist + send_status_it it = find_if(recv_data.send_status_list.begin(), recv_data.send_status_list.end(), + data_send_possible()); + if (it != recv_data.send_status_list.end()) { - status = CLIENT_RECV; + possible_flag = true; } - //end flag is off - else + + //up thread + if (session_data->thread_division == THREAD_DIVISION_UP_STREAM) { - //sorryserver flag is on - if (session_data->sorryserver_switch_flag == SORRYSERVER_SWITCH_FLAG_ON) + //end flag is on + if (session_data->end_flag == END_FLAG_ON) + { + status = CLIENT_RECV; + } + //end flag is off + else { - //the data that can be sent possible is exist - if (possible_flag) + //sorryserver_switch_flag is on + if (session_data->sorryserver_switch_flag == SORRYSERVER_SWITCH_FLAG_ON) { + session_data->sorryserver_switch_flag = SORRYSERVER_SWITCH_FLAG_OFF; + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_realserver_disconnect() : SORRYSERVER_SWITCH_FLAG_OFF. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogDebug(100247, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + status = SORRYSERVER_SELECT; + } - //the data that can be sent possible is not exist + //sorryserver_switch_flag is off else { + //set end flag on + session_data->end_flag = END_FLAG_ON; + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_realserver_disconnect() : END_FLAG_ON. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogDebug(100248, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ status = CLIENT_RECV; } } - //sorryserver flag is off + } + //down thread + else + { + if (session_data->end_flag == END_FLAG_ON) + { + status = CLIENT_DISCONNECT; + } else { - //set end flag on - session_data->end_flag = END_FLAG_ON; - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (session_data->sorryserver_switch_flag == SORRYSERVER_SWITCH_FLAG_ON) { - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_realserver_disconnect() : END_FLAG_ON. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogDebug(10242, formatter.str(), __FILE__, __LINE__ ); + session_data->sorryserver_switch_flag = SORRYSERVER_SWITCH_FLAG_OFF; + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_realserver_disconnect() : SORRYSERVER_SWITCH_FLAG_OFF. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogDebug(100249, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + status = SORRYSERVER_RECV; } - /*------DEBUG LOG END------*/ - status = CLIENT_RECV; + else + { + //set end flag on + session_data->end_flag = END_FLAG_ON; + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_realserver_disconnect() : END_FLAG_ON. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogDebug(100250, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + status = CLIENT_DISCONNECT; + } + } + + //the data that can be sent possible is exist + if (possible_flag) + { + status = CLIENT_CONNECTION_CHECK; } } } - //down thread - else + catch (int e) { - //set end flag on - session_data->end_flag = END_FLAG_ON; /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_realserver_disconnect() : END_FLAG_ON. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogDebug(10243, formatter.str(), __FILE__, __LINE__ ); + "handle_realserver_disconnect() : catch exception e = %d. thread id : %d."); + formatter % e % boost::this_thread::get_id(); + putLogDebug(100251, formatter.str(), __FILE__, __LINE__ ); } /*------DEBUG LOG END------*/ - //the data that can be sent possible is exist - if (possible_flag) - { - status = CLIENT_CONNECTION_CHECK; - } - //the data that can be sent possible is not exist - else - { - status = CLIENT_DISCONNECT; - } + status = FINALIZE; } - } - catch (int e) - { - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + catch (std::exception& ex) + { + std::cerr << "protocol_module_sessionless::handle_realserver_disconnect() : exception: error = " << ex.what() << "." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_realserver_disconnect() : exception : error = %s. thread id : %d."); + formatter % ex.what() % boost::this_thread::get_id(); + putLogError(100122, formatter.str(), __FILE__, __LINE__ ); + status = FINALIZE; + } + catch (...) { + std::cerr << "protocol_module_sessionless::handle_realserver_disconnect() : Unknown exception." << std::endl; boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_realserver_disconnect() : catch exception e = %d. thread id : %d."); - formatter % e % boost::this_thread::get_id(); - putLogDebug(10244, formatter.str(), __FILE__, __LINE__ ); + "handle_realserver_disconnect() : Unknown exception. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100123, formatter.str(), __FILE__, __LINE__ ); + status = FINALIZE; + } + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_realserver_disconnect(const boost::thread::id thread_id, " + "const boost::asio::ip::tcp::endpoint & rs_endpoint) : return_value = %d. thread id : %d."); + formatter % status % boost::this_thread::get_id(); + putLogDebug(100252, formatter.str(), __FILE__, __LINE__ ); } /*------DEBUG LOG END------*/ - status = FINALIZE; - } - catch (std::exception& ex) - { - std::cerr << "protocol_module_sessionless::handle_realserver_disconnect() : exception: error = " << ex.what() << "." << std::endl; - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_realserver_disconnect() : exception : error = %s. thread id : %d."); - formatter % ex.what() % boost::this_thread::get_id(); - putLogError(17117, formatter.str(), __FILE__, __LINE__ ); - status = FINALIZE; - } - catch (...) - { - std::cerr << "protocol_module_sessionless::handle_realserver_disconnect() : Unknown exception." << std::endl; - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_realserver_disconnect() : Unknown exception. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogError(17118, formatter.str(), __FILE__, __LINE__ ); - status = FINALIZE; - } - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_realserver_disconnect(const boost::thread::id thread_id, " - "const boost::asio::ip::tcp::endpoint & rs_endpoint) : return_value = %d. thread id : %d."); - formatter % status % boost::this_thread::get_id(); - putLogDebug(10245, formatter.str(), __FILE__, __LINE__ ); + return status; } - /*------DEBUG LOG END------*/ - - return status; -} -//! call from sorry server disconnect. use upstraem thread and downstream thread -//! @param[in] upstream and downstream thread id( check! one thread one event ) -//! @param[in] disconnect sorryserver endpoint -//! @return session use EVENT mode -//! @return session use EVENT mode -protocol_module_base::EVENT_TAG protocol_module_sessionless::handle_sorryserver_disconnect( - const boost::thread::id thread_id, const boost::asio::ip::tcp::endpoint & sorry_endpoint) -{ - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + //! call from sorry server disconnect. use upstraem thread and downstream thread + //! @param[in] upstream and downstream thread id( check! one thread one event ) + //! @param[in] disconnect sorryserver endpoint + //! @return session use EVENT mode + //! @return session use EVENT mode + protocol_module_base::EVENT_TAG protocol_module_sessionless::handle_sorryserver_disconnect( + const boost::thread::id thread_id, const boost::asio::ip::tcp::endpoint & sorry_endpoint) { - boost::format - formatter( - "in_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorryserver_disconnect(const boost::thread::id thread_id, " - "const boost::asio::ip::tcp::endpoint & sorry_endpoint) : " - "thread_id = %d, sorry_endpoint = [%s]:%d."); - formatter % thread_id % sorry_endpoint.address().to_string() % sorry_endpoint.port() ; - putLogDebug(10246, formatter.str(), __FILE__, __LINE__ ); - } - /*------DEBUG LOG END------*/ - EVENT_TAG status = FINALIZE; - bool possible_flag = false; - thread_data_ptr session_data; - boost::asio::ip::tcp::endpoint endpoint; + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format + formatter( + "in_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorryserver_disconnect(const boost::thread::id thread_id, " + "const boost::asio::ip::tcp::endpoint & sorry_endpoint) : " + "thread_id = %d, sorry_endpoint = [%s]:%d."); + formatter % thread_id % sorry_endpoint.address().to_string() % sorry_endpoint.port() ; + putLogDebug(100253, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + EVENT_TAG status = FINALIZE; + bool possible_flag = false; + thread_data_ptr session_data; + boost::asio::ip::tcp::endpoint endpoint; - try - { + try { - boost::mutex::scoped_lock sclock(session_thread_data_map_mutex); + { + boost::mutex::scoped_lock sclock(session_thread_data_map_mutex); + + session_thread_data_map_it session_thread_it = session_thread_data_map.find(thread_id); + if (unlikely(session_thread_it == session_thread_data_map.end() || session_thread_it->second == NULL)) + { + boost::format formatter("Invalid thread id. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100124, formatter.str(), __FILE__, __LINE__ ); + throw -1; + } + + session_data = session_thread_it->second; + } - session_thread_data_map_it session_thread_it = session_thread_data_map.find(thread_id); - if (session_thread_it == session_thread_data_map.end() || session_thread_it->second == NULL) + endpoint = session_data->thread_division == THREAD_DIVISION_UP_STREAM ? session_data->client_endpoint_tcp + : session_data->target_endpoint; + recive_data_map_it recive_data_it = session_data->recive_data_map.find(endpoint); + if (unlikely(recive_data_it == session_data->recive_data_map.end())) { - boost::format formatter("Invalid thread id. thread id : %d."); + boost::format formatter("Invalid endpoint. thread id : %d."); formatter % boost::this_thread::get_id(); - putLogError(17119, formatter.str(), __FILE__, __LINE__ ); + putLogError(100125, formatter.str(), __FILE__, __LINE__ ); throw -1; } - session_data = session_thread_it->second; - } - - endpoint = session_data->thread_division == THREAD_DIVISION_UP_STREAM ? session_data->client_endpoint_tcp - : session_data->target_endpoint; - recive_data_map_it recive_data_it = session_data->recive_data_map.find(endpoint); - if (recive_data_it == session_data->recive_data_map.end()) - { - boost::format formatter("Invalid endpoint. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogError(17120, formatter.str(), __FILE__, __LINE__ ); - throw -1; - } - - recive_data& recv_data = recive_data_it->second; - - //the data that can be sent possible is exist - send_status_it it = find_if(recv_data.send_status_list.begin(), recv_data.send_status_list.end(), - data_send_possible()); - if (it != recv_data.send_status_list.end()) - { - possible_flag = true; - } + recive_data& recv_data = recive_data_it->second; - //up thread - if (session_data->thread_division == THREAD_DIVISION_UP_STREAM) - { - //end flag is on - if (session_data->end_flag == END_FLAG_ON) + //the data that can be sent possible is exist + send_status_it it = find_if(recv_data.send_status_list.begin(), recv_data.send_status_list.end(), + data_send_possible()); + if (it != recv_data.send_status_list.end()) { - status = CLIENT_RECV; + possible_flag = true; } - //end flag is off - else + + //up thread + if (session_data->thread_division == THREAD_DIVISION_UP_STREAM) { - //realserver switch flag is on - if (session_data->realserver_switch_flag == REALSERVER_SWITCH_FLAG_ON) + //end flag is on + if (session_data->end_flag == END_FLAG_ON) + { + status = CLIENT_RECV; + } + //end flag is off + else { - //the data that can be sent possible is exist - if (possible_flag) + //realserver_switch_flag is on + if (session_data->realserver_switch_flag == REALSERVER_SWITCH_FLAG_ON) { + session_data->realserver_switch_flag = REALSERVER_SWITCH_FLAG_OFF; + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorryserver_disconnect() : REALSERVER_SWITCH_FLAG_OFF. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogDebug(100254, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ status = REALSERVER_SELECT; } - //the data that can be sent possible is not exist + //realserver_switch_flag is off else { + //set end flag on + session_data->end_flag = END_FLAG_ON; + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorryserver_disconnect() : END_FLAG_ON. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogDebug(100255, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ status = CLIENT_RECV; } } - //realserver switch flag is off + } + //down thread + else + { + if (session_data->end_flag == END_FLAG_ON) + { + status = CLIENT_DISCONNECT; + } else { - //set end flag on - session_data->end_flag = END_FLAG_ON; - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (session_data->realserver_switch_flag == REALSERVER_SWITCH_FLAG_ON) { - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorryserver_disconnect() : END_FLAG_ON. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogDebug(10247, formatter.str(), __FILE__, __LINE__ ); + session_data->realserver_switch_flag = REALSERVER_SWITCH_FLAG_OFF; + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorryserver_disconnect() : REALSERVER_SWITCH_FLAG_OFF. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogDebug(100256, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + status = REALSERVER_RECV; } - /*------DEBUG LOG END------*/ - status = CLIENT_RECV; + else + { + session_data->end_flag = END_FLAG_ON; + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorryserver_disconnect() : END_FLAG_ON. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogDebug(100257, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + status = CLIENT_DISCONNECT; + } + } + + //the data that can be sent possible is exist + if (possible_flag) + { + status = CLIENT_CONNECTION_CHECK; } } } - //down thread - else + catch (int e) { - //set end flag on - session_data->end_flag = END_FLAG_ON; /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorryserver_disconnect() : END_FLAG_ON. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogDebug(10248, formatter.str(), __FILE__, __LINE__ ); + "handle_sorryserver_disconnect() : catch exception e = %d. thread id : %d."); + formatter % e % boost::this_thread::get_id(); + putLogDebug(100258, formatter.str(), __FILE__, __LINE__ ); } /*------DEBUG LOG END------*/ - //the data that can be sent possible is exist - if (possible_flag) - { - status = CLIENT_CONNECTION_CHECK; - } - //the data that can be sent possible is not exist - else - { - status = CLIENT_DISCONNECT; - } + status = FINALIZE; } - } - catch (int e) - { - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + catch (const std::exception& ex) + { + std::cerr << "protocol_module_sessionless::handle_sorryserver_disconnect() : exception : error = " << ex.what() << "." << std::endl; + boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorryserver_disconnect() : exception : error = %s. thread id : %d."); + formatter % ex.what() % boost::this_thread::get_id(); + putLogError(100126, formatter.str(), __FILE__, __LINE__ ); + status = FINALIZE; + } + catch (...) { + std::cerr << "protocol_module_sessionless::handle_sorryserver_disconnect() : Unknown exception." << std::endl; boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorryserver_disconnect() : catch exception e = %d. thread id : %d."); - formatter % e % boost::this_thread::get_id(); - putLogDebug(10249, formatter.str(), __FILE__, __LINE__ ); + "handle_sorryserver_disconnect() : Unknown exception. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogError(100127, formatter.str(), __FILE__, __LINE__ ); + status = FINALIZE; + } + + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format + formatter( + "out_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_sorryserver_disconnect(const boost::thread::id thread_id, " + "const boost::asio::ip::tcp::endpoint& sorry_endpoint) : return_value = %d. thread id : %d."); + formatter % status % boost::this_thread::get_id(); + putLogDebug(100259, formatter.str(), __FILE__, __LINE__ ); } /*------DEBUG LOG END------*/ - status = FINALIZE; - } - catch (const std::exception& ex) - { - std::cerr << "protocol_module_sessionless::handle_sorryserver_disconnect() : exception : error = " << ex.what() << "." << std::endl; - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorryserver_disconnect() : exception : error = %s. thread id : %d."); - formatter % ex.what() % boost::this_thread::get_id(); - putLogError(17121, formatter.str(), __FILE__, __LINE__ ); - status = FINALIZE; - } - catch (...) - { - std::cerr << "protocol_module_sessionless::handle_sorryserver_disconnect() : Unknown exception." << std::endl; - boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorryserver_disconnect() : Unknown exception. thread id : %d."); - formatter % boost::this_thread::get_id(); - putLogError(17122, formatter.str(), __FILE__, __LINE__ ); - status = FINALIZE; - } - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) - { - boost::format - formatter( - "out_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_sorryserver_disconnect(const boost::thread::id thread_id, " - "const boost::asio::ip::tcp::endpoint& sorry_endpoint) : return_value = %d. thread id : %d."); - formatter % status % boost::this_thread::get_id(); - putLogDebug(10250, formatter.str(), __FILE__, __LINE__ ); + return status; } - /*------DEBUG LOG END------*/ - return status; -} - -//! call from realserver disconnect. use upstream thread and downstream thread. -//! @param[in] upstream and downstream thread id( check! one thread one event ) -//! @param[in] disconnect realserver endpoint -//! @return session use EVENT mode. -protocol_module_base::EVENT_TAG protocol_module_sessionless::handle_realserver_close( - const boost::thread::id thread_id, const boost::asio::ip::udp::endpoint & rs_endpoint) -{ - /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + //! call from realserver disconnect. use upstream thread and downstream thread. + //! @param[in] upstream and downstream thread id( check! one thread one event ) + //! @param[in] disconnect realserver endpoint + //! @return session use EVENT mode. + protocol_module_base::EVENT_TAG protocol_module_sessionless::handle_realserver_close( + const boost::thread::id thread_id, const boost::asio::ip::udp::endpoint & rs_endpoint) { - boost::format formatter("in/out_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" - "handle_realserver_close(const boost::thread::id thread_id, " - "const boost::asio::ip::udp::endpoint & rs_endpoint) : " - "return_value = %d. thread id : %d."); - formatter % STOP % boost::this_thread::get_id(); - putLogDebug(10251, formatter.str(), __FILE__, __LINE__ ); + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("in/out_function : protocol_module_base::EVENT_TAG protocol_module_sessionless::" + "handle_realserver_close(const boost::thread::id thread_id, " + "const boost::asio::ip::udp::endpoint & rs_endpoint) : " + "return_value = %d. thread id : %d."); + formatter % STOP % boost::this_thread::get_id(); + putLogDebug(100260, formatter.str(), __FILE__, __LINE__ ); + } + /*------DEBUG LOG END------*/ + return STOP; } - /*------DEBUG LOG END------*/ - return STOP; -} } extern "C" l7vs::protocol_module_base* -create_module() + create_module() { return dynamic_cast(new l7vs::protocol_module_sessionless()); } extern "C" void -destroy_module( l7vs::protocol_module_base* in ) + destroy_module( l7vs::protocol_module_base* in ) { delete in; } diff --git a/module/protocol/protocol_module_sessionless.h b/module/protocol/protocol_module_sessionless.h index 169ce2bc..671d7b17 100644 --- a/module/protocol/protocol_module_sessionless.h +++ b/module/protocol/protocol_module_sessionless.h @@ -29,6 +29,7 @@ #define PROTOCOL_MODULE_SESSIONLESS_H #define MAX_OPTION_SIZE 128 +#define MAX_SESSIONLESS_MODULE_BUFFER_SIZE (4 * 1024* 1024 + MAX_BUFFER_SIZE) namespace l7vs { @@ -121,7 +122,7 @@ protected: int forwarded_for; boost:: array sorry_uri ; std::map session_thread_data_map; - boost::mutex session_thread_data_map_mutex; + boost::mutex session_thread_data_map_mutex; public: static const std::string MODULE_NAME; diff --git a/module/protocol/protocol_module_sslid.cpp b/module/protocol/protocol_module_sslid.cpp index 6e13b5f6..b3c86ad3 100644 --- a/module/protocol/protocol_module_sslid.cpp +++ b/module/protocol/protocol_module_sslid.cpp @@ -25,6 +25,7 @@ #include "protocol_module_sslid.h" #include +#include "utility.h" namespace l7vs { @@ -57,9 +58,9 @@ protocol_module_sslid::~protocol_module_sslid() bool protocol_module_sslid::is_tcp() { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - putLogDebug(30000, "in/out_function : bool protocol_module_sslid::is_tcp() : return_value = true.", + putLogDebug(300000, "in/out_function : bool protocol_module_sslid::is_tcp() : return_value = true.", __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -73,9 +74,9 @@ bool protocol_module_sslid::is_tcp() bool protocol_module_sslid::is_udp() { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - putLogDebug(30001, "in/out_function : bool protocol_module_sslid::is_udp() : return_value = false.", + putLogDebug(300001, "in/out_function : bool protocol_module_sslid::is_udp() : return_value = false.", __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -97,9 +98,9 @@ void protocol_module_sslid::initialize( boost::function< void(void) > inlist_unlock) { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - putLogDebug(30002, "in_function : void protocol_module_sslid::initialize(" + putLogDebug(300002, "in_function : void protocol_module_sslid::initialize(" "rs_list_itr_func_type inlist_begin, rs_list_itr_func_type inlist_end, " "rs_list_itr_next_func_type inlist_next, boost::function< void(void) > " "inlist_lock, boost::function< void(void) > inlist_unlock).", __FILE__, __LINE__); @@ -113,9 +114,9 @@ void protocol_module_sslid::initialize( rs_list_unlock = inlist_unlock; /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - putLogDebug(30003, "out_function : void protocol_module_sslid::initialize(" + putLogDebug(300003, "out_function : void protocol_module_sslid::initialize(" "rs_list_itr_func_type inlist_begin, rs_list_itr_func_type inlist_end, " "rs_list_itr_next_func_type inlist_next, boost::function< void(void) > " "inlist_lock, boost::function< void(void) > inlist_unlock).", __FILE__, __LINE__); @@ -127,9 +128,9 @@ void protocol_module_sslid::initialize( void protocol_module_sslid::finalize() { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - putLogDebug(30004, "in_function : void protocol_module_sslid::finalize().", __FILE__, __LINE__); + putLogDebug(300004, "in_function : void protocol_module_sslid::finalize().", __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -141,9 +142,9 @@ void protocol_module_sslid::finalize() rs_list_unlock.clear(); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - putLogDebug(30005, "function : void protocol_module_sslid::finalize() : " + putLogDebug(300005, "function : void protocol_module_sslid::finalize() : " "rs_list_begin.clear(), rs_list_end.clear(), rs_list_next.clear(), " "rs_list_lock.clear(), rs_list_unlock.clear() end.", __FILE__, __LINE__); } @@ -155,9 +156,9 @@ void protocol_module_sslid::finalize() replication_area_unlock.clear(); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - putLogDebug(30006, "function : void protocol_module_sslid::finalize() : " + putLogDebug(300006, "function : void protocol_module_sslid::finalize() : " "replication_pay_memory.clear(), replication_area_lock.clear(), " "replication_area_unlock.clear() end.", __FILE__, __LINE__); } @@ -167,9 +168,9 @@ void protocol_module_sslid::finalize() schedule_tcp.clear(); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - putLogDebug(30007, "function : void protocol_module_sslid::finalize() : " + putLogDebug(300007, "function : void protocol_module_sslid::finalize() : " "schedule_tcp.clear() end.", __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -183,11 +184,11 @@ void protocol_module_sslid::finalize() if (replication_data_processor) { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("delete : address = &(%d)."); formatter % static_cast(replication_data_processor); - putLogDebug(30008, formatter.str(), __FILE__, __LINE__); + putLogDebug(300008, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -199,11 +200,11 @@ void protocol_module_sslid::finalize() if (session_data_processor) { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("delete : address = &(%d)."); formatter % static_cast(session_data_processor); - putLogDebug(30009, formatter.str(), __FILE__, __LINE__); + putLogDebug(300009, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -212,9 +213,9 @@ void protocol_module_sslid::finalize() } /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - putLogDebug(30010, "out_function : void protocol_module_sslid::finalize().", __FILE__, __LINE__); + putLogDebug(300010, "out_function : void protocol_module_sslid::finalize().", __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -233,9 +234,9 @@ void protocol_module_sslid::finalize() bool protocol_module_sslid::is_use_sorry() { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - putLogDebug(30011, "in/out_function : bool protocol_module_sslid::is_use_sorry() : return_value = false.", + putLogDebug(300011, "in/out_function : bool protocol_module_sslid::is_use_sorry() : return_value = false.", __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -250,7 +251,7 @@ protocol_module_sslid::check_message_result protocol_module_sslid::check_paramet const std::vector& args) { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("in_function : protocol_module_sslid::check_message_result " "protocol_module_sslid::check_parameter(" @@ -261,7 +262,7 @@ protocol_module_sslid::check_message_result protocol_module_sslid::check_paramet argsdump += *it; } formatter % argsdump; - putLogDebug(30012, formatter.str(), __FILE__, __LINE__); + putLogDebug(300012, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -307,7 +308,7 @@ protocol_module_sslid::check_message_result protocol_module_sslid::check_paramet formatter.parse("'-T/--timeout' option value '%s' is too large."); formatter % *itparam; result.message = formatter.str(); - putLogError(37000, result.message, __FILE__, __LINE__); + putLogError(300000, result.message, __FILE__, __LINE__); break; } else @@ -324,7 +325,7 @@ protocol_module_sslid::check_message_result protocol_module_sslid::check_paramet formatter.parse("'-T/--timeout' option value '%s' is not numeric character."); formatter % *itparam; result.message = formatter.str(); - putLogError(37001, result.message, __FILE__, __LINE__); + putLogError(300001, result.message, __FILE__, __LINE__); break; } } @@ -338,7 +339,7 @@ protocol_module_sslid::check_message_result protocol_module_sslid::check_paramet // already set timeout result.flag = false; result.message = "Cannot set multiple option '-T/--timeout'."; - putLogError(37002, result.message, __FILE__, __LINE__); + putLogError(300002, result.message, __FILE__, __LINE__); break; } } @@ -369,7 +370,7 @@ protocol_module_sslid::check_message_result protocol_module_sslid::check_paramet formatter.parse("'-M/--maxlist' option value '%s' is too large."); formatter % *itparam; result.message = formatter.str(); - putLogError(37003, result.message, __FILE__, __LINE__); + putLogError(300003, result.message, __FILE__, __LINE__); break; } else @@ -386,7 +387,7 @@ protocol_module_sslid::check_message_result protocol_module_sslid::check_paramet formatter.parse("'-M/--maxlist' option value '%s' is not numeric character."); formatter % *itparam; result.message = formatter.str(); - putLogError(37004, result.message, __FILE__, __LINE__); + putLogError(300004, result.message, __FILE__, __LINE__); break; } } @@ -400,7 +401,7 @@ protocol_module_sslid::check_message_result protocol_module_sslid::check_paramet // already set maxlist result.flag = false; result.message = "Cannot set multiple option '-M/--maxlist'."; - putLogError(37005, result.message, __FILE__, __LINE__); + putLogError(300005, result.message, __FILE__, __LINE__); break; } } @@ -417,7 +418,7 @@ protocol_module_sslid::check_message_result protocol_module_sslid::check_paramet // already set no-reschedule flag result.flag = false; result.message = "You have to choose either of reschedule or no-reschedule."; - putLogError(37006, result.message, __FILE__, __LINE__); + putLogError(300006, result.message, __FILE__, __LINE__); break; } } @@ -434,7 +435,7 @@ protocol_module_sslid::check_message_result protocol_module_sslid::check_paramet // already set reshcedule flag result.flag = false; result.message = "You have to choose either of reschedule or no-reschedule."; - putLogError(37007, result.message, __FILE__, __LINE__); + putLogError(300007, result.message, __FILE__, __LINE__); break; } } @@ -443,7 +444,7 @@ protocol_module_sslid::check_message_result protocol_module_sslid::check_paramet // set check result flag false result.flag = false; result.message = "Option error."; - putLogError(37008, result.message, __FILE__, __LINE__); + putLogError(300008, result.message, __FILE__, __LINE__); break; } ++itparam; @@ -456,25 +457,25 @@ protocol_module_sslid::check_message_result protocol_module_sslid::check_paramet boost::format formatter("function : protocol_module_sslid::check_message_result " "protocol_module_sslid::check_parameter() : exception : error = %s."); formatter % e.what(); - putLogError(37009, formatter.str(), __FILE__, __LINE__); + putLogError(300009, formatter.str(), __FILE__, __LINE__); } catch (...) { result.flag = false; std::cerr << "protocol_module_sslid::check_parameter() : Unknown exception." << std::endl; - putLogError(37010, "function : protocol_module_sslid::check_message_result protocol_module_sslid::" + putLogError(300010, "function : protocol_module_sslid::check_message_result protocol_module_sslid::" "check_parameter() : Unknown exception.", __FILE__, __LINE__); } /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("out_function : protocol_module_sslid::check_message_result " "protocol_module_sslid::check_parameter(" "const std::vector& args) : return_value = (" "check_message_result.flag = %d, check_message_result.message = %s)."); formatter % result.flag % result.message; - putLogDebug(30013, formatter.str(), __FILE__, __LINE__); + putLogDebug(300013, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -489,7 +490,7 @@ protocol_module_sslid::check_message_result protocol_module_sslid::set_parameter const std::vector& args) { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("in_function : protocol_module_sslid::check_message_result " "protocol_module_sslid::set_parameter(" @@ -500,7 +501,7 @@ protocol_module_sslid::check_message_result protocol_module_sslid::set_parameter argsdump += *it; } formatter % argsdump; - putLogDebug(30014, formatter.str(), __FILE__, __LINE__); + putLogDebug(300014, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -546,7 +547,7 @@ protocol_module_sslid::check_message_result protocol_module_sslid::set_parameter formatter.parse("'-T/--timeout' option value '%s' is too large."); formatter % *itparam; result.message = formatter.str(); - putLogError(37011, result.message, __FILE__, __LINE__); + putLogError(300011, result.message, __FILE__, __LINE__); break; } else @@ -564,7 +565,7 @@ protocol_module_sslid::check_message_result protocol_module_sslid::set_parameter formatter.parse("'-T/--timeout' option value '%s' is not numeric character."); formatter % *itparam; result.message = formatter.str(); - putLogError(37012, result.message, __FILE__, __LINE__); + putLogError(300012, result.message, __FILE__, __LINE__); break; } } @@ -579,7 +580,7 @@ protocol_module_sslid::check_message_result protocol_module_sslid::set_parameter // already set timeout result.flag = false; result.message = "Cannot set multiple option '-T/--timeout'."; - putLogError(37013, result.message, __FILE__, __LINE__); + putLogError(300013, result.message, __FILE__, __LINE__); break; } } @@ -610,7 +611,7 @@ protocol_module_sslid::check_message_result protocol_module_sslid::set_parameter formatter.parse("'-M/--maxlist' option value '%s' is too large."); formatter % *itparam; result.message = formatter.str(); - putLogError(37014, result.message, __FILE__, __LINE__); + putLogError(300014, result.message, __FILE__, __LINE__); break; } else @@ -628,7 +629,7 @@ protocol_module_sslid::check_message_result protocol_module_sslid::set_parameter formatter.parse("'-M/--maxlist' option value '%s' is not numeric character."); formatter % *itparam; result.message = formatter.str(); - putLogError(37015, result.message, __FILE__, __LINE__); + putLogError(300015, result.message, __FILE__, __LINE__); break; } } @@ -643,7 +644,7 @@ protocol_module_sslid::check_message_result protocol_module_sslid::set_parameter // already set timeout result.flag = false; result.message = "Cannot set multiple option '-M/--maxlist'."; - putLogError(37016, result.message, __FILE__, __LINE__); + putLogError(300016, result.message, __FILE__, __LINE__); break; } } @@ -661,7 +662,7 @@ protocol_module_sslid::check_message_result protocol_module_sslid::set_parameter // already set no-reschedule flag result.flag = false; result.message = "You have to choose either of reschedule or no-reschedule."; - putLogError(37017, result.message, __FILE__, __LINE__); + putLogError(300017, result.message, __FILE__, __LINE__); break; } } @@ -679,7 +680,7 @@ protocol_module_sslid::check_message_result protocol_module_sslid::set_parameter // already set reshcedule flag result.flag = false; result.message = "You have to choose either of reschedule or no-reschedule."; - putLogError(37018, result.message, __FILE__, __LINE__); + putLogError(300018, result.message, __FILE__, __LINE__); break; } } @@ -688,7 +689,7 @@ protocol_module_sslid::check_message_result protocol_module_sslid::set_parameter // set check result flag false result.flag = false; result.message = "Option error."; - putLogError(37019, result.message, __FILE__, __LINE__); + putLogError(300019, result.message, __FILE__, __LINE__); break; } @@ -718,13 +719,13 @@ protocol_module_sslid::check_message_result protocol_module_sslid::set_parameter } /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("function : protocol_module_sslid::check_message_result " "protocol_module_sslid::set_parameter(const std::vector& args) : " "timeout = %d, maxlist = %d, reschedule = %d."); formatter % timeout % maxlist % reschedule; - putLogDebug(30015, formatter.str(), __FILE__, __LINE__); + putLogDebug(300015, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -733,26 +734,26 @@ protocol_module_sslid::check_message_result protocol_module_sslid::set_parameter data_addr = replication_pay_memory(get_name(), &data_size); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - putLogDebug(30016, "function : protocol_module_sslid::check_message_result protocol_module_sslid::" + putLogDebug(300016, "function : protocol_module_sslid::check_message_result protocol_module_sslid::" "set_parameter() : replication_pay_memory() end.", __FILE__, __LINE__); boost::format formatter("function : protocol_module_sslid::check_message_result protocol_module_sslid::" "set_parameter() : data_addr = &(%d), data_size = %d."); formatter % data_addr % data_size; - putLogDebug(30017, formatter.str(), __FILE__, __LINE__); + putLogDebug(300017, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ - if (data_addr == NULL || data_size <= 0) + if (unlikely(data_addr == NULL || data_size <= 0)) { // replication area is null - putLogError(37020, "Replication area is null.", __FILE__, __LINE__); + putLogError(300020, "Replication area is null.", __FILE__, __LINE__); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - putLogDebug(30018, "function : protocol_module_sslid::check_message_result " + putLogDebug(300018, "function : protocol_module_sslid::check_message_result " "protocol_module_sslid::set_parameter() : " "Replication area is null.", __FILE__, __LINE__); } @@ -773,29 +774,29 @@ protocol_module_sslid::check_message_result protocol_module_sslid::set_parameter putLogDebug ); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("new : address = &(%d), size = %lu."); formatter % static_cast(replication_data_processor) % sizeof(sslid_replication_data_processor); - putLogDebug(30019, formatter.str(), __FILE__, __LINE__); + putLogDebug(300019, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ replication_data_processor->register_replication_area_lock(replication_area_lock); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - putLogDebug(30020, "protocol_module_sslid::check_message_result protocol_module_sslid::" + putLogDebug(300020, "protocol_module_sslid::check_message_result protocol_module_sslid::" "set_parameter() : register_replication_area_lock() end.", __FILE__, __LINE__); } /*------DEBUG LOG END------*/ replication_data_processor->register_replication_area_unlock(replication_area_unlock); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - putLogDebug(30021, "protocol_module_sslid::check_message_result protocol_module_sslid::" + putLogDebug(300021, "protocol_module_sslid::check_message_result protocol_module_sslid::" "set_parameter() : register_replication_area_unlock() end.", __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -812,48 +813,48 @@ protocol_module_sslid::check_message_result protocol_module_sslid::set_parameter putLogDebug); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("new : address = &(%d), size = %lu."); formatter % static_cast(session_data_processor) % sizeof(sslid_session_data_processor); - putLogDebug(30022, formatter.str(), __FILE__, __LINE__); + putLogDebug(300022, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ // restore data from replication area sslid_replication_data* redata = replication_data_processor->get_replication_area(); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - putLogDebug(30023, "function : protocol_module_sslid::check_message_result protocol_module_sslid::" + putLogDebug(300023, "function : protocol_module_sslid::check_message_result protocol_module_sslid::" "set_parameter() : get_replication_area() end.", __FILE__, __LINE__); } /*------DEBUG LOG END------*/ replication_area_lock(); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - putLogDebug(30024, "function : protocol_module_sslid::check_message_result protocol_module_sslid::" + putLogDebug(300024, "function : protocol_module_sslid::check_message_result protocol_module_sslid::" "set_parameter() : replication_area_lock() end.", __FILE__, __LINE__); } /*------DEBUG LOG END------*/ session_data_processor->read_session_data_from_replication_area(redata); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - putLogDebug(30025, "function : protocol_module_sslid::check_message_result protocol_module_sslid::" + putLogDebug(300025, "function : protocol_module_sslid::check_message_result protocol_module_sslid::" "set_parameter() : read_session_data_from_replication_area() end.", __FILE__, __LINE__); } /*------DEBUG LOG END------*/ replication_area_unlock(); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - putLogDebug(30026, "function : protocol_module_sslid::check_message_result protocol_module_sslid::" + putLogDebug(300026, "function : protocol_module_sslid::check_message_result protocol_module_sslid::" "set_parameter() : replication_area_unlock() end.", __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -875,7 +876,7 @@ protocol_module_sslid::check_message_result protocol_module_sslid::set_parameter std::cerr << "protocol_module_sslid::set_parameter() : exception : Could not allocate memory." << std::endl; result.flag = false; result.message = "Could not allocate memory."; - putLogError(37021, result.message, __FILE__, __LINE__); + putLogError(300021, result.message, __FILE__, __LINE__); } catch (const std::exception& e) { @@ -896,7 +897,7 @@ protocol_module_sslid::check_message_result protocol_module_sslid::set_parameter boost::format formatter("function : protocol_module_sslid::check_message_result " "protocol_module_sslid::set_parameter() : exception : error = %s."); formatter % e.what(); - putLogError(37022, formatter.str(), __FILE__, __LINE__); + putLogError(300022, formatter.str(), __FILE__, __LINE__); } catch (...) { @@ -914,19 +915,19 @@ protocol_module_sslid::check_message_result protocol_module_sslid::set_parameter result.flag = false; std::cerr << "protocol_module_sslid::set_parameter() : Unknown exception." << std::endl; - putLogError(37023, "function : protocol_module_sslid::check_message_result protocol_module_sslid::" + putLogError(300023, "function : protocol_module_sslid::check_message_result protocol_module_sslid::" "set_parameter() : Unknown exception.", __FILE__, __LINE__); } /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("out_function : protocol_module_sslid::check_message_result " "protocol_module_sslid::set_parameter(" "const std::vector& args) : return_value = (" "check_message_result.flag = %d, check_message_result.message = %s)."); formatter % result.flag % result.message; - putLogDebug(30027, formatter.str(), __FILE__, __LINE__); + putLogDebug(300027, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -941,7 +942,7 @@ protocol_module_sslid::check_message_result protocol_module_sslid::add_parameter const std::vector& args) { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("in_function : protocol_module_sslid::check_message_result protocol_module_sslid::" "add_parameter(const std::vector& args) : args = %s."); @@ -951,7 +952,7 @@ protocol_module_sslid::check_message_result protocol_module_sslid::add_parameter argsdump += *it; } formatter % argsdump; - putLogDebug(30028, formatter.str(), __FILE__, __LINE__); + putLogDebug(300028, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -963,17 +964,17 @@ protocol_module_sslid::check_message_result protocol_module_sslid::add_parameter // option exist result.flag = false; result.message = "Cannot add option."; - putLogError(37024, result.message, __FILE__, __LINE__); + putLogError(300024, result.message, __FILE__, __LINE__); } /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("out_function : protocol_module_sslid::check_message_result " "protocol_module_sslid::add_parameter(const std::vector& args) : " "return_value = (check_message_result.flag = %d, check_message_result.message = %s)."); formatter % result.flag % result.message; - putLogDebug(30029, formatter.str(), __FILE__, __LINE__); + putLogDebug(300029, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -984,9 +985,9 @@ protocol_module_sslid::check_message_result protocol_module_sslid::add_parameter void protocol_module_sslid::handle_rslist_update() { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - putLogDebug(30030, "in/out_function : void protocol_module_sslid::handle_rslist_update().", + putLogDebug(300030, "in/out_function : void protocol_module_sslid::handle_rslist_update().", __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -997,9 +998,9 @@ void protocol_module_sslid::handle_rslist_update() void protocol_module_sslid::register_schedule(tcp_schedule_func_type inschedule) { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - putLogDebug(30031, "in_function : void protocol_module_sslid::register_schedule(" + putLogDebug(300031, "in_function : void protocol_module_sslid::register_schedule(" "tcp_schedule_func_type inschedule).", __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -1007,9 +1008,9 @@ void protocol_module_sslid::register_schedule(tcp_schedule_func_type inschedule) schedule_tcp = inschedule; /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - putLogDebug(30032, "out_function : void protocol_module_sslid::register_schedule(" + putLogDebug(300032, "out_function : void protocol_module_sslid::register_schedule(" "tcp_schedule_func_type inschedule).", __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -1020,9 +1021,9 @@ void protocol_module_sslid::register_schedule(tcp_schedule_func_type inschedule) void protocol_module_sslid::register_schedule(udp_schedule_func_type inschedule) { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - putLogDebug(30033, "in/out_function : void protocol_module_sslid::register_schedule(" + putLogDebug(300033, "in/out_function : void protocol_module_sslid::register_schedule(" "udp_schedule_func_type inschedule).", __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -1039,7 +1040,7 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_session_initialize const boost::asio::ip::udp::endpoint& client_endpoint_udp) { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("in_function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_session_initialize(const boost::thread::id up_thread_id, " @@ -1048,7 +1049,7 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_session_initialize "const boost::asio::ip::udp::endpoint& client_endpoint_udp) : " "up_thread_id = %d, down_thread_id = %d."); formatter % up_thread_id % down_thread_id; - putLogDebug(30034, formatter.str(), __FILE__, __LINE__); + putLogDebug(300034, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -1059,11 +1060,11 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_session_initialize thread_data_ptr threaddata_up(new session_thread_data_sslid); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("new : address = &(%d), size = %lu."); formatter % static_cast(threaddata_up.get()) % sizeof(session_thread_data_sslid); - putLogDebug(30035, formatter.str(), __FILE__, __LINE__); + putLogDebug(300035, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -1078,7 +1079,7 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_session_initialize threaddata_up->pair_thread_id = down_thread_id; /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { // data dump boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sslid::" @@ -1094,18 +1095,18 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_session_initialize % threaddata_up->end_flag % threaddata_up->thread_division % threaddata_up->pair_thread_id; - putLogDebug(30036, formatter.str(), __FILE__, __LINE__); + putLogDebug(300036, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ thread_data_ptr threaddata_down(new session_thread_data_sslid); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("new : address = &(%d), size = %lu."); formatter % static_cast(threaddata_down.get()) % sizeof(session_thread_data_sslid); - putLogDebug(30037, formatter.str(), __FILE__, __LINE__); + putLogDebug(300037, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -1119,7 +1120,7 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_session_initialize threaddata_down->pair_thread_id = up_thread_id; /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { // data_dump boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sslid::" @@ -1135,7 +1136,7 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_session_initialize % threaddata_down->end_flag % threaddata_down->thread_division % threaddata_down->pair_thread_id; - putLogDebug(30038, formatter.str(), __FILE__, __LINE__); + putLogDebug(300038, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -1151,7 +1152,7 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_session_initialize std::cerr << "protocol_module_sslid::handle_session_initialize() : exception : Could not allocate memory." << std::endl; boost::format formatter("Could not allocate memory. thread id : %d."); formatter % boost::this_thread::get_id(); - putLogError(37025, formatter.str(), __FILE__, __LINE__); + putLogError(300025, formatter.str(), __FILE__, __LINE__); status = FINALIZE; } @@ -1161,7 +1162,7 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_session_initialize boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_session_initialize() : exception : error = %s. thread id : %d."); formatter % e.what() % boost::this_thread::get_id(); - putLogError(37026, formatter.str(), __FILE__, __LINE__); + putLogError(300026, formatter.str(), __FILE__, __LINE__); status = FINALIZE; } @@ -1171,13 +1172,13 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_session_initialize boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_session_initialize() : Unknown exception. thread id : %d."); formatter % boost::this_thread::get_id(); - putLogError(37027, formatter.str(), __FILE__, __LINE__); + putLogError(300027, formatter.str(), __FILE__, __LINE__); status = FINALIZE; } /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_session_initialize(const boost::thread::id up_thread_id, " @@ -1186,7 +1187,7 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_session_initialize "const boost::asio::ip::udp::endpoint& client_endpoint_udp) : return_value = %d. " "thread id : %d."); formatter % status % boost::this_thread::get_id(); - putLogDebug(30039, formatter.str(), __FILE__, __LINE__); + putLogDebug(300039, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -1202,14 +1203,14 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_session_finalize( const boost::thread::id down_thread_id) { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("in_function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_session_finalize(const boost::thread::id up_thread_id, " "const boost::thread::id down_thread_id) : " "up_thread_id = %d, down_thread_id = %d."); formatter % up_thread_id % down_thread_id; - putLogDebug(30040, formatter.str(), __FILE__, __LINE__); + putLogDebug(300040, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -1220,28 +1221,28 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_session_finalize( session_thread_data_map_type::iterator itthread; itthread = session_thread_data_map.find(up_thread_id); - if (itthread != session_thread_data_map.end()) + if (likely(itthread != session_thread_data_map.end())) { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("delete : address = &(%d)."); formatter % static_cast(itthread->second.get()); - putLogDebug(30041, formatter.str(), __FILE__, __LINE__); + putLogDebug(300041, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ session_thread_data_map.erase(itthread); } itthread = session_thread_data_map.find(down_thread_id); - if (itthread != session_thread_data_map.end()) + if (likely(itthread != session_thread_data_map.end())) { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("delete : address = &(%d)."); formatter % static_cast(itthread->second.get()); - putLogDebug(30042, formatter.str(), __FILE__, __LINE__); + putLogDebug(300042, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ session_thread_data_map.erase(itthread); @@ -1253,7 +1254,7 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_session_finalize( boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_session_finalize() : exception : error = %s. thread id : %d."); formatter % e.what() % boost::this_thread::get_id(); - putLogError(37028, formatter.str(), __FILE__, __LINE__); + putLogError(300028, formatter.str(), __FILE__, __LINE__); } catch (...) { @@ -1261,17 +1262,17 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_session_finalize( boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_session_finalize() : Unknown exception. thread id : %d."); formatter % boost::this_thread::get_id(); - putLogError(37029, formatter.str(), __FILE__, __LINE__); + putLogError(300029, formatter.str(), __FILE__, __LINE__); } /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_session_finalize(const boost::thread::id up_thread_id, " "const boost::thread::id down_thread_id) : return_value = %d. thread id : %d."); formatter % STOP % boost::this_thread::get_id(); - putLogDebug(30043, formatter.str(), __FILE__, __LINE__); + putLogDebug(300043, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -1285,12 +1286,12 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_accept( const boost::thread::id thread_id) { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("in/out_function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_accept(const boost::thread::id thread_id) : thread_id = %d, return_value = %d."); formatter % thread_id % CLIENT_RECV; - putLogDebug(30044, formatter.str(), __FILE__, __LINE__); + putLogDebug(300044, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -1308,7 +1309,7 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_client_recv( const size_t recvlen) { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { size_t buffer_size = recvbuffer.size() < recvlen ? recvbuffer.size() : recvlen; std::string buffer; @@ -1318,7 +1319,7 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_client_recv( "const boost::array& recvbuffer, " "const size_t recvlen) : thread_id = %d, recvbuffer = %s, recvlen = %d."); formatter % thread_id % buffer % recvlen; - putLogDebug(30045, formatter.str(), __FILE__, __LINE__); + putLogDebug(300045, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -1333,7 +1334,7 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_client_recv( std::cerr << "protocol_module_sslid::handle_client_recv() : Data size bigger than buffer size." << std::endl; boost::format formatter("Data size bigger than buffer size. thread id : %d."); formatter % boost::this_thread::get_id(); - putLogError(37030, formatter.str(), __FILE__, __LINE__); + putLogError(300030, formatter.str(), __FILE__, __LINE__); throw -1; } @@ -1341,11 +1342,11 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_client_recv( { boost::mutex::scoped_lock sclock(session_thread_data_map_mutex); session_thread_data_map_type::iterator it = session_thread_data_map.find(thread_id); - if (it == session_thread_data_map.end() || it->second == NULL) + if (unlikely(it == session_thread_data_map.end() || it->second == NULL)) { boost::format formatter("Invalid thread id. thread id: % id."); formatter % boost::this_thread::get_id(); - putLogError(37031, formatter.str(), __FILE__, __LINE__); + putLogError(300031, formatter.str(), __FILE__, __LINE__); throw -1; } @@ -1369,7 +1370,7 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_client_recv( std::cerr << "protocol_module_sslid::handle_client_recv() : Data size bigger than buffer size." << std::endl; boost::format formatter("Data size bigger than buffer size. thread id : % id."); formatter % boost::this_thread::get_id(); - putLogError(37032, formatter.str(), __FILE__, __LINE__); + putLogError(300032, formatter.str(), __FILE__, __LINE__); threaddata->end_flag = END_FLAG_ON; throw -1; } @@ -1378,7 +1379,7 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_client_recv( { // data dump /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { std::string datadump; dump_memory(databuf+threaddata->data_begain_offset, threaddata->data_size, datadump); @@ -1387,7 +1388,7 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_client_recv( "handle_client_recv() : before memmove (data dump) : " "data begin = %d, data_size = %d, data = %s"); formatter % threaddata->data_begain_offset % threaddata->data_size % datadump; - putLogDebug(30046, formatter.str(), __FILE__, __LINE__); + putLogDebug(300046, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -1395,7 +1396,7 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_client_recv( memmove(databuf, databuf+threaddata->data_begain_offset, threaddata->data_size); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { std::string datadump; dump_memory(databuf, threaddata->data_size, datadump); @@ -1404,13 +1405,13 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_client_recv( "handle_client_recv() : after memmove (data dump) : " "data begin = 0, data_size = %d, data = %s"); formatter % threaddata->data_size % datadump; - putLogDebug(30047, formatter.str(), __FILE__, __LINE__); + putLogDebug(300047, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ } /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { std::string datadump; dump_memory(recvbuffer.data(), recvlen, datadump); @@ -1419,7 +1420,7 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_client_recv( "handle_client_recv() : before memcpy (data dump) : " "data begin = 0, data_size = %d, data = %s"); formatter % recvlen % datadump; - putLogDebug(30048, formatter.str(), __FILE__, __LINE__); + putLogDebug(300048, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -1431,7 +1432,7 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_client_recv( threaddata->data_begain_offset = 0; /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { std::string datadump; dump_memory(threaddata->data_buffer.data() + threaddata->data_size - recvlen, recvlen, datadump); @@ -1440,7 +1441,7 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_client_recv( "handle_client_recv() : after memcpy (data dump) : " "data begin = 0, data_size = %d, data = %s"); formatter % recvlen % datadump; - putLogDebug(30049, formatter.str(), __FILE__, __LINE__); + putLogDebug(300049, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -1455,12 +1456,12 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_client_recv( alllength, ishellomessage); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_client_recv() : check_ssl_record_sendable() end. thread id : %d."); formatter % boost::this_thread::get_id(); - putLogDebug(30050, formatter.str(), __FILE__, __LINE__); + putLogDebug(300050, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -1470,12 +1471,12 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_client_recv( threaddata->end_flag = END_FLAG_ON; status = FINALIZE; /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_client_recv() : END_FLAG_ON. thread id : %d."); formatter % boost::this_thread::get_id(); - putLogDebug(30051, formatter.str(), __FILE__, __LINE__); + putLogDebug(300051, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ } @@ -1503,12 +1504,12 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_client_recv( catch (int e) { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_client_recv() : catch exception e = %d. thread id : %d."); formatter % e % boost::this_thread::get_id(); - putLogDebug(30052, formatter.str(), __FILE__, __LINE__); + putLogDebug(300052, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ status = FINALIZE; @@ -1519,7 +1520,7 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_client_recv( boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_client_recv() : exception : error = %s. thread id : %d."); formatter % e.what() % boost::this_thread::get_id(); - putLogError(37033, formatter.str(), __FILE__, __LINE__); + putLogError(300033, formatter.str(), __FILE__, __LINE__); status = FINALIZE; } @@ -1530,20 +1531,20 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_client_recv( "protocol_module_sslid::handle_client_recv() " ": Unknown exception. thread id : %d"); formatter % boost::this_thread::get_id(); - putLogError(37034, formatter.str(), __FILE__, __LINE__); + putLogError(300034, formatter.str(), __FILE__, __LINE__); status = FINALIZE; } /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_client_recv(const boost::thread::id thread_id, " "const boost::array& recvbuffer, " "const size_t recvlen) : return_value = %d, end_flag = %d. thread id : %d."); formatter % status % (threaddata.get() ? threaddata->end_flag : END_FLAG_ON) % boost::this_thread::get_id(); - putLogDebug(30053, formatter.str(), __FILE__, __LINE__); + putLogDebug(300053, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -1559,42 +1560,43 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_realserver_select( boost::asio::ip::tcp::endpoint& rs_endpoint) { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("in_function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_realserver_select(const boost::thread::id thread_id, " "boost::asio::ip::tcp::endpoint& rs_endpoint) : " "thread_id = %d, rs_endpoint = [%s]:%d."); formatter % thread_id % rs_endpoint.address().to_string() % rs_endpoint.port(); - putLogDebug(30054, formatter.str(), __FILE__, __LINE__); + putLogDebug(300054, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ // find session_thread_data_sslid's pointer from map thread_data_ptr threaddata; EVENT_TAG status = FINALIZE; + realserverlist_type::iterator rs_list_itr; try { { boost::mutex::scoped_lock sclock(session_thread_data_map_mutex); session_thread_data_map_type::iterator it = session_thread_data_map.find(thread_id); - if (it == session_thread_data_map.end() || it->second == NULL) + if (unlikely(it == session_thread_data_map.end() || it->second == NULL)) { boost::format formatter("Invalid thread id. thread id : %d."); formatter % boost::this_thread::get_id(); - putLogError(37035, formatter.str(), __FILE__, __LINE__); + putLogError(300035, formatter.str(), __FILE__, __LINE__); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_realserver_select(const boost::thread::id thread_id, " "boost::asio::ip::tcp::endpoint& rs_endpoint) : return_value = %d. thread id : %d."); formatter % FINALIZE % boost::this_thread::get_id(); - putLogDebug(30055, formatter.str(), __FILE__, __LINE__); + putLogDebug(300055, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ - putLogInfo(35000, "Realserver decision failure. ", __FILE__, __LINE__); + putLogInfo(300000, "Realserver decision failure. ", __FILE__, __LINE__); return FINALIZE; } @@ -1608,12 +1610,12 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_realserver_select( if (realserver_selected(threaddata->selected_realserver)) { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_realserver_select() end. thread id : %d."); formatter % boost::this_thread::get_id(); - putLogDebug(30056, formatter.str(), __FILE__, __LINE__); + putLogDebug(300056, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -1624,12 +1626,12 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_realserver_select( else { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_realserver_select() end. thread id : %d."); formatter % boost::this_thread::get_id(); - putLogDebug(30057, formatter.str(), __FILE__, __LINE__); + putLogDebug(300057, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -1640,12 +1642,12 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_realserver_select( threaddata->end_flag = END_FLAG_ON; status = FINALIZE; /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_realserver_select() : END_FLAG_ON. thread id : %d."); formatter % boost::this_thread::get_id(); - putLogDebug(30058, formatter.str(), __FILE__, __LINE__); + putLogDebug(300058, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ } @@ -1657,7 +1659,7 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_realserver_select( threaddata->data_size, session_id) == -1) { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("out_function : protocol_module_base::EVENT_TAG " "protocol_module_sslid::handle_realserver_select(" @@ -1665,18 +1667,18 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_realserver_select( "ip::tcp::endpoint& rs_endpoint) : return_value = %d. " "thread id : % id."); formatter % FINALIZE % boost::this_thread::get_id(); - putLogDebug(30059, formatter.str(), __FILE__, __LINE__); + putLogDebug(300059, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ - putLogInfo(35001, "Realserver decision failure.", __FILE__, __LINE__); + putLogInfo(300001, "Realserver decision failure.", __FILE__, __LINE__); threaddata->end_flag = END_FLAG_ON; return FINALIZE; } /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { std::string buffer; dump_session_id(session_id.c_str(), session_id.size(), buffer); @@ -1684,7 +1686,7 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_realserver_select( "handle_realserver_select() : get_ssl_session_id() session_id = %s end. " "thread id : %d."); formatter % buffer % boost::this_thread::get_id(); - putLogDebug(30060, formatter.str(), __FILE__, __LINE__); + putLogDebug(300060, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -1709,13 +1711,13 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_realserver_select( threaddata->end_flag = END_FLAG_ON; status = CLIENT_DISCONNECT; /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("function : protocol_module_base::EVENT_TAG " "protocol_module_sslid::handle_realserver_select() : " "END_FLAG_ON. thread id : %d."); formatter % boost::this_thread::get_id(); - putLogDebug(30061, formatter.str(), __FILE__, __LINE__); + putLogDebug(300061, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ } @@ -1728,21 +1730,93 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_realserver_select( session_id, threaddata->selected_realserver); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("function : protocol_module_base::EVENT_TAG " "protocol_module_sslid::handle_realserver_select() : " "get_endpoint_from_session_data() end. thread id : %d."); formatter % boost::this_thread::get_id(); - putLogDebug(30062, formatter.str(), __FILE__, __LINE__); + putLogDebug(300062, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ if (ret == 0) { - // get the endpoint successfully - rs_endpoint = threaddata->selected_realserver; - status = REALSERVER_CONNECT; + //find the rs_endpoint in the rs_list + rs_list_lock(); + + rs_list_itr = rs_list_begin(); + int is_match = 0; + + while (rs_list_itr != rs_list_end()) + { + if (rs_list_itr->tcp_endpoint == threaddata->selected_realserver) + { + is_match = 1; + break; + } + + rs_list_itr = rs_list_next(rs_list_itr); + } + + if (is_match) + { + // get the endpoint successfully + rs_endpoint = threaddata->selected_realserver; + status = REALSERVER_CONNECT; + } + else + { + // failed to get the endpoint + if (reschedule == 1) + { + // reschedule mode + boost::asio::ip::tcp::endpoint temp_endpoint; + boost::asio::ip::tcp::endpoint comp_endpoint; // for compare the endpoint + schedule_tcp(thread_id, rs_list_begin, rs_list_end, rs_list_next, temp_endpoint); + if (temp_endpoint != comp_endpoint) + { + // get the endpoint by reschedule successfully + threaddata->selected_realserver = temp_endpoint; + rs_endpoint = temp_endpoint; + status = REALSERVER_CONNECT; + } + else + { + // failed to get the endpoint by reschedule + // set end_flag ON, and set the status CLIENT_DISCONNECT + threaddata->end_flag = END_FLAG_ON; + status = CLIENT_DISCONNECT; + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG " + "protocol_module_sslid::handle_realserver_select() : " + "END_FLAG_ON. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogDebug(300063, formatter.str(), __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + } + } + else + { + // no reschedule mode + // set end_flag ON and disconnect the client + threaddata->end_flag = END_FLAG_ON; + status = CLIENT_DISCONNECT; + /*-------- DEBUG LOG --------*/ + if (unlikely(LOG_LV_DEBUG == getloglevel())) + { + boost::format formatter("function : protocol_module_base::EVENT_TAG " + "protocol_module_sslid::handle_realserver_select() " + ": END_FLAG_ON. thread id : %d."); + formatter % boost::this_thread::get_id(); + putLogDebug(300064, formatter.str(), __FILE__, __LINE__); + } + /*------DEBUG LOG END------*/ + } + } } else { @@ -1767,13 +1841,13 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_realserver_select( threaddata->end_flag = END_FLAG_ON; status = CLIENT_DISCONNECT; /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("function : protocol_module_base::EVENT_TAG " "protocol_module_sslid::handle_realserver_select() : " "END_FLAG_ON. thread id : %d."); formatter % boost::this_thread::get_id(); - putLogDebug(30063, formatter.str(), __FILE__, __LINE__); + putLogDebug(300065, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ } @@ -1785,13 +1859,13 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_realserver_select( threaddata->end_flag = END_FLAG_ON; status = CLIENT_DISCONNECT; /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("function : protocol_module_base::EVENT_TAG " "protocol_module_sslid::handle_realserver_select() " ": END_FLAG_ON. thread id : %d."); formatter % boost::this_thread::get_id(); - putLogDebug(30064, formatter.str(), __FILE__, __LINE__); + putLogDebug(300066, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ } @@ -1823,12 +1897,12 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_realserver_select( threaddata->end_flag = END_FLAG_ON; status = CLIENT_DISCONNECT; /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_realserver_select() : END_FLAG_ON. thread id : %d."); formatter % boost::this_thread::get_id(); - putLogDebug(30065, formatter.str(), __FILE__, __LINE__); + putLogDebug(300067, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ } @@ -1840,12 +1914,12 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_realserver_select( threaddata->end_flag = END_FLAG_ON; status = CLIENT_DISCONNECT; /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_realserver_select() : END_FLAG_ON. thread id : %d."); formatter % boost::this_thread::get_id(); - putLogDebug(30066, formatter.str(), __FILE__, __LINE__); + putLogDebug(300068, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ } @@ -1857,12 +1931,12 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_realserver_select( threaddata->end_flag = END_FLAG_ON; status = CLIENT_DISCONNECT; /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_realserver_select() : END_FLAG_ON. thread id : %d."); formatter % boost::this_thread::get_id(); - putLogDebug(30067, formatter.str(), __FILE__, __LINE__); + putLogDebug(300069, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ } @@ -1873,9 +1947,9 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_realserver_select( boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_realserver_select() : exception : error = %s. thread id : %d."); formatter % e.what() % boost::this_thread::get_id(); - putLogError(37036, formatter.str(), __FILE__, __LINE__); + putLogError(300036, formatter.str(), __FILE__, __LINE__); - putLogInfo(35002, "Realserver decision failure.", __FILE__, __LINE__); + putLogInfo(300002, "Realserver decision failure.", __FILE__, __LINE__); status = FINALIZE; } @@ -1885,15 +1959,15 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_realserver_select( boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_realserver_select() : Unknown exception. thread id : %d."); formatter % boost::this_thread::get_id(); - putLogError(37037, formatter.str(), __FILE__, __LINE__); + putLogError(300037, formatter.str(), __FILE__, __LINE__); - putLogInfo(35003, "Realserver decision failure.", __FILE__, __LINE__); + putLogInfo(300003, "Realserver decision failure.", __FILE__, __LINE__); status = FINALIZE; } /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_realserver_select(const boost::thread::id thread_id, " @@ -1901,7 +1975,7 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_realserver_select( "end_flag = %d, rs_endpoint = [%s]:%d. thread id : %d."); formatter % status % (threaddata.get() ? threaddata->end_flag : END_FLAG_ON) % rs_endpoint.address().to_string() % rs_endpoint.port() % boost::this_thread::get_id(); - putLogDebug(30068, formatter.str(), __FILE__, __LINE__); + putLogDebug(300070, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -1921,7 +1995,7 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_realserver_select( size_t& datalen) { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("in/out_function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_realserver_select(const boost::thread::id thread_id, " @@ -1929,7 +2003,7 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_realserver_select( "boost::array& sendbuffer, size_t& datalen) : " "return_value = %d. thread id : %d."); formatter % STOP % boost::this_thread::get_id(); - putLogDebug(30069, formatter.str(), __FILE__, __LINE__); + putLogDebug(300071, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ return STOP; @@ -1946,14 +2020,14 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_realserver_connect size_t& datalen) { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("in_function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_realserver_connect(const boost::thread::id thread_id, " "boost::array& sendbuffer, size_t& datalen) : " "thread_id = %d."); formatter % thread_id; - putLogDebug(30070, formatter.str(), __FILE__, __LINE__); + putLogDebug(300072, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -1971,11 +2045,11 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_realserver_connect boost::mutex::scoped_lock sclock(session_thread_data_map_mutex); session_thread_data_map_type::iterator it = session_thread_data_map.find(thread_id); - if (it == session_thread_data_map.end()) + if (unlikely(it == session_thread_data_map.end())) { boost::format formatter("Invalid thread id. thread id : %d."); formatter % boost::this_thread::get_id(); - putLogError(37038, formatter.str(), __FILE__, __LINE__); + putLogError(300038, formatter.str(), __FILE__, __LINE__); status = FINALIZE; } else @@ -1990,7 +2064,7 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_realserver_connect boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_realserver_connect() exception : error = %s. thread id : %d."); formatter % e.what() % boost::this_thread::get_id(); - putLogError(37039, formatter.str(), __FILE__, __LINE__); + putLogError(300039, formatter.str(), __FILE__, __LINE__); status = FINALIZE; } catch (...) @@ -1999,20 +2073,20 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_realserver_connect boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_realserver_connect() : Unknown exception. thread id : %d."); formatter % boost::this_thread::get_id(); - putLogError(37040, formatter.str(), __FILE__, __LINE__); + putLogError(300040, formatter.str(), __FILE__, __LINE__); status = FINALIZE; } /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_realserver_connect(const boost::thread::id thread_id, " "boost::array& sendbuffer, size_t& datalen) : " "return_value = %d. thread id : %d."); formatter % status % boost::this_thread::get_id(); - putLogDebug(30071, formatter.str(), __FILE__, __LINE__); + putLogDebug(300073, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -2028,14 +2102,14 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_realserver_connect const boost::asio::ip::tcp::endpoint& rs_endpoint) { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("in_function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_realserver_connection_fail(const boost::thread::id thread_id, " "const boost::asio::ip::tcp::endpoint& rs_endpoint) : " "thread_id = %d, rs_endpoint = [%s]:%d."); formatter % thread_id % rs_endpoint.address().to_string() % rs_endpoint.port(); - putLogDebug(30072, formatter.str(), __FILE__, __LINE__); + putLogDebug(300074, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -2048,20 +2122,20 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_realserver_connect { boost::mutex::scoped_lock sclock(session_thread_data_map_mutex); session_thread_data_map_type::iterator it = session_thread_data_map.find(thread_id); - if (it == session_thread_data_map.end() || it->second == NULL) + if (unlikely(it == session_thread_data_map.end() || it->second == NULL)) { boost::format formatter("Invalid thread id. thread id : %d."); formatter % boost::this_thread::get_id(); - putLogError(37041, formatter.str(), __FILE__, __LINE__); + putLogError(300041, formatter.str(), __FILE__, __LINE__); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_realserver_connection_fail(const boost::thread::id thread_id, " "const boost::asio::ip::tcp::endpoint& rs_endpoint) : return_value = %d. " "thread id : %d."); formatter % FINALIZE % boost::this_thread::get_id(); - putLogDebug(30073, formatter.str(), __FILE__, __LINE__); + putLogDebug(300075, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ return FINALIZE; @@ -2084,12 +2158,12 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_realserver_connect status = CLIENT_DISCONNECT; /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_realserver_connection_fail() : END_FLAG_ON. thread id : %d."); formatter % boost::this_thread::get_id(); - putLogDebug(30074, formatter.str(), __FILE__, __LINE__); + putLogDebug(300076, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ } @@ -2100,7 +2174,7 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_realserver_connect boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_realserver_connection_fail() : exception : error = %s. thread id : %d."); formatter % e.what() % boost::this_thread::get_id(); - putLogError(37042, formatter.str(), __FILE__, __LINE__); + putLogError(300042, formatter.str(), __FILE__, __LINE__); status = FINALIZE; } @@ -2110,20 +2184,20 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_realserver_connect boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_realserver_connection_fail() : Unknown exception. thread id : %d."); formatter % boost::this_thread::get_id(); - putLogError(37043, formatter.str(), __FILE__, __LINE__); + putLogError(300043, formatter.str(), __FILE__, __LINE__); status = FINALIZE; } /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_realserver_connection_fail(const boost::thread::id thread_id, " "const boost::asio::ip::tcp::endpoint& rs_endpoint) : " "return_value = %d, end_flag = %d. thread id : %d."); formatter % status % (threaddata.get() ? threaddata->end_flag : END_FLAG_ON) % boost::this_thread::get_id(); - putLogDebug(30075, formatter.str(), __FILE__, __LINE__); + putLogDebug(300077, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -2137,12 +2211,12 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_realserver_send( const boost::thread::id thread_id) { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("in_function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_realserver_send(const boost::thread::id thread_id) : thread_id = %d."); formatter % thread_id; - putLogDebug(30076, formatter.str(), __FILE__, __LINE__); + putLogDebug(300078, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -2155,19 +2229,19 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_realserver_send( { boost::mutex::scoped_lock sclock(session_thread_data_map_mutex); session_thread_data_map_type::iterator it = session_thread_data_map.find(thread_id); - if (it == session_thread_data_map.end() || it->second == NULL) + if (unlikely(it == session_thread_data_map.end() || it->second == NULL)) { boost::format formatter("Invalid thread id. thread id : %d."); formatter % boost::this_thread::get_id(); - putLogError(37044, formatter.str(), __FILE__, __LINE__); + putLogError(300044, formatter.str(), __FILE__, __LINE__); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_realserver_send(const boost::thread::id thread_id) : " "return_value = %d. thread id : %d."); formatter % FINALIZE % boost::this_thread::get_id(); - putLogDebug(30077, formatter.str(), __FILE__, __LINE__); + putLogDebug(300079, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -2196,12 +2270,12 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_realserver_send( alllength, ishellomessage); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_realserver_send() : check_ssl_record_sendable() end. thread id : %d."); formatter % boost::this_thread::get_id(); - putLogDebug(30078, formatter.str(), __FILE__, __LINE__); + putLogDebug(300080, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -2211,12 +2285,12 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_realserver_send( threaddata->end_flag = END_FLAG_ON; status = FINALIZE; /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_realserver_send() : END_FLAG_ON. thread id : %d."); formatter % boost::this_thread::get_id(); - putLogDebug(30079, formatter.str(), __FILE__, __LINE__); + putLogDebug(300081, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ } @@ -2246,7 +2320,7 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_realserver_send( boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_realserver_send() : exception : error = %s. thread id : %d."); formatter % e.what() % boost::this_thread::get_id(); - putLogError(37045, formatter.str(), __FILE__, __LINE__); + putLogError(300045, formatter.str(), __FILE__, __LINE__); status = FINALIZE; } @@ -2256,19 +2330,19 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_realserver_send( boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_realserver_send() : Unknown exception. thread id : %d."); formatter % boost::this_thread::get_id(); - putLogError(37046, formatter.str(), __FILE__, __LINE__); + putLogError(300046, formatter.str(), __FILE__, __LINE__); status = FINALIZE; } /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_realserver_send(const boost::thread::id thread_id) : " "return_value = %d, end_flag = %d. thread id : %d."); formatter % status % (threaddata.get() ? threaddata->end_flag : END_FLAG_ON) % boost::this_thread::get_id(); - putLogDebug(30080, formatter.str(), __FILE__, __LINE__); + putLogDebug(300082, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -2284,13 +2358,13 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_sorryserver_select boost::asio::ip::tcp::endpoint& sorry_endpoint) { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("in/out_function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_sorryserver_select(const boost::thread::id thread_id, " "boost::asio::ip::tcp::endpoint& sorry_endpoint) : return_value = %d. thread id : %d."); formatter % STOP % boost::this_thread::get_id(); - putLogDebug(30081, formatter.str(), __FILE__, __LINE__); + putLogDebug(300083, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -2308,14 +2382,14 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_sorryserver_connec size_t& datalen) { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("in/out_function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_sorryserver_connect(const boost::thread::id thread_id, " "boost::array& sendbuffer, size_t& datalen) : " "return_value = %d. thread id : %d."); formatter % STOP % boost::this_thread::get_id(); - putLogDebug(30082, formatter.str(), __FILE__, __LINE__); + putLogDebug(300084, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -2331,14 +2405,14 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_sorryserver_connec const boost::asio::ip::tcp::endpoint& sorry_endpoint) { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("in/out_function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_sorryserver_connection_fail(const boost::thread::id thread_id, " "const boost::asio::ip::tcp::endpoint& sorry_endpoint) : return_value = %d. " "thread id : %d."); formatter % STOP % boost::this_thread::get_id(); - putLogDebug(30083, formatter.str(), __FILE__, __LINE__); + putLogDebug(300085, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -2352,13 +2426,13 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_sorryserver_send( const boost::thread::id thread_id) { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("in/out_function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_sorryserver_send(const boost::thread::id thread_id) : return_value = %d." "thread id : %d."); formatter % STOP % boost::this_thread::get_id(); - putLogDebug(30084, formatter.str(), __FILE__, __LINE__); + putLogDebug(300086, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -2378,7 +2452,7 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_realserver_recv( const size_t recvlen) { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { size_t buffer_size = recvbuffer.size() < recvlen ? recvbuffer.size() : recvlen; std::string buffer; @@ -2391,7 +2465,7 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_realserver_recv( "recvbuffer = %s, recvlen = %d."); formatter % thread_id % rs_endpoint.address().to_string() % rs_endpoint.port() % buffer % recvlen; - putLogDebug(30085, formatter.str(), __FILE__, __LINE__); + putLogDebug(300087, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -2401,9 +2475,9 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_realserver_recv( std::cerr << "protocol_module_sslid::handle_realserver_recv() : Data size bigger than buffer size." << std::endl; boost::format formatter("Data size bigger than buffer size. thread id : %d."); formatter % boost::this_thread::get_id(); - putLogError(37047, formatter.str(), __FILE__, __LINE__); + putLogError(300047, formatter.str(), __FILE__, __LINE__); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_realserver_recv(const boost::thread::id thread_id, " @@ -2411,7 +2485,7 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_realserver_recv( "const boost::array& recvbuffer, " "const size_t recvlen) : return_value = %d. thread id : %d."); formatter % FINALIZE % boost::this_thread::get_id(); - putLogDebug(30086, formatter.str(), __FILE__, __LINE__); + putLogDebug(300088, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -2431,9 +2505,9 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_realserver_recv( { boost::format formatter("Invalid thread id. thread id : %d."); formatter % boost::this_thread::get_id(); - putLogError(37048, formatter.str(), __FILE__, __LINE__); + putLogError(300048, formatter.str(), __FILE__, __LINE__); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_realserver_recv(const boost::thread::id thread_id, " @@ -2441,7 +2515,7 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_realserver_recv( "const boost::array& recvbuffer, " "const size_t recvlen) : return_value = %d. thread id : %d."); formatter % FINALIZE % boost::this_thread::get_id(); - putLogDebug(30087, formatter.str(), __FILE__, __LINE__); + putLogDebug(300089, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -2461,10 +2535,10 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_realserver_recv( std::cerr << "protocol_module_sslid::handle_realserver_recv() : Data size bigger than buffer size." << std::endl; boost::format formatter("Data size bigger than buffer size. thread id : %d."); formatter % boost::this_thread::get_id(); - putLogError(37049, formatter.str(), __FILE__, __LINE__); + putLogError(300049, formatter.str(), __FILE__, __LINE__); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_realserver_recv(const boost::thread::id thread_id, " @@ -2472,7 +2546,7 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_realserver_recv( "const boost::array& recvbuffer, " "const size_t recvlen) : return_value = %d. thread id : %d."); formatter % FINALIZE % boost::this_thread::get_id(); - putLogDebug(30088, formatter.str(), __FILE__, __LINE__); + putLogDebug(300090, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -2484,7 +2558,7 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_realserver_recv( { // data dump /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { std::string datadump; dump_memory(databuf+threaddata->data_begain_offset, threaddata->data_size, datadump); @@ -2493,7 +2567,7 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_realserver_recv( "handle_realserver_recv() : before memmove (data dump) : " "data begin = %d, data_size = %d, data = %s"); formatter % threaddata->data_begain_offset % threaddata->data_size % datadump; - putLogDebug(30089, formatter.str(), __FILE__, __LINE__); + putLogDebug(300091, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -2501,7 +2575,7 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_realserver_recv( memmove(databuf, databuf+threaddata->data_begain_offset, threaddata->data_size); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { std::string datadump; dump_memory(databuf, threaddata->data_size, datadump); @@ -2510,13 +2584,13 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_realserver_recv( "handle_realserver_recv() : after memmove (data dump) : " "data begin = 0, data_size = %d, data = %s"); formatter % threaddata->data_size % datadump; - putLogDebug(30090, formatter.str(), __FILE__, __LINE__); + putLogDebug(300092, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ } /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { std::string datadump; dump_memory(recvbuffer.data(), recvlen, datadump); @@ -2525,7 +2599,7 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_realserver_recv( "handle_realserver_recv() : before memcpy (data dump) : " "data begin = 0, data_size = %d, data = %s"); formatter % recvlen % datadump; - putLogDebug(30091, formatter.str(), __FILE__, __LINE__); + putLogDebug(300093, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -2537,7 +2611,7 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_realserver_recv( threaddata->data_begain_offset = 0; /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { std::string datadump; dump_memory(databuf + threaddata->data_size - recvlen, recvlen, datadump); @@ -2546,7 +2620,7 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_realserver_recv( "handle_realserver_recv() : after memcpy (data dump) : " "data begin = 0, data_size = %d, data = %s"); formatter % recvlen % datadump; - putLogDebug(30092, formatter.str(), __FILE__, __LINE__); + putLogDebug(300094, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -2561,12 +2635,12 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_realserver_recv( alllength, ishellomessage); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_realserver_recv() : check_ssl_record_sendable() END. thread id : %d."); formatter % boost::this_thread::get_id(); - putLogDebug(30093, formatter.str(), __FILE__, __LINE__); + putLogDebug(300095, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -2576,12 +2650,12 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_realserver_recv( threaddata->end_flag = END_FLAG_ON; status = FINALIZE; /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_realserver_recv() : END_FLAG_ON. thread id : %d."); formatter % boost::this_thread::get_id(); - putLogDebug(30094, formatter.str(), __FILE__, __LINE__); + putLogDebug(300096, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ } @@ -2610,7 +2684,7 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_realserver_recv( boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_realserver_recv() : exception : error = %s. thread id : %d."); formatter % e.what() % boost::this_thread::get_id(); - putLogError(37050, formatter.str(), __FILE__, __LINE__); + putLogError(300050, formatter.str(), __FILE__, __LINE__); status = FINALIZE; } @@ -2620,13 +2694,13 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_realserver_recv( boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_realserver_recv() : Unknown exception. thread id : %d."); formatter % boost::this_thread::get_id(); - putLogError(37051, formatter.str(), __FILE__, __LINE__); + putLogError(300051, formatter.str(), __FILE__, __LINE__); status = FINALIZE; } /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_realserver_recv(const boost::thread::id thread_id, " @@ -2634,7 +2708,7 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_realserver_recv( "const boost::array& recvbuffer, " "const size_t recvlen) : return_value = %d, end_flag = %d. thread id : %d."); formatter % status % (threaddata.get() ? threaddata->end_flag : END_FLAG_ON) % boost::this_thread::get_id(); - putLogDebug(30095, formatter.str(), __FILE__, __LINE__); + putLogDebug(300097, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -2654,7 +2728,7 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_realserver_recv( const size_t recvlen) { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("in/out_function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_realserver_recv(const boost::thread::id thread_id, " @@ -2662,7 +2736,7 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_realserver_recv( "const boost::array& recvbuffer, " "const size_t recvlen) : return_value = %d. thread id : %d."); formatter % STOP % boost::this_thread::get_id(); - putLogDebug(30096, formatter.str(), __FILE__, __LINE__); + putLogDebug(300098, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -2682,7 +2756,7 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_sorryserver_recv( const size_t recvlen) { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("in/out_function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_sorryserver_recv(const boost::thread::id thread_id, " @@ -2690,7 +2764,7 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_sorryserver_recv( "const boost::array& recvbuffer, " "const size_t recvlen) : return_value = %d. thread id : %d."); formatter % STOP % boost::this_thread::get_id(); - putLogDebug(30097, formatter.str(), __FILE__, __LINE__); + putLogDebug(300099, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -2704,13 +2778,13 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_response_send_info const boost::thread::id thread_id) { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("in/out_function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_response_send_inform(const boost::thread::id thread_id) : return_value = %d. " "thread id : %d."); formatter % STOP % boost::this_thread::get_id(); - putLogDebug(30098, formatter.str(), __FILE__, __LINE__); + putLogDebug(300100, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -2728,14 +2802,14 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_client_connection_ size_t& datalen) { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("in_function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_client_connection_check(const boost::thread::id thread_id, " "boost::array& sendbuffer, " "size_t& datalen) : thread_id = %d."); formatter % thread_id; - putLogDebug(30099, formatter.str(), __FILE__, __LINE__); + putLogDebug(300101, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -2748,21 +2822,21 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_client_connection_ { boost::mutex::scoped_lock sclock(session_thread_data_map_mutex); session_thread_data_map_type::iterator it = session_thread_data_map.find(thread_id); - if (it == session_thread_data_map.end() || it->second == NULL) + if (unlikely(it == session_thread_data_map.end() || it->second == NULL)) { boost::format formatter("Invalid thread id. thread id : %d."); formatter % boost::this_thread::get_id(); - putLogError(37052, formatter.str(), __FILE__, __LINE__); + putLogError(300052, formatter.str(), __FILE__, __LINE__); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_client_connection_check(const boost::thread::id thread_id, " "boost::array& sendbuffer, " "size_t& datalen) : return_value = %d. thread id : %d."); formatter % FINALIZE % boost::this_thread::get_id(); - putLogDebug(30100, formatter.str(), __FILE__, __LINE__); + putLogDebug(300102, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -2783,7 +2857,7 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_client_connection_ threaddata->data_size, session_id) == -1) { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("out_function : protocol_module_base::EVENT_TAG " "protocol_module_sslid::handle_client_connection_check(" @@ -2791,7 +2865,7 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_client_connection_ "boost::array& sendbuffer, " "size_t& datalen) : return_value = %d. thread id : %d."); formatter % FINALIZE % boost::this_thread::get_id(); - putLogDebug(30101, formatter.str(), __FILE__, __LINE__); + putLogDebug(300103, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -2800,12 +2874,12 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_client_connection_ } /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_client_connection_check() : get_ssl_session_id() end. thread id : %d."); formatter % boost::this_thread::get_id(); - putLogDebug(30102, formatter.str(), __FILE__, __LINE__); + putLogDebug(300104, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -2819,7 +2893,7 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_client_connection_ now); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { std::string buffer; dump_session_id(session_id.c_str(), session_id.size(), buffer); @@ -2827,7 +2901,7 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_client_connection_ "handle_client_connection_check() : write_session_data() end." "session_id = %s. thread id : %d."); formatter % buffer % boost::this_thread::get_id(); - putLogDebug(30103, formatter.str(), __FILE__, __LINE__); + putLogDebug(300105, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ } @@ -2846,12 +2920,12 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_client_connection_ } /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_client_connection_check() : put_data_to_sendbuffer() end. thread id : %d."); formatter % boost::this_thread::get_id(); - putLogDebug(30104, formatter.str(), __FILE__, __LINE__); + putLogDebug(300106, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ } @@ -2861,7 +2935,7 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_client_connection_ boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_client_connection_check() : exception : error = %s. thread id : %d."); formatter % e.what() % boost::this_thread::get_id(); - putLogError(37053, formatter.str(), __FILE__, __LINE__); + putLogError(300053, formatter.str(), __FILE__, __LINE__); status = FINALIZE; } @@ -2871,20 +2945,20 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_client_connection_ boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_client_connection_check() : Unknown exception. thread id : %d."); formatter % boost::this_thread::get_id(); - putLogError(37054, formatter.str(), __FILE__, __LINE__); + putLogError(300054, formatter.str(), __FILE__, __LINE__); status = FINALIZE; } /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_client_connection_check(const boost::thread::id thread_id, " "boost::array& sendbuffer, size_t& datalen) : " "return_value = %d. thread id : %d."); formatter % status % boost::this_thread::get_id(); - putLogDebug(30105, formatter.str(), __FILE__, __LINE__); + putLogDebug(300107, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -2904,7 +2978,7 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_client_select( size_t& datalen) { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("in/out_function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_client_select(const boost::thread::id thread_id, " @@ -2912,7 +2986,7 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_client_select( "boost::array& sendbuffer, " "size_t& datalen) : return_value = %d. thread id : %d."); formatter % STOP % boost::this_thread::get_id(); - putLogDebug(30106, formatter.str(), __FILE__, __LINE__); + putLogDebug(300108, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -2927,12 +3001,12 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_client_send( const boost::thread::id thread_id) { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("in_function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_client_send(const boost::thread::id thread_id) : thread_id = %d."); formatter % thread_id; - putLogDebug(30107, formatter.str(), __FILE__, __LINE__); + putLogDebug(300109, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -2945,18 +3019,18 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_client_send( { boost::mutex::scoped_lock sclock(session_thread_data_map_mutex); session_thread_data_map_type::iterator it = session_thread_data_map.find(thread_id); - if (it == session_thread_data_map.end() || it->second == NULL) + if (unlikely(it == session_thread_data_map.end() || it->second == NULL)) { boost::format formatter("Invalid thread id. thread id : %d."); formatter % boost::this_thread::get_id(); - putLogError(37055, formatter.str(), __FILE__, __LINE__); + putLogError(300055, formatter.str(), __FILE__, __LINE__); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_client_send(const boost::thread::id thread_id) : return_value = %d. thread id : %d."); formatter % FINALIZE % boost::this_thread::get_id(); - putLogDebug(30108, formatter.str(), __FILE__, __LINE__); + putLogDebug(300110, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -2969,12 +3043,12 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_client_send( if (threaddata->data_size <= 0) { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_client_send() : data_size = %d, end_flag = %d. thread id : %d."); formatter % threaddata->data_size % threaddata->end_flag % boost::this_thread::get_id(); - putLogDebug(30109, formatter.str(), __FILE__, __LINE__); + putLogDebug(300111, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -2993,12 +3067,12 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_client_send( else { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_client_send() : data_size = %d, current_record_rest_size = %d. thread id : %d."); formatter % threaddata->data_size % threaddata->current_record_rest_size % boost::this_thread::get_id(); - putLogDebug(30110, formatter.str(), __FILE__, __LINE__); + putLogDebug(300112, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -3014,13 +3088,13 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_client_send( alllength, ishellomessage); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_client_send() : check_ssl_record_sendable() end. " "return_value = %d. thread id : %d."); formatter % ret % boost::this_thread::get_id(); - putLogDebug(30111, formatter.str(), __FILE__, __LINE__); + putLogDebug(300113, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -3029,12 +3103,12 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_client_send( // anomaly, set the end_flag ON threaddata->end_flag = END_FLAG_ON; /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_client_send() : END_FLAG_ON. thread id : %d."); formatter % boost::this_thread::get_id(); - putLogDebug(30112, formatter.str(), __FILE__, __LINE__); + putLogDebug(300114, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -3076,7 +3150,7 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_client_send( boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_client_send() : exception : error = %s. thread id : %d."); formatter % e.what() % boost::this_thread::get_id(); - putLogError(37056, formatter.str(), __FILE__, __LINE__); + putLogError(300056, formatter.str(), __FILE__, __LINE__); status = FINALIZE; } @@ -3086,19 +3160,19 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_client_send( boost::format formatter("function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_client_send() : Unknown exception. thread id : %d."); formatter % boost::this_thread::get_id(); - putLogError(37057, formatter.str(), __FILE__, __LINE__); + putLogError(300057, formatter.str(), __FILE__, __LINE__); status = FINALIZE; } /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("out_function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_client_send(const boost::thread::id thread_id) : " "return_value = %d, end_flag = %d. thread id : %d."); formatter % status % (threaddata.get() ? threaddata->end_flag : END_FLAG_ON) % boost::this_thread::get_id(); - putLogDebug(30113, formatter.str(), __FILE__, __LINE__); + putLogDebug(300115, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -3112,13 +3186,13 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_client_disconnect( const boost::thread::id thread_id) { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("in/out_function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_client_disconnect(const boost::thread::id thread_id) : " "thread_id = %d, return_value = %d."); formatter % thread_id % FINALIZE; - putLogDebug(30114, formatter.str(), __FILE__, __LINE__); + putLogDebug(300116, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -3132,12 +3206,12 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_sorry_enable( const boost::thread::id thread_id) { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("in/out_function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_sorry_enable(const boost::thread::id thread_id) : return_value = %d. thread id : %d."); formatter % STOP % boost::this_thread::get_id(); - putLogDebug(30115, formatter.str(), __FILE__, __LINE__); + putLogDebug(300117, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -3151,12 +3225,12 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_sorry_disable( const boost::thread::id thread_id) { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("in/out_function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_sorry_disable(const boost::thread::id thread_id) : return_value = %d. thread id : %d."); formatter % STOP % boost::this_thread::get_id(); - putLogDebug(30116, formatter.str(), __FILE__, __LINE__); + putLogDebug(300118, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -3172,13 +3246,13 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_realserver_disconn const boost::asio::ip::tcp::endpoint& rs_endpoint) { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("in/out_function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_realserver_disconnect(const boost::thread::id thread_id, " "const boost::asio::ip::tcp::endpoint& rs_endpoint) : return_value = %d. thread id : %d."); formatter % STOP % boost::this_thread::get_id(); - putLogDebug(30117, formatter.str(), __FILE__, __LINE__); + putLogDebug(300119, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -3194,13 +3268,13 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_sorryserver_discon const boost::asio::ip::tcp::endpoint& sorry_endpoint) { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("in/out_function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_sorryserver_disconnect(const boost::thread::id thread_id, " "const boost::asio::ip::tcp::endpoint& sorry_endpoint) : return_value = %d. thread id : %d."); formatter % STOP % boost::this_thread::get_id(); - putLogDebug(30118, formatter.str(), __FILE__, __LINE__); + putLogDebug(300120, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -3216,13 +3290,13 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_realserver_close( const boost::asio::ip::udp::endpoint& rs_endpoint) { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("in/out_function : protocol_module_base::EVENT_TAG protocol_module_sslid::" "handle_realserver_close(const boost::thread::id thread_id, " "const boost::asio::ip::udp::endpoint& rs_endpoint) : return_value = %d. thread id : %d."); formatter % STOP % boost::this_thread::get_id(); - putLogDebug(30119, formatter.str(), __FILE__, __LINE__); + putLogDebug(300121, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -3234,26 +3308,26 @@ protocol_module_base::EVENT_TAG protocol_module_sslid::handle_realserver_close( void protocol_module_sslid::replication_interrupt() { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - putLogDebug(30120, "in_function : void protocol_module_sslid::replication_interrupt().", __FILE__, __LINE__); + putLogDebug(300122, "in_function : void protocol_module_sslid::replication_interrupt().", __FILE__, __LINE__); } /*------DEBUG LOG END------*/ if (replication_data_processor) { replication_data_processor->write_replicaion_area(); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - putLogDebug(30121, "function : void protocol_module_sslid::replication_interrupt() : " + putLogDebug(300123, "function : void protocol_module_sslid::replication_interrupt() : " "write_replication_area() end.", __FILE__, __LINE__); } /*------DEBUG LOG END------*/ } /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - putLogDebug(30122, "out_function : void protocol_module_sslid::replication_interrupt().", __FILE__, __LINE__); + putLogDebug(300124, "out_function : void protocol_module_sslid::replication_interrupt().", __FILE__, __LINE__); } /*------DEBUG LOG END------*/ } @@ -3270,14 +3344,14 @@ int protocol_module_sslid::put_data_to_sendbuffer( size_t& datalen) { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("in_function : int protocol_module_sslid::put_data_to_sendbuffer(" "const boost::thread::id& thread_id, " "boost::array& sendbuffer, " "size_t& datalen) : thread_id = %d."); formatter % thread_id; - putLogDebug(30123, formatter.str(), __FILE__, __LINE__); + putLogDebug(300125, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -3288,21 +3362,21 @@ int protocol_module_sslid::put_data_to_sendbuffer( { boost::mutex::scoped_lock sclock(session_thread_data_map_mutex); session_thread_data_map_type::iterator it = session_thread_data_map.find(thread_id); - if (it == session_thread_data_map.end() || it->second == NULL) + if (unlikely(it == session_thread_data_map.end() || it->second == NULL)) { boost::format formatter("Invalid thread id. thread id : %d."); formatter % boost::this_thread::get_id(); - putLogError(37058, formatter.str(), __FILE__, __LINE__); + putLogError(300058, formatter.str(), __FILE__, __LINE__); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("out_function : int protocol_module_sslid::put_data_to_sendbuffer(" "const boost::thread::id& thread_id, " "boost::array& sendbuffer, " "size_t& datalen) : return_value = -1. thread id : %d."); formatter % boost::this_thread::get_id(); - putLogDebug(30124, formatter.str(), __FILE__, __LINE__); + putLogDebug(300126, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -3319,12 +3393,12 @@ int protocol_module_sslid::put_data_to_sendbuffer( if (threaddata->current_record_rest_size >= threaddata->data_size) { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("function : int protocol_module_sslid::put_data_to_sendbuffer() " ": current_record_rest_size >= data_size. thread id : %d."); formatter % boost::this_thread::get_id(); - putLogDebug(30125, formatter.str(), __FILE__, __LINE__); + putLogDebug(300127, formatter.str(), __FILE__, __LINE__); } // remain data size greater than all data size @@ -3332,7 +3406,7 @@ int protocol_module_sslid::put_data_to_sendbuffer( { // dump data /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { std::string datadump; dump_memory(databegin+threaddata->data_begain_offset, @@ -3345,7 +3419,7 @@ int protocol_module_sslid::put_data_to_sendbuffer( "dump data_size = %d, dump data = %s"); formatter % threaddata->data_begain_offset % threaddata->current_record_rest_size % threaddata->data_size % datadump; - putLogDebug(30126, formatter.str(), __FILE__, __LINE__); + putLogDebug(300128, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -3363,7 +3437,7 @@ int protocol_module_sslid::put_data_to_sendbuffer( threaddata->data_size = 0; /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { std::string datadump; dump_memory(senddatabegin, datalen, datadump); @@ -3375,7 +3449,7 @@ int protocol_module_sslid::put_data_to_sendbuffer( "dump data_size = %d, dump data = %s"); formatter % threaddata->data_begain_offset % threaddata->current_record_rest_size % datalen % datadump; - putLogDebug(30127, formatter.str(), __FILE__, __LINE__); + putLogDebug(300129, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ } @@ -3383,7 +3457,7 @@ int protocol_module_sslid::put_data_to_sendbuffer( { // dump data /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { std::string datadump; dump_memory(databegin+threaddata->data_begain_offset, sendbufsize, datadump); @@ -3395,7 +3469,7 @@ int protocol_module_sslid::put_data_to_sendbuffer( "dump data_size = %d, dump data = %s"); formatter % threaddata->data_begain_offset % threaddata->current_record_rest_size % sendbufsize % datadump; - putLogDebug(30128, formatter.str(), __FILE__, __LINE__); + putLogDebug(300130, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -3413,7 +3487,7 @@ int protocol_module_sslid::put_data_to_sendbuffer( threaddata->data_size -= sendbufsize; /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { std::string datadump; dump_memory(senddatabegin, datalen, datadump); @@ -3425,7 +3499,7 @@ int protocol_module_sslid::put_data_to_sendbuffer( "dump data_size = %d, dump data = %s"); formatter % threaddata->data_begain_offset % threaddata->current_record_rest_size % datalen % datadump; - putLogDebug(30129, formatter.str(), __FILE__, __LINE__); + putLogDebug(300131, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ } @@ -3433,12 +3507,12 @@ int protocol_module_sslid::put_data_to_sendbuffer( else { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("function : int protocol_module_sslid::put_data_to_sendbuffer() " ": current_record_rest_size < data_size. thread id : %d."); formatter % boost::this_thread::get_id(); - putLogDebug(30130, formatter.str(), __FILE__, __LINE__); + putLogDebug(300132, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -3447,7 +3521,7 @@ int protocol_module_sslid::put_data_to_sendbuffer( { // dump data /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { std::string datadump; dump_memory(databegin+threaddata->data_begain_offset, threaddata->current_record_rest_size, datadump); @@ -3459,7 +3533,7 @@ int protocol_module_sslid::put_data_to_sendbuffer( "dump data_size = %d, dump data = %s"); formatter % threaddata->data_begain_offset % threaddata->current_record_rest_size % threaddata->current_record_rest_size % datadump; - putLogDebug(30131, formatter.str(), __FILE__, __LINE__); + putLogDebug(300133, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -3477,7 +3551,7 @@ int protocol_module_sslid::put_data_to_sendbuffer( threaddata->current_record_rest_size = 0; /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { std::string datadump; dump_memory(senddatabegin, datalen, datadump); @@ -3489,7 +3563,7 @@ int protocol_module_sslid::put_data_to_sendbuffer( "dump data_size = %d, dump data = %s"); formatter % threaddata->data_begain_offset % threaddata->current_record_rest_size % datalen % datadump; - putLogDebug(30132, formatter.str(), __FILE__, __LINE__); + putLogDebug(300134, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ } @@ -3497,7 +3571,7 @@ int protocol_module_sslid::put_data_to_sendbuffer( { // data dump /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { std::string datadump; dump_memory(databegin+threaddata->data_begain_offset, sendbufsize, datadump); @@ -3509,7 +3583,7 @@ int protocol_module_sslid::put_data_to_sendbuffer( "dump data_size = %d, dump data = %s"); formatter % threaddata->data_begain_offset % threaddata->current_record_rest_size % sendbufsize % datadump; - putLogDebug(30133, formatter.str(), __FILE__, __LINE__); + putLogDebug(300135, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -3527,7 +3601,7 @@ int protocol_module_sslid::put_data_to_sendbuffer( threaddata->current_record_rest_size -= sendbufsize; /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { std::string datadump; dump_memory(senddatabegin, datalen, datadump); @@ -3539,21 +3613,21 @@ int protocol_module_sslid::put_data_to_sendbuffer( "dump data_size = %d, dump data = %s"); formatter % threaddata->data_begain_offset % threaddata->current_record_rest_size % datalen % datadump; - putLogDebug(30134, formatter.str(), __FILE__, __LINE__); + putLogDebug(300136, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ } } /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("out_function : int protocol_module_sslid::put_data_to_sendbuffer(" "const boost::thread::id& thread_id, " "boost::array& sendbuffer, " "size_t& datalen) : return_value = 0. thread id : %d."); formatter % boost::this_thread::get_id(); - putLogDebug(30135, formatter.str(), __FILE__, __LINE__); + putLogDebug(300137, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -3567,12 +3641,12 @@ int protocol_module_sslid::put_data_to_sendbuffer( bool protocol_module_sslid::realserver_selected(const boost::asio::ip::tcp::endpoint& rs_endpoint) { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("in_function : bool protocol_module_sslid::realserver_selected(" "const boost::asio::ip::tcp::endpoint& rs_endpoint) : rs_endpoint = [%s]:%d."); formatter % rs_endpoint.address().to_string() % rs_endpoint.port(); - putLogDebug(30136, formatter.str(), __FILE__, __LINE__); + putLogDebug(300138, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -3580,9 +3654,9 @@ bool protocol_module_sslid::realserver_selected(const boost::asio::ip::tcp::endp if (temp_endpoint == rs_endpoint) { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - putLogDebug(30137, "out_function : bool protocol_module_sslid::realserver_selected(" + putLogDebug(300139, "out_function : bool protocol_module_sslid::realserver_selected(" "const boost::asio::ip::tcp::endpoint& rs_endpoint) : return_value = false." , __FILE__, __LINE__); } @@ -3594,9 +3668,9 @@ bool protocol_module_sslid::realserver_selected(const boost::asio::ip::tcp::endp else { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - putLogDebug(30138, "out_function : bool protocol_module_sslid::realserver_selected(" + putLogDebug(300140, "out_function : bool protocol_module_sslid::realserver_selected(" "const boost::asio::ip::tcp::endpoint& rs_endpoint) : return_value = true." , __FILE__, __LINE__); } diff --git a/module/protocol/ssl_protocol_module_base.cpp b/module/protocol/ssl_protocol_module_base.cpp index 6a2fd1bc..8f56edcd 100644 --- a/module/protocol/ssl_protocol_module_base.cpp +++ b/module/protocol/ssl_protocol_module_base.cpp @@ -188,5 +188,8 @@ int ssl_protocol_module_base::check_ssl_record_sendable( bool is_message_form_cl return 1; } } - +bool ssl_protocol_module_base::is_exec_OK(unsigned int vs_attr) +{ + return !(vs_attr & VS_CONTACT_CLASS_SSL); +} } diff --git a/module/protocol/ssl_protocol_module_base.h b/module/protocol/ssl_protocol_module_base.h index 635cc5e6..b3406dee 100644 --- a/module/protocol/ssl_protocol_module_base.h +++ b/module/protocol/ssl_protocol_module_base.h @@ -49,6 +49,9 @@ class ssl_protocol_module_base : public protocol_module_base const static size_t SESSION_ID_BEGAIN_OFFSET = 44; const static size_t SSL_RECORD_MIN_SIZE = 6; public: + bool is_exec_OK(unsigned int vs_attr); + + public: //! format dump data. //! @param[in] data want to format //! @param[in] data size diff --git a/module/protocol/sslid_replication_data_processor.cpp b/module/protocol/sslid_replication_data_processor.cpp index 71450d02..147a1243 100644 --- a/module/protocol/sslid_replication_data_processor.cpp +++ b/module/protocol/sslid_replication_data_processor.cpp @@ -27,6 +27,7 @@ #include "protocol_module_base.h" #include "ssl_protocol_module_base.h" #include "boost/format.hpp" +#include "utility.h" #define SSLID_SERVICE_NUMBER (128) @@ -47,7 +48,7 @@ sslid_replication_data_processor::sslid_replication_data_processor( putLogInfo(inputLogInfo), putLogDebug(inputLogDebug) { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("in_function : Constructor sslid_replication_data_processor::" "sslid_replication_data_processor(int maxlist, " @@ -61,7 +62,7 @@ sslid_replication_data_processor::sslid_replication_data_processor( formatter % maxlist % static_cast(sslid_replication_area_begain) % sslid_replication_area_size % virtual_service_endpoint.address().to_string() % virtual_service_endpoint.port(); - putLogDebug(30139, formatter.str(), __FILE__, __LINE__); + putLogDebug(300166, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -73,12 +74,12 @@ sslid_replication_data_processor::sslid_replication_data_processor( int srv_num = 0; // parameter check - if (maxlist < 0 || sslid_replication_area_size < 0) + if (unlikely(maxlist < 0 || sslid_replication_area_size < 0)) { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - putLogDebug(30140, "out_function : Constructor sslid_replication_data_processor::" + putLogDebug(300167, "out_function : Constructor sslid_replication_data_processor::" "sslid_replication_data_processor(int maxlist, " "char* sslid_replication_area_begain, int sslid_replication_area_size, " "const boost::asio::ip::tcp::endpoint& virtual_service_endpoint, " @@ -91,14 +92,14 @@ sslid_replication_data_processor::sslid_replication_data_processor( throw std::logic_error("Invalid parameter value."); } - if (sslid_replication_area_begain == NULL) + if (unlikely(sslid_replication_area_begain == NULL)) { // replication area is null - putLogError(37059, "Replication area is null.", __FILE__, __LINE__); + putLogError(300063, "Replication area is null.", __FILE__, __LINE__); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - putLogDebug(30141, "function : sslid_replication_data_processor::" + putLogDebug(300168, "function : sslid_replication_data_processor::" "sslid_replication_data_processor() : Replication area is null.", __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -117,14 +118,14 @@ sslid_replication_data_processor::sslid_replication_data_processor( sizeof(sslid_replication_data_header) * SSLID_SERVICE_NUMBER + used) { // no enough replication area - putLogError(37060, "Over replication area.", __FILE__, __LINE__); + putLogError(300064, "Over replication area.", __FILE__, __LINE__); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - putLogDebug(30142, "function : sslid_replication_data_processor::" + putLogDebug(300169, "function : sslid_replication_data_processor::" "sslid_replication_data_processor() : Over replication area.", __FILE__, __LINE__); - putLogDebug(30143, "out_function : Constructor sslid_replication_data_processor::" + putLogDebug(300170, "out_function : Constructor sslid_replication_data_processor::" "sslid_replication_data_processor(int maxlist, " "char* sslid_replication_area_begain, int sslid_replication_area_size, " "const boost::asio::ip::tcp::endpoint& virtual_service_endpoint, " @@ -171,11 +172,11 @@ sslid_replication_data_processor::sslid_replication_data_processor( static_cast(sslid_replication_area_size) * DATA_SIZE) { // replication area is full - putLogError(37061, "Replication area is full.", __FILE__, __LINE__); + putLogError(300065, "Replication area is full.", __FILE__, __LINE__); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - putLogDebug(30144, "function : sslid_replication_data_processor::" + putLogDebug(300171, "function : sslid_replication_data_processor::" "sslid_replication_data_processor() : Replication area is full.", __FILE__, __LINE__); } @@ -187,7 +188,7 @@ sslid_replication_data_processor::sslid_replication_data_processor( sizeof(sslid_replication_data_header) * SSLID_SERVICE_NUMBER + used); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { std::string datadump; protocol_module_base::dump_memory(sslid_replication_area_begain+head->offset, head->size, datadump); @@ -196,12 +197,12 @@ sslid_replication_data_processor::sslid_replication_data_processor( "sslid_replication_data_processor() : before memcpy (data dump) : " "data begin = %d, data_size = %d, data = %s"); formatter % head->offset % head->size % datadump; - putLogDebug(30145, formatter.str(), __FILE__, __LINE__); + putLogDebug(300172, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ memcpy(replication_area, sslid_replication_area_begain + head->offset, head->size); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { char* pdata = reinterpret_cast(replication_area); std::string datadump; @@ -211,7 +212,7 @@ sslid_replication_data_processor::sslid_replication_data_processor( "sslid_replication_data_processor() : after memcpy (data dump) : " "data begin = 0, data_size = %d, data = %s"); formatter % head->size % datadump; - putLogDebug(30146, formatter.str(), __FILE__, __LINE__); + putLogDebug(300173, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ memset(sslid_replication_area_begain + head->offset, 0, head->size); @@ -224,13 +225,13 @@ sslid_replication_data_processor::sslid_replication_data_processor( used; /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("Write replication area : head = (ip = %s, port = %d, " "size = %d, offset = %d)."); formatter % pick->virtualserver_ip % pick->virtualserver_port % pick->size % pick->offset; - putLogDebug(30147, formatter.str(), __FILE__, __LINE__); + putLogDebug(300174, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ } @@ -238,11 +239,11 @@ sslid_replication_data_processor::sslid_replication_data_processor( else { // replication area is full - putLogError(37062, "Replication area is full.", __FILE__, __LINE__); + putLogError(300066, "Replication area is full.", __FILE__, __LINE__); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - putLogDebug(30148, "function : sslid_replication_data_processor::" + putLogDebug(300175, "function : sslid_replication_data_processor::" "sslid_replication_data_processor() : Replication area is full.", __FILE__, __LINE__); } @@ -254,13 +255,13 @@ sslid_replication_data_processor::sslid_replication_data_processor( // restore session data from replication direct head->size = maxlist * sizeof(sslid_replication_data); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("Write replication area : head = (ip = %s, port = %d, " "size = %d, offset = %d)."); formatter % pick->virtualserver_ip % pick->virtualserver_port % pick->size % pick->offset; - putLogDebug(30149, formatter.str(), __FILE__, __LINE__); + putLogDebug(300176, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ replication_area = reinterpret_cast(sslid_replication_area_begain + @@ -278,11 +279,11 @@ sslid_replication_data_processor::sslid_replication_data_processor( static_cast(sslid_replication_area_size) * DATA_SIZE) { // replication area is full - putLogError(37063, "Replication area is full.", __FILE__, __LINE__); + putLogError(300067, "Replication area is full.", __FILE__, __LINE__); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - putLogDebug(30150, "function : sslid_replication_data_processor::" + putLogDebug(300177, "function : sslid_replication_data_processor::" "sslid_replication_data_processor() : Replication area is full.", __FILE__, __LINE__); } @@ -302,13 +303,13 @@ sslid_replication_data_processor::sslid_replication_data_processor( pick->offset = sizeof(sslid_replication_data_header) * SSLID_SERVICE_NUMBER + used; /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("Write replication area : head = (ip = %s, port = %d, " "size = %d, offset = %d)."); formatter % pick->virtualserver_ip % pick->virtualserver_port % pick->size % pick->offset; - putLogDebug(30151, formatter.str(), __FILE__, __LINE__); + putLogDebug(300178, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ } @@ -316,11 +317,11 @@ sslid_replication_data_processor::sslid_replication_data_processor( else { // replication area is full - putLogError(37064, "Replication area is full.", __FILE__, __LINE__); + putLogError(300068, "Replication area is full.", __FILE__, __LINE__); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - putLogDebug(30152, "function : sslid_replication_data_processor::" + putLogDebug(300179, "function : sslid_replication_data_processor::" "sslid_replication_data_processor() : Replication area is full.", __FILE__, __LINE__); } @@ -330,9 +331,9 @@ sslid_replication_data_processor::sslid_replication_data_processor( } /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - putLogDebug(30153, "out_function : Constructor sslid_replication_data_processor::" + putLogDebug(300180, "out_function : Constructor sslid_replication_data_processor::" "sslid_replication_data_processor(int maxlist, " "char* sslid_replication_area_begain, int sslid_replication_area_size, " "const boost::asio::ip::tcp::endpoint& virtual_service_endpoint, " @@ -349,9 +350,9 @@ sslid_replication_data_processor::~sslid_replication_data_processor() { //dtor /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - putLogDebug(30154, "in/out_function : Destructor sslid_replication_data_processor::" + putLogDebug(300181, "in/out_function : Destructor sslid_replication_data_processor::" "~sslid_replication_data_processor().", __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -363,7 +364,7 @@ void sslid_replication_data_processor::put_into_temp_list( const sslid_replication_temp_data& data) { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { std::string buffer; ssl_protocol_module_base::dump_session_id(data.session_id.c_str(), data.session_id.size(), buffer); @@ -372,7 +373,7 @@ void sslid_replication_data_processor::put_into_temp_list( "data.session_id = %s, data.last_time = %lu, data.endpoint = [%s]:%d."); formatter % data.op_code % buffer % data.last_time % data.realserver_addr.address().to_string() % data.realserver_addr.port(); - putLogDebug(30155, formatter.str(), __FILE__, __LINE__); + putLogDebug(300182, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -390,9 +391,9 @@ void sslid_replication_data_processor::put_into_temp_list( } /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - putLogDebug(30156, "out_function : void sslid_replication_data_processor::" + putLogDebug(300183, "out_function : void sslid_replication_data_processor::" "put_into_temp_list(const sslid_replication_temp_data& data).", __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -402,9 +403,9 @@ void sslid_replication_data_processor::put_into_temp_list( void sslid_replication_data_processor::write_replicaion_area() { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - putLogDebug(30157, "in_function : void sslid_replication_data_processor::" + putLogDebug(300184, "in_function : void sslid_replication_data_processor::" "write_replicaion_area().", __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -413,9 +414,9 @@ void sslid_replication_data_processor::write_replicaion_area() if (maxlist <= 0 || replication_area == NULL) { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - putLogDebug(30158, "out_function : void sslid_replication_data_processor::" + putLogDebug(300185, "out_function : void sslid_replication_data_processor::" "write_replicaion_area().", __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -452,7 +453,7 @@ void sslid_replication_data_processor::write_replicaion_area() memcpy(replication_area[i].session_id, temp_data.session_id.c_str(), SSLID_LENGTH); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { char session_id_temp[SSLID_LENGTH+1] = {0}; memcpy(session_id_temp, replication_area[i].session_id, SSLID_LENGTH); @@ -461,7 +462,7 @@ void sslid_replication_data_processor::write_replicaion_area() boost::format formatter("function : void sslid_replication_data_processor::" "write_replicaion_area() : 'A' : session_id = %s."); formatter % buffer; - putLogDebug(30159, formatter.str(), __FILE__, __LINE__); + putLogDebug(300186, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -472,13 +473,13 @@ void sslid_replication_data_processor::write_replicaion_area() replication_area[i].realserver_port = temp_data.realserver_addr.port(); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("function : void sslid_replication_data_processor::" "write_replicaion_area() : 'A' : realserver_ip = %s, " "realserver_prot = %d."); formatter % replication_area[i].realserver_ip % replication_area[i].realserver_port; - putLogDebug(30160, formatter.str(), __FILE__, __LINE__); + putLogDebug(300187, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -495,13 +496,13 @@ void sslid_replication_data_processor::write_replicaion_area() memcmp(replication_area[i].session_id, temp_data.session_id.c_str(), SSLID_LENGTH) == 0) { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("function : void sslid_replication_data_processor::" "write_replicaion_area() : 'U' : last_time(before) = %lu, " "last_time(after) = %lu."); formatter % replication_area[i].last_time % temp_data.last_time; - putLogDebug(30161, formatter.str(), __FILE__, __LINE__); + putLogDebug(300188, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -523,13 +524,13 @@ void sslid_replication_data_processor::write_replicaion_area() memcmp(replication_area[i].session_id, temp_data.session_id.c_str(), SSLID_LENGTH) == 0) { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("function : void sslid_replication_data_processor::" "write_replicaion_area() : 'D' : data valid(before) = %d, " "data valid(after) = %d."); formatter % replication_area[i].valid % 0; - putLogDebug(30162, formatter.str(), __FILE__, __LINE__); + putLogDebug(300189, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -556,7 +557,7 @@ void sslid_replication_data_processor::write_replicaion_area() boost::format formatter("function : void sslid_replication_data_processor::write_replicaion_area() : " "exception : error = %s."); formatter % e.what(); - putLogError(37065, formatter.str(), __FILE__, __LINE__); + putLogError(300069, formatter.str(), __FILE__, __LINE__); } catch (boost::thread_interrupted&) { @@ -565,7 +566,7 @@ void sslid_replication_data_processor::write_replicaion_area() replication_area_unlock(); } std::cerr << "sslid_replication_data_processor::write_replicaion_area() : exception." << std::endl; - putLogError(37066, "function : void sslid_replication_data_processor::write_replicaion_area() : " + putLogError(300070, "function : void sslid_replication_data_processor::write_replicaion_area() : " "Thread_interrupted exception.", __FILE__, __LINE__); } catch (...) @@ -575,14 +576,14 @@ void sslid_replication_data_processor::write_replicaion_area() replication_area_unlock(); } std::cerr << "sslid_replication_data_processor::write_replicaion_area() : Unknown exception." << std::endl; - putLogError(37067, "function : void sslid_replication_data_processor::write_replicaion_area() : " + putLogError(300071, "function : void sslid_replication_data_processor::write_replicaion_area() : " "Unknown exception.", __FILE__, __LINE__); } /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - putLogDebug(30163, "out_function : void sslid_replication_data_processor::" + putLogDebug(300190, "out_function : void sslid_replication_data_processor::" "write_replicaion_area().", __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -593,13 +594,13 @@ void sslid_replication_data_processor::write_replicaion_area() sslid_replication_data* sslid_replication_data_processor::get_replication_area() { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("in/out_function : sslid_replication_data* " "sslid_replication_data_processor::" "get_replication_area() : return_value = &(%d)."); formatter % static_cast(replication_area); - putLogDebug(30164, formatter.str(), __FILE__, __LINE__); + putLogDebug(300191, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -612,9 +613,9 @@ void sslid_replication_data_processor::register_replication_area_lock( boost::function intable_lock) { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - putLogDebug(30165, "in_function : void sslid_replication_data_processor::" + putLogDebug(300192, "in_function : void sslid_replication_data_processor::" "register_replication_area_lock(boost::function intable_lock).", __FILE__, __LINE__); } @@ -623,9 +624,9 @@ void sslid_replication_data_processor::register_replication_area_lock( replication_area_lock = intable_lock; /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - putLogDebug(30166, "out_function : void sslid_replication_data_processor::" + putLogDebug(300193, "out_function : void sslid_replication_data_processor::" "register_replication_area_lock(boost::function intable_lock).", __FILE__, __LINE__); } @@ -638,9 +639,9 @@ void sslid_replication_data_processor::register_replication_area_unlock( boost::function intable_unlock) { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - putLogDebug(30167, "in_function : void sslid_replication_data_processor::" + putLogDebug(300194, "in_function : void sslid_replication_data_processor::" "register_replication_area_unlock(boost::function intable_unlock).", __FILE__, __LINE__); } @@ -649,9 +650,9 @@ void sslid_replication_data_processor::register_replication_area_unlock( replication_area_unlock = intable_unlock; /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - putLogDebug(30168, "out_function : void sslid_replication_data_processor::" + putLogDebug(300195, "out_function : void sslid_replication_data_processor::" "register_replication_area_unlock(boost::function intable_unlock).", __FILE__, __LINE__); } @@ -666,9 +667,9 @@ int sslid_replication_data_processor::get_from_temp_list( sslid_replication_temp_data& data) { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - putLogDebug(30169, "in_function : void sslid_replication_data_processor::" + putLogDebug(300196, "in_function : void sslid_replication_data_processor::" "get_from_temp_list(sslid_replication_temp_data& data).", __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -688,7 +689,7 @@ int sslid_replication_data_processor::get_from_temp_list( } /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { std::string buffer; ssl_protocol_module_base::dump_session_id(data.session_id.c_str(), data.session_id.size(), buffer); @@ -698,7 +699,7 @@ int sslid_replication_data_processor::get_from_temp_list( "data.last_time = %lu, data.endpoint = [%s]:%d."); formatter % ret % data.op_code % buffer % data.last_time % data.realserver_addr.address().to_string() % data.realserver_addr.port(); - putLogDebug(30170, formatter.str(), __FILE__, __LINE__); + putLogDebug(300197, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ diff --git a/module/protocol/sslid_session_data_processor.cpp b/module/protocol/sslid_session_data_processor.cpp index d98bf86a..6777b1c2 100644 --- a/module/protocol/sslid_session_data_processor.cpp +++ b/module/protocol/sslid_session_data_processor.cpp @@ -27,6 +27,7 @@ #include "protocol_module_base.h" #include "ssl_protocol_module_base.h" #include "boost/format.hpp" +#include "utility.h" namespace l7vs { @@ -45,7 +46,7 @@ sslid_session_data_processor::sslid_session_data_processor( { //ctor /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("in_function : Constructor sslid_session_data_processor::" "sslid_session_data_processor(int maxlist, " @@ -55,17 +56,17 @@ sslid_session_data_processor::sslid_session_data_processor( "logger_func_type inputLogInfo, logger_func_type inputLogDebug) : " "maxlist = %d, timeout = %d, replication_data_processor = &(%d)."); formatter % maxlist % timeout % static_cast(replication_data_processor); - putLogDebug(30171, formatter.str(), __FILE__, __LINE__); + putLogDebug(300141, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ // parameter check - if (maxlist < 0 || timeout < 0 || replication_data_processor == NULL) + if (unlikely(maxlist < 0 || timeout < 0 || replication_data_processor == NULL)) { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - putLogDebug(30172, "out_function : Constructor sslid_session_data_processor::" + putLogDebug(300142, "out_function : Constructor sslid_session_data_processor::" "sslid_session_data_processor(int maxlist, int timeout, " "sslid_replication_data_processor* replication_data_processor, " "getloglevel_func_type ingetloglevel, logger_func_type inputLogFatal, " @@ -79,9 +80,9 @@ sslid_session_data_processor::sslid_session_data_processor( } /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - putLogDebug(30173, "out_function : Constructor sslid_session_data_processor::" + putLogDebug(300143, "out_function : Constructor sslid_session_data_processor::" "sslid_session_data_processor(int maxlist, int timeout, " "sslid_replication_data_processor* replication_data_processor, " "getloglevel_func_type ingetloglevel, logger_func_type inputLogFatal, " @@ -97,9 +98,9 @@ sslid_session_data_processor::~sslid_session_data_processor() { //dtor /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - putLogDebug(30174, "in/out_function : Destructor sslid_session_data_processor::" + putLogDebug(300144, "in/out_function : Destructor sslid_session_data_processor::" "~sslid_session_data_processor().", __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -116,7 +117,7 @@ int sslid_session_data_processor::get_endpoint_from_session_data( boost::asio::ip::tcp::endpoint& endpoint) { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { std::string buffer; ssl_protocol_module_base::dump_session_id(session_id.c_str(), session_id.size(), buffer); @@ -125,7 +126,7 @@ int sslid_session_data_processor::get_endpoint_from_session_data( "boost::asio::ip::tcp::endpoint& endpoint) : " "session_id = %s, endpoint = [%s]:%d."); formatter % buffer % endpoint.address().to_string() % endpoint.port(); - putLogDebug(30175, formatter.str(), __FILE__, __LINE__); + putLogDebug(300145, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -148,9 +149,9 @@ int sslid_session_data_processor::get_endpoint_from_session_data( itlasttime == session_lasttime_map.end()) { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - putLogDebug(30176, "out_function : int sslid_session_data_processor::" + putLogDebug(300146, "out_function : int sslid_session_data_processor::" "get_endpoint_from_session_data(const std::string& session_id, " "boost::asio::ip::tcp::endpoint& endpoint) : return_value = 1.", __FILE__, __LINE__); @@ -203,7 +204,7 @@ int sslid_session_data_processor::get_endpoint_from_session_data( replication_data_processor->put_into_temp_list(temp_data); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { std::string buffer; ssl_protocol_module_base::dump_session_id(session_id.c_str(), session_id.size(), buffer); @@ -211,10 +212,10 @@ int sslid_session_data_processor::get_endpoint_from_session_data( "get_endpoint_from_session_data() : put_into_temp_list() " "--delete item session_id = %s -- end."); formatter % buffer; - putLogDebug(30177, formatter.str(), __FILE__, __LINE__); + putLogDebug(300147, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ - } + } } catch(const std::exception& e) { @@ -222,19 +223,19 @@ int sslid_session_data_processor::get_endpoint_from_session_data( boost::format formatter("function : int sslid_session_data_processor::" "get_endpoint_from_session_data() : exception : error = %s."); formatter % e.what(); - putLogError(37068, formatter.str(), __FILE__, __LINE__); + putLogError(300059, formatter.str(), __FILE__, __LINE__); ret = -1; } /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("out_function : int sslid_session_data_processor::" "get_endpoint_from_session_data(const std::string& session_id, " "boost::asio::ip::tcp::endpoint& endpoint) : return_value = %d."); formatter % ret; - putLogDebug(30178, formatter.str(), __FILE__, __LINE__); + putLogDebug(300148, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -254,7 +255,7 @@ int sslid_session_data_processor::write_session_data( time_t now_time) { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { std::string buffer; ssl_protocol_module_base::dump_session_id(session_id.c_str(), session_id.size(), buffer); @@ -264,7 +265,7 @@ int sslid_session_data_processor::write_session_data( "time_t now_time) : session_id = %s, " "endpoint = [%s]:%d, now_time = %lu."); formatter % buffer % endpoint.address().to_string() % endpoint.port() % now_time; - putLogDebug(30179, formatter.str(), __FILE__, __LINE__); + putLogDebug(300149, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -276,9 +277,9 @@ int sslid_session_data_processor::write_session_data( if (maxlist <= 0) { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - putLogDebug(30180, "out_function : int sslid_session_data_processor::" + putLogDebug(300150, "out_function : int sslid_session_data_processor::" "write_session_data(const std::string& session_id, " "const boost::asio::ip::tcp::endpoint& endpoint, time_t now_time) : " "return_value = 0.", __FILE__, __LINE__); @@ -323,7 +324,7 @@ int sslid_session_data_processor::write_session_data( temp_data.last_time = now_time; replication_data_processor->put_into_temp_list(temp_data); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { std::string buffer; ssl_protocol_module_base::dump_session_id(session_id.c_str(), session_id.size(), buffer); @@ -331,7 +332,7 @@ int sslid_session_data_processor::write_session_data( "write_session_data() : put_into_temp_list() " "--update item session_id = %s -- end."); formatter % buffer; - putLogDebug(30181, formatter.str(), __FILE__, __LINE__); + putLogDebug(300151, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ } @@ -344,9 +345,9 @@ int sslid_session_data_processor::write_session_data( if (clear_expired_session_data() == 1) { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - putLogDebug(30182, "out_function : int sslid_session_data_processor::" + putLogDebug(300152, "out_function : int sslid_session_data_processor::" "write_session_data(const std::string& session_id, " "const boost::asio::ip::tcp::endpoint& endpoint, time_t now_time) : " "return_value = 0.", __FILE__, __LINE__); @@ -357,9 +358,9 @@ int sslid_session_data_processor::write_session_data( } /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - putLogDebug(30183, "function : int sslid_session_data_processor::" + putLogDebug(300153, "function : int sslid_session_data_processor::" "write_session_data() : clear_expired_session_data() END.", __FILE__, __LINE__); } @@ -380,7 +381,7 @@ int sslid_session_data_processor::write_session_data( temp_data.last_time = now_time; replication_data_processor->put_into_temp_list(temp_data); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { std::string buffer; ssl_protocol_module_base::dump_session_id(session_id.c_str(), session_id.size(), buffer); @@ -388,7 +389,7 @@ int sslid_session_data_processor::write_session_data( "write_session_data() : put_into_temp_list() " "--add item session_id = %s -- end."); formatter % buffer; - putLogDebug(30184, formatter.str(), __FILE__, __LINE__); + putLogDebug(300154, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ } @@ -399,12 +400,12 @@ int sslid_session_data_processor::write_session_data( boost::format formatter("function : int sslid_session_data_processor::" "write_session_data() : exception : error = %s."); formatter % e.what(); - putLogError(37069, formatter.str(), __FILE__, __LINE__); + putLogError(300060, formatter.str(), __FILE__, __LINE__); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - putLogDebug(30185, "out_function : int sslid_session_data_processor::" + putLogDebug(300155, "out_function : int sslid_session_data_processor::" "write_session_data(const std::string& session_id, " "const boost::asio::ip::tcp::endpoint& endpoint, time_t now_time) : " "return_value = -1.", __FILE__, __LINE__); @@ -415,9 +416,9 @@ int sslid_session_data_processor::write_session_data( } /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - putLogDebug(30186, "out_function : int sslid_session_data_processor::" + putLogDebug(300156, "out_function : int sslid_session_data_processor::" "write_session_data(const std::string& session_id, " "const boost::asio::ip::tcp::endpoint& endpoint, time_t now_time) : " "return_value = 0.", __FILE__, __LINE__); @@ -435,24 +436,24 @@ int sslid_session_data_processor::read_session_data_from_replication_area( sslid_replication_data* replication_area ) { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("in_function : int sslid_session_data_processor::" "read_session_data_from_replication_area(sslid_replication_data* replication_area) : " "replication_area = &(%d)."); formatter % static_cast(replication_area); - putLogDebug(30187, formatter.str(), __FILE__, __LINE__); + putLogDebug(300157, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ // null check - if (replication_area == NULL) + if (unlikely(replication_area == NULL)) { - putLogError(37070, "Replication area is NULL.", __FILE__, __LINE__); + putLogError(300061, "Replication area is NULL.", __FILE__, __LINE__); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - putLogDebug(30188, "out_function : int sslid_session_data_processor::" + putLogDebug(300158, "out_function : int sslid_session_data_processor::" "read_session_data_from_replication_area(" "sslid_replication_data* replication_area) : return_value = -1.", __FILE__, __LINE__); } @@ -465,7 +466,7 @@ int sslid_session_data_processor::read_session_data_from_replication_area( { // restore replication data to map /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { char* pdata = reinterpret_cast(replication_area); std::string datadump; @@ -475,7 +476,7 @@ int sslid_session_data_processor::read_session_data_from_replication_area( "read_session_data_from_replication_area() : " "data begin = 0, data_size = %d, data = %s"); formatter % maxlist % datadump; - putLogDebug(30189, formatter.str(), __FILE__, __LINE__); + putLogDebug(300159, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ for (int i = 0; i < maxlist; ++i) @@ -501,19 +502,19 @@ int sslid_session_data_processor::read_session_data_from_replication_area( boost::format formatter("function : int sslid_session_data_processor::" "read_session_data_from_replication_area() : exception : error = %s."); formatter % e.what(); - putLogError(37071, formatter.str(), __FILE__, __LINE__); + putLogError(300062, formatter.str(), __FILE__, __LINE__); ret = -1; } /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("out_function : int sslid_session_data_processor::" "read_session_data_from_replication_area(slid_replication_data* replication_area) : " "return_value = %d."); formatter % ret; - putLogDebug(30190, formatter.str(), __FILE__, __LINE__); + putLogDebug(300160, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -525,9 +526,9 @@ int sslid_session_data_processor::read_session_data_from_replication_area( int sslid_session_data_processor::clear_expired_session_data() { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - putLogDebug(30191, "in_function : int sslid_session_data_processor::" + putLogDebug(300161, "in_function : int sslid_session_data_processor::" "clear_expired_session_data().", __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -540,9 +541,9 @@ int sslid_session_data_processor::clear_expired_session_data() if (session_endpoint_map.size() == 0) { /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { - putLogDebug(30192, "out_function : int sslid_session_data_processor::" + putLogDebug(300162, "out_function : int sslid_session_data_processor::" "clear_expired_session_data() : return_value = 1.", __FILE__, __LINE__); } /*------DEBUG LOG END------*/ @@ -574,7 +575,7 @@ int sslid_session_data_processor::clear_expired_session_data() // put into replication temp list replication_data_processor->put_into_temp_list(temp_data); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { std::string buffer; ssl_protocol_module_base::dump_session_id(temp_data.session_id.c_str(), temp_data.session_id.size(), buffer); @@ -582,7 +583,7 @@ int sslid_session_data_processor::clear_expired_session_data() "clear_expired_session_data() : put_into_temp_list() " "--delete expired time item session_id = %s -- end."); formatter % buffer; - putLogDebug(30193, formatter.str(), __FILE__, __LINE__); + putLogDebug(300163, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ } @@ -605,7 +606,7 @@ int sslid_session_data_processor::clear_expired_session_data() temp_data.session_id = session_id; replication_data_processor->put_into_temp_list(temp_data); /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { std::string buffer; ssl_protocol_module_base::dump_session_id(session_id.c_str(), session_id.size(), buffer); @@ -613,18 +614,18 @@ int sslid_session_data_processor::clear_expired_session_data() "clear_expired_session_data() : put_into_temp_list() " "--delete oldest time item session_id = %s -- end."); formatter % buffer; - putLogDebug(30194, formatter.str(), __FILE__, __LINE__); + putLogDebug(300164, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ } /*-------- DEBUG LOG --------*/ - if (LOG_LV_DEBUG == getloglevel()) + if (unlikely(LOG_LV_DEBUG == getloglevel())) { boost::format formatter("out_function : int sslid_session_data_processor::" "clear_expired_session_data() : return_value = %d."); formatter % ret; - putLogDebug(30195, formatter.str(), __FILE__, __LINE__); + putLogDebug(300165, formatter.str(), __FILE__, __LINE__); } /*------DEBUG LOG END------*/ diff --git a/module/schedule/schedule_module_lc.cpp b/module/schedule/schedule_module_lc.cpp index 4113d1b0..4f910309 100644 --- a/module/schedule/schedule_module_lc.cpp +++ b/module/schedule/schedule_module_lc.cpp @@ -23,6 +23,7 @@ **********************************************************************/ #include "schedule_module_lc.h" #include +#include "utility.h" namespace l7vs{ @@ -35,23 +36,23 @@ schedule_module_least_connection::~schedule_module_least_connection(){} //! initialize function void schedule_module_least_connection::initialize(){ - if ( !getloglevel.empty() ){ - if ( LOG_LV_DEBUG == getloglevel() ){ - if ( !putLogDebug.empty() ){ - putLogDebug( 1, "Function in : schedule_module_least_connection::initialize", __FILE__, __LINE__); + if ( likely(!getloglevel.empty() )){ + if ( unlikely(LOG_LV_DEBUG == getloglevel() )){ + if ( likely(!putLogDebug.empty() )){ + putLogDebug( 100000, "Function in : schedule_module_least_connection::initialize", __FILE__, __LINE__); } } } - if ( !putLogInfo.empty() ) + if ( likely(!putLogInfo.empty() )) { - putLogInfo( 5001, "Function was initialized.", __FILE__, __LINE__); + putLogInfo( 100000, "Function was initialized.", __FILE__, __LINE__); } - if ( !getloglevel.empty() ){ - if ( LOG_LV_DEBUG == getloglevel() ){ - if ( !putLogDebug.empty() ){ - putLogDebug( 2, "Function out : schedule_module_least_connection::initialize", __FILE__, __LINE__); + if ( likely(!getloglevel.empty() )){ + if ( unlikely(LOG_LV_DEBUG == getloglevel() )){ + if ( likely(!putLogDebug.empty() )){ + putLogDebug( 100001, "Function out : schedule_module_least_connection::initialize", __FILE__, __LINE__); } } } @@ -79,10 +80,10 @@ void schedule_module_least_connection::handle_schedule( rslist_iterator_end_func_type inlist_end, rslist_iterator_next_func_type inlist_next, boost::asio::ip::tcp::endpoint& outendpoint ){ - if ( !getloglevel.empty() ){ - if ( LOG_LV_DEBUG == getloglevel() ){ - if ( !putLogDebug.empty() ){ - putLogDebug( 3, "Function in : schedule_module_least_connection::handle_schedule", __FILE__, __LINE__); + if ( likely(!getloglevel.empty() )){ + if ( unlikely(LOG_LV_DEBUG == getloglevel() )){ + if ( likely(!putLogDebug.empty() )){ + putLogDebug( 100002, "Function in : schedule_module_least_connection::handle_schedule", __FILE__, __LINE__); } } } @@ -96,26 +97,26 @@ void schedule_module_least_connection::handle_schedule( //! set clear data as NULL outendpoint = tcp_local_endpoint; - if ( inlist_begin.empty() || inlist_end.empty() || inlist_next.empty() ){ + if ( unlikely(inlist_begin.empty() || inlist_end.empty() || inlist_next.empty() )){ //! invalid iterator function - if ( !putLogFatal.empty() ) + if ( likely(!putLogFatal.empty() )) { - putLogFatal( 8001, "Iterator function is empty.", __FILE__, __LINE__); + putLogFatal( 100000, "Iterator function is empty.", __FILE__, __LINE__); } goto END; } //! Debug log - if ( !getloglevel.empty() ){ - if ( LOG_LV_DEBUG == getloglevel() ){ - if ( !putLogDebug.empty() ){ + if ( likely(!getloglevel.empty() )){ + if ( unlikely(LOG_LV_DEBUG == getloglevel() )){ + if ( likely(!putLogDebug.empty() )){ for ( loop = 1, itr = inlist_begin(); itr != inlist_end(); itr = inlist_next( itr ), loop++ ){ buf = boost::io::str( boost::format( "realserver[%d] : %s:%d weight(%d)" ) % loop % itr->tcp_endpoint.address() % itr->tcp_endpoint.port() % itr->weight ); - putLogDebug( 4, buf, __FILE__, __LINE__); + putLogDebug( 100003, buf, __FILE__, __LINE__); } } } @@ -130,20 +131,20 @@ void schedule_module_least_connection::handle_schedule( } } - if ( active == INT_MAX ){ + if ( unlikely(active == INT_MAX )){ //! no data - if ( !putLogError.empty() ) + if ( likely(!putLogError.empty() )) { - putLogError( 7001, "There is no realserver on list.", __FILE__, __LINE__); + putLogError( 100000, "There is no realserver on list.", __FILE__, __LINE__); } goto END; } END: - if ( !getloglevel.empty() ){ - if ( LOG_LV_DEBUG == getloglevel() ){ - if ( !putLogDebug.empty() ){ - putLogDebug( 5, "Function out : schedule_module_least_connection::handle_schedule", __FILE__, __LINE__); + if ( likely(!getloglevel.empty() )){ + if ( unlikely(LOG_LV_DEBUG == getloglevel() )){ + if ( likely(!putLogDebug.empty() )){ + putLogDebug( 100004, "Function out : schedule_module_least_connection::handle_schedule", __FILE__, __LINE__); } } } @@ -161,23 +162,23 @@ void schedule_module_least_connection::handle_schedule( rslist_iterator_end_func_type inlist_end, rslist_iterator_next_func_type inlist_next, boost::asio::ip::udp::endpoint& outendpoint ){ - if ( !getloglevel.empty() ){ - if ( LOG_LV_DEBUG == getloglevel() ){ - if ( !putLogDebug.empty() ){ - putLogDebug( 6, "Function in : schedule_module_least_connection::handle_schedule", __FILE__, __LINE__); + if ( likely(!getloglevel.empty() )){ + if ( unlikely(LOG_LV_DEBUG == getloglevel() )){ + if ( likely(!putLogDebug.empty() )){ + putLogDebug( 100005, "Function in : schedule_module_least_connection::handle_schedule", __FILE__, __LINE__); } } } - if ( !putLogWarn.empty() ) + if ( likely(!putLogWarn.empty() )) { - putLogWarn( 6001, "UDP function was not supported.", __FILE__, __LINE__); + putLogWarn( 100001, "UDP function was not supported.", __FILE__, __LINE__); } - if ( !getloglevel.empty() ){ - if ( LOG_LV_DEBUG == getloglevel() ){ - if ( !putLogDebug.empty() ){ - putLogDebug( 7, "Function out : schedule_module_least_connection::handle_schedule", __FILE__, __LINE__); + if ( likely(!getloglevel.empty() )){ + if ( unlikely(LOG_LV_DEBUG == getloglevel() )){ + if ( likely(!putLogDebug.empty() )){ + putLogDebug( 100006, "Function out : schedule_module_least_connection::handle_schedule", __FILE__, __LINE__); } } } diff --git a/module/schedule/schedule_module_rr.cpp b/module/schedule/schedule_module_rr.cpp index 738bcf45..e4a4c6f4 100644 --- a/module/schedule/schedule_module_rr.cpp +++ b/module/schedule/schedule_module_rr.cpp @@ -37,10 +37,10 @@ schedule_module_round_robin::~schedule_module_round_robin(){} //! initialize function void schedule_module_round_robin::initialize(){ - if ( !getloglevel.empty() ){ + if ( likely(!getloglevel.empty() )){ if ( unlikely( LOG_LV_DEBUG == getloglevel() ) ){ - if ( !putLogDebug.empty() ){ - putLogDebug( 10001, "Function in : schedule_module_round_robin::initialize", __FILE__, __LINE__); + if ( likely(!putLogDebug.empty() )){ + putLogDebug( 200000, "Function in : schedule_module_round_robin::initialize", __FILE__, __LINE__); } } } @@ -53,13 +53,13 @@ void schedule_module_round_robin::initialize(){ if ( likely( !putLogInfo.empty() ) ) { - putLogInfo( 15001, "Saved endpoint was initialized.", __FILE__, __LINE__); + putLogInfo( 200000, "Saved endpoint was initialized.", __FILE__, __LINE__); } if ( likely( !getloglevel.empty() ) ){ if ( unlikely( LOG_LV_DEBUG == getloglevel() ) ){ if ( likely( !putLogDebug.empty() ) ){ - putLogDebug( 10002, "Function out : schedule_module_round_robin::initialize", __FILE__, __LINE__); + putLogDebug( 200001, "Function out : schedule_module_round_robin::initialize", __FILE__, __LINE__); } } } @@ -90,7 +90,7 @@ void schedule_module_round_robin::handle_schedule( if ( likely( !getloglevel.empty() ) ){ if ( unlikely( LOG_LV_DEBUG == getloglevel() ) ){ if ( likely( !putLogDebug.empty() ) ){ - putLogDebug( 10003, "Function in : schedule_module_round_robin::handle_schedule", __FILE__, __LINE__); + putLogDebug( 200002, "Function in : schedule_module_round_robin::handle_schedule", __FILE__, __LINE__); } } } @@ -107,7 +107,7 @@ void schedule_module_round_robin::handle_schedule( //! invalid iterator function if ( likely( !putLogFatal.empty() ) ) { - putLogFatal( 18001, "Iterator function is empty.", __FILE__, __LINE__); + putLogFatal( 200000, "Iterator function is empty.", __FILE__, __LINE__); } goto END; } @@ -122,7 +122,7 @@ void schedule_module_round_robin::handle_schedule( % itr->tcp_endpoint.address() % itr->tcp_endpoint.port() % itr->weight ); - putLogDebug( 10004, buf, __FILE__, __LINE__); + putLogDebug( 200003, buf, __FILE__, __LINE__); } } } @@ -140,7 +140,7 @@ void schedule_module_round_robin::handle_schedule( //! no data if ( likely( !putLogError.empty() ) ) { - putLogError( 17001, "There is no realserver on list.", __FILE__, __LINE__); + putLogError( 200000, "There is no realserver on list.", __FILE__, __LINE__); } goto END; } @@ -156,10 +156,10 @@ void schedule_module_round_robin::handle_schedule( if ( likely( !getloglevel.empty() ) ){ if ( unlikely( LOG_LV_DEBUG == getloglevel() ) ){ if ( likely( !putLogDebug.empty() ) ){ - buf = boost::io::str( boost::format( "previous endpoint : %s:%d" ) + buf = boost::io::str( boost::format( "previous endpoint : %s:%d" ) % tcp_endpoint.address() % tcp_endpoint.port() ); - putLogDebug( 10005, buf, __FILE__, __LINE__); + putLogDebug( 200004, buf, __FILE__, __LINE__); } } } @@ -185,7 +185,7 @@ void schedule_module_round_robin::handle_schedule( % itr->tcp_endpoint.address() % itr->tcp_endpoint.port() % itr->weight ); - putLogDebug( 10006, buf, __FILE__, __LINE__); + putLogDebug( 200005, buf, __FILE__, __LINE__); } } } @@ -204,7 +204,7 @@ END: if ( likely( !getloglevel.empty() ) ){ if ( unlikely( LOG_LV_DEBUG == getloglevel() ) ){ if ( likely( !putLogDebug.empty() ) ){ - putLogDebug( 10007, "Function out : schedule_module_round_robin::handle_schedule", __FILE__, __LINE__); + putLogDebug( 200006, "Function out : schedule_module_round_robin::handle_schedule", __FILE__, __LINE__); } } } @@ -222,10 +222,10 @@ void schedule_module_round_robin::handle_schedule( rslist_iterator_end_func_type inlist_end, rslist_iterator_next_func_type inlist_next, boost::asio::ip::udp::endpoint& outendpoint ){ - if ( !getloglevel.empty() ){ + if ( likely(!getloglevel.empty() )){ if ( unlikely( LOG_LV_DEBUG == getloglevel() ) ){ - if ( !putLogDebug.empty() ){ - putLogDebug( 10008, "Function in : schedule_module_round_robin::handle_schedule", __FILE__, __LINE__); + if ( likely(!putLogDebug.empty() )){ + putLogDebug( 200007, "Function in : schedule_module_round_robin::handle_schedule", __FILE__, __LINE__); } } } @@ -242,7 +242,7 @@ void schedule_module_round_robin::handle_schedule( //! invalid iterator function if ( likely( !putLogFatal.empty() )) { - putLogFatal( 18002, "Iterator function is empty.", __FILE__, __LINE__); + putLogFatal( 200001, "Iterator function is empty.", __FILE__, __LINE__); } goto END; } @@ -257,7 +257,7 @@ void schedule_module_round_robin::handle_schedule( % itr->udp_endpoint.address() % itr->udp_endpoint.port() % itr->weight ); - putLogDebug( 10009, buf, __FILE__, __LINE__); + putLogDebug( 200008, buf, __FILE__, __LINE__); } } } @@ -275,7 +275,7 @@ void schedule_module_round_robin::handle_schedule( //! no data if ( likely( !putLogError.empty() ) ) { - putLogError( 17002, "There is no realserver on list.", __FILE__, __LINE__); + putLogError( 200001, "There is no realserver on list.", __FILE__, __LINE__); } goto END; } @@ -291,10 +291,10 @@ void schedule_module_round_robin::handle_schedule( if ( likely( !getloglevel.empty() ) ){ if ( unlikely( LOG_LV_DEBUG == getloglevel() ) ){ if ( likely( !putLogDebug.empty() ) ){ - buf = boost::io::str( boost::format( "previous endpoint : %s:%d" ) + buf = boost::io::str( boost::format( "previous endpoint : %s:%d" ) % udp_endpoint.address() % udp_endpoint.port() ); - putLogDebug( 10010, buf, __FILE__, __LINE__); + putLogDebug( 200009, buf, __FILE__, __LINE__); } } } @@ -320,7 +320,7 @@ void schedule_module_round_robin::handle_schedule( % itr->udp_endpoint.address() % itr->udp_endpoint.port() % itr->weight ); - putLogDebug( 10011, buf, __FILE__, __LINE__); + putLogDebug( 200010, buf, __FILE__, __LINE__); } } } @@ -339,7 +339,7 @@ END: if ( likely( !getloglevel.empty() ) ){ if ( unlikely( LOG_LV_DEBUG == getloglevel() ) ){ if ( likely( !putLogDebug.empty() ) ){ - putLogDebug( 10012, "Function out : schedule_module_round_robin::handle_schedule", __FILE__, __LINE__); + putLogDebug( 200011, "Function out : schedule_module_round_robin::handle_schedule", __FILE__, __LINE__); } } } diff --git a/module/schedule/schedule_module_wrr.cpp b/module/schedule/schedule_module_wrr.cpp index cf2f3a38..3220969b 100644 --- a/module/schedule/schedule_module_wrr.cpp +++ b/module/schedule/schedule_module_wrr.cpp @@ -24,6 +24,8 @@ #include "schedule_module_wrr.h" #include +#include "utility.h" + namespace l7vs{ //! constractor @@ -35,10 +37,10 @@ schedule_module_weighted_round_robin::~schedule_module_weighted_round_robin(){} //! initialize function void schedule_module_weighted_round_robin::initialize(){ - if ( !getloglevel.empty() ){ - if ( LOG_LV_DEBUG == getloglevel() ){ - if ( !putLogDebug.empty() ){ - putLogDebug( 20001, "Function in : schedule_module_weighted_round_robin::initialize", __FILE__, __LINE__); + if ( likely(!getloglevel.empty()) ){ + if ( unlikely(LOG_LV_DEBUG == getloglevel()) ){ + if ( likely(!putLogDebug.empty()) ){ + putLogDebug( 300000, "Function in : schedule_module_weighted_round_robin::initialize", __FILE__, __LINE__); } } } @@ -53,14 +55,14 @@ void schedule_module_weighted_round_robin::initialize(){ vs_weights.maxWeight = 0; vs_weights.gcd = 0; - if ( !putLogInfo.empty() ){ - putLogInfo( 25001, "Saved endpoint, weight and gcd were initialized.", __FILE__, __LINE__); + if ( likely(!putLogInfo.empty()) ){ + putLogInfo( 300000, "Saved endpoint, weight and gcd were initialized.", __FILE__, __LINE__); } - if ( !getloglevel.empty() ){ - if ( LOG_LV_DEBUG == getloglevel() ){ - if ( !putLogDebug.empty() ){ - putLogDebug( 20002, "Function out : schedule_module_weighted_round_robin::initialize", __FILE__, __LINE__); + if ( likely(!getloglevel.empty()) ){ + if ( unlikely(LOG_LV_DEBUG == getloglevel()) ){ + if ( likely(!putLogDebug.empty()) ){ + putLogDebug( 300001, "Function out : schedule_module_weighted_round_robin::initialize", __FILE__, __LINE__); } } } @@ -88,10 +90,10 @@ void schedule_module_weighted_round_robin::handle_schedule( rslist_iterator_end_func_type inlist_end, rslist_iterator_next_func_type inlist_next, boost::asio::ip::tcp::endpoint& outendpoint ){ - if ( !getloglevel.empty() ){ - if ( LOG_LV_DEBUG == getloglevel() ){ - if ( !putLogDebug.empty() ){ - putLogDebug( 20003, "Function in : schedule_module_weighted_round_robin::handle_schedule", __FILE__, __LINE__); + if ( likely(!getloglevel.empty()) ){ + if ( unlikely(LOG_LV_DEBUG == getloglevel()) ){ + if ( likely(!putLogDebug.empty()) ){ + putLogDebug( 300002, "Function in : schedule_module_weighted_round_robin::handle_schedule", __FILE__, __LINE__); } } } @@ -104,37 +106,37 @@ void schedule_module_weighted_round_robin::handle_schedule( //! set clear data as NULL outendpoint = tcp_local_endpoint; - if ( inlist_begin.empty() || inlist_end.empty() || inlist_next.empty() ){ + if ( unlikely(inlist_begin.empty() || inlist_end.empty() || inlist_next.empty()) ){ //! invalid iterator function - if ( !putLogFatal.empty() ) + if ( likely(!putLogFatal.empty()) ) { - putLogFatal( 28001, "Iterator function is empty.", __FILE__, __LINE__); + putLogFatal( 300000, "Iterator function is empty.", __FILE__, __LINE__); } goto END; } //! Debug log - if ( !getloglevel.empty() ){ - if ( LOG_LV_DEBUG == getloglevel() ){ - if ( !putLogDebug.empty() ){ + if ( likely(!getloglevel.empty()) ){ + if ( unlikely(LOG_LV_DEBUG == getloglevel()) ){ + if ( likely(!putLogDebug.empty()) ){ for ( loop = 1, itr = inlist_begin(); itr != inlist_end(); itr = inlist_next( itr ), loop++ ){ buf = boost::io::str( boost::format( "realserver[%d] : %s:%d weight(%d)" ) % loop % itr->tcp_endpoint.address() % itr->tcp_endpoint.port() % itr->weight ); - putLogDebug( 20004, buf, __FILE__, __LINE__); + putLogDebug( 300003, buf, __FILE__, __LINE__); } } } } //! Debug log END - if ( -1 == sched_wrr_service_init ( inlist_begin, inlist_end, inlist_next ) ){ + if ( unlikely(-1 == sched_wrr_service_init ( inlist_begin, inlist_end, inlist_next )) ){ //! init error( no data ) - if ( !putLogError.empty() ) + if ( likely(!putLogError.empty()) ) { - putLogError( 27001, "There is no realserver on list.", __FILE__, __LINE__); + putLogError( 300000, "There is no realserver on list.", __FILE__, __LINE__); } goto END; } @@ -150,14 +152,14 @@ void schedule_module_weighted_round_robin::handle_schedule( } //! Debug log - if ( !getloglevel.empty() ){ - if ( LOG_LV_DEBUG == getloglevel() ){ - if ( !putLogDebug.empty() ){ - buf = boost::io::str( boost::format( "previous endpoint : %s:%d currentweight(%d)" ) + if ( likely(!getloglevel.empty()) ){ + if ( unlikely(LOG_LV_DEBUG == getloglevel()) ){ + if ( likely(!putLogDebug.empty()) ){ + buf = boost::io::str( boost::format( "previous endpoint : %s:%d currentweight(%d)" ) % tcp_endpoint.address() % tcp_endpoint.port() % vs_weights.currentWeight ); - putLogDebug( 20005, buf, __FILE__, __LINE__); + putLogDebug( 300004, buf, __FILE__, __LINE__); } } } @@ -188,15 +190,15 @@ void schedule_module_weighted_round_robin::handle_schedule( for ( ; itr != inlist_end(); itr = inlist_next( itr ) ){ //! Debug log - if ( !getloglevel.empty() ){ - if ( LOG_LV_DEBUG == getloglevel() ){ - if ( !putLogDebug.empty() ){ + if ( likely(!getloglevel.empty()) ){ + if ( unlikely(LOG_LV_DEBUG == getloglevel()) ){ + if ( likely(!putLogDebug.empty()) ){ buf = boost::io::str( boost::format( "itr : %s:%d weight(%d) currentweight(%d)" ) % itr->tcp_endpoint.address() % itr->tcp_endpoint.port() % itr->weight % vs_weights.currentWeight ); - putLogDebug( 20006, buf, __FILE__, __LINE__); + putLogDebug( 300005, buf, __FILE__, __LINE__); } } } @@ -218,10 +220,10 @@ void schedule_module_weighted_round_robin::handle_schedule( } END: - if ( !getloglevel.empty() ){ - if ( LOG_LV_DEBUG == getloglevel() ){ - if ( !putLogDebug.empty() ){ - putLogDebug( 20007, "Function out : schedule_module_weighted_round_robin::handle_schedule", __FILE__, __LINE__); + if ( likely(!getloglevel.empty()) ){ + if ( unlikely(LOG_LV_DEBUG == getloglevel()) ){ + if ( likely(!putLogDebug.empty()) ){ + putLogDebug( 300006, "Function out : schedule_module_weighted_round_robin::handle_schedule", __FILE__, __LINE__); } } } @@ -239,10 +241,10 @@ void schedule_module_weighted_round_robin::handle_schedule( rslist_iterator_end_func_type inlist_end, rslist_iterator_next_func_type inlist_next, boost::asio::ip::udp::endpoint& outendpoint ){ - if ( !getloglevel.empty() ){ - if ( LOG_LV_DEBUG == getloglevel() ){ - if ( !putLogDebug.empty() ){ - putLogDebug( 20008, "Function in : schedule_module_weighted_round_robin::handle_schedule", __FILE__, __LINE__); + if ( likely(!getloglevel.empty()) ){ + if ( unlikely(LOG_LV_DEBUG == getloglevel()) ){ + if ( likely(!putLogDebug.empty()) ){ + putLogDebug( 300007, "Function in : schedule_module_weighted_round_robin::handle_schedule", __FILE__, __LINE__); } } } @@ -255,37 +257,37 @@ void schedule_module_weighted_round_robin::handle_schedule( //! set clear data as NULL outendpoint = udp_local_endpoint; - if ( inlist_begin.empty() || inlist_end.empty() || inlist_next.empty() ){ + if ( unlikely(inlist_begin.empty() || inlist_end.empty() || inlist_next.empty()) ){ //! invalid iterator function - if ( !putLogFatal.empty() ) + if ( likely(!putLogFatal.empty()) ) { - putLogFatal( 28002, "Iterator function is empty.", __FILE__, __LINE__); + putLogFatal( 300001, "Iterator function is empty.", __FILE__, __LINE__); } goto END; } //! Debug log - if ( !getloglevel.empty() ){ - if ( LOG_LV_DEBUG == getloglevel() ){ - if ( !putLogDebug.empty() ){ + if ( likely(!getloglevel.empty()) ){ + if ( unlikely(LOG_LV_DEBUG == getloglevel()) ){ + if ( likely(!putLogDebug.empty()) ){ for ( loop = 1, itr = inlist_begin(); itr != inlist_end(); itr = inlist_next( itr ), loop++ ){ buf = boost::io::str( boost::format( "realserver[%d] : %s:%d weight(%d)" ) % loop % itr->udp_endpoint.address() % itr->udp_endpoint.port() % itr->weight ); - putLogDebug( 20009, buf, __FILE__, __LINE__); + putLogDebug( 300008, buf, __FILE__, __LINE__); } } } } //! Debug log END - if ( -1 == sched_wrr_service_init ( inlist_begin, inlist_end, inlist_next ) ){ + if ( unlikely(-1 == sched_wrr_service_init ( inlist_begin, inlist_end, inlist_next )) ){ //! init error( no data ) - if ( !putLogError.empty() ) + if ( likely(!putLogError.empty()) ) { - putLogError( 27002, "There is no realserver on list.", __FILE__, __LINE__); + putLogError( 300001, "There is no realserver on list.", __FILE__, __LINE__); } goto END; } @@ -301,14 +303,14 @@ void schedule_module_weighted_round_robin::handle_schedule( } //! Debug log - if ( !getloglevel.empty() ){ - if ( LOG_LV_DEBUG == getloglevel() ){ - if ( !putLogDebug.empty() ){ - buf = boost::io::str( boost::format( "previous endpoint : %s:%d currentweight(%d)" ) + if ( likely(!getloglevel.empty()) ){ + if ( unlikely(LOG_LV_DEBUG == getloglevel()) ){ + if ( likely(!putLogDebug.empty()) ){ + buf = boost::io::str( boost::format( "previous endpoint : %s:%d currentweight(%d)" ) % udp_endpoint.address() % udp_endpoint.port() % vs_weights.currentWeight ); - putLogDebug( 20010, buf, __FILE__, __LINE__); + putLogDebug( 300009, buf, __FILE__, __LINE__); } } } @@ -339,15 +341,15 @@ void schedule_module_weighted_round_robin::handle_schedule( for ( ; itr != inlist_end(); itr = inlist_next( itr ) ){ //! Debug log - if ( !getloglevel.empty() ){ - if ( LOG_LV_DEBUG == getloglevel() ){ - if ( !putLogDebug.empty() ){ + if ( likely(!getloglevel.empty()) ){ + if ( unlikely(LOG_LV_DEBUG == getloglevel()) ){ + if ( likely(!putLogDebug.empty()) ){ buf = boost::io::str( boost::format( "itr : %s:%d weight(%d) currentweight(%d)" ) % itr->udp_endpoint.address() % itr->udp_endpoint.port() % itr->weight % vs_weights.currentWeight ); - putLogDebug( 20011, buf, __FILE__, __LINE__); + putLogDebug( 300010, buf, __FILE__, __LINE__); } } } @@ -369,10 +371,10 @@ void schedule_module_weighted_round_robin::handle_schedule( } END: - if ( !getloglevel.empty() ){ - if ( LOG_LV_DEBUG == getloglevel() ){ - if ( !putLogDebug.empty() ){ - putLogDebug( 20012, "Function out : schedule_module_weighted_round_robin::handle_schedule", __FILE__, __LINE__); + if ( likely(!getloglevel.empty()) ){ + if ( unlikely(LOG_LV_DEBUG == getloglevel()) ){ + if ( likely(!putLogDebug.empty()) ){ + putLogDebug( 300011, "Function out : schedule_module_weighted_round_robin::handle_schedule", __FILE__, __LINE__); } } } @@ -389,12 +391,12 @@ int schedule_module_weighted_round_robin::sched_wrr_service_init( rslist_iterator_next_func_type inlist_next ){ vs_weights.maxWeight = sched_wrr_getMaxWeight( inlist_begin, inlist_end, inlist_next ); - if ( vs_weights.maxWeight <= 0 ){ + if ( unlikely(vs_weights.maxWeight <= 0) ){ return -1; } vs_weights.gcd = sched_wrr_getGCD( inlist_begin, inlist_end, inlist_next ); - if ( vs_weights.gcd <= 0 ){ + if ( unlikely(vs_weights.gcd <= 0) ){ return -1; } return 0; @@ -431,7 +433,7 @@ int schedule_module_weighted_round_robin::sched_wrr_gcd( int a, int b ){ } } - return ( a ); + return ( a ); } int schedule_module_weighted_round_robin::sched_wrr_getGCD( @@ -448,7 +450,7 @@ int schedule_module_weighted_round_robin::sched_wrr_getGCD( break; } } - if ( itr == inlist_end() ){ + if ( unlikely(itr == inlist_end()) ){ //! no data return -1; } diff --git a/unit_tests/module_test/http_protocol_module_base_test/http_protocol_module_base_test.cpp b/unit_tests/module_test/http_protocol_module_base_test/http_protocol_module_base_test.cpp index 1401883a..5c1176e1 100644 --- a/unit_tests/module_test/http_protocol_module_base_test/http_protocol_module_base_test.cpp +++ b/unit_tests/module_test/http_protocol_module_base_test/http_protocol_module_base_test.cpp @@ -10,15 +10,15 @@ using namespace l7vs; #define CHECK_METHOD_OK_STRING_NUM (16) #define CHECK_METHOD_NG_STRING_NUM (8) -#define CHECK_METHOD_INPOSSIBLE_STRING_NUM (3) +#define CHECK_METHOD_IMPOSSIBLE_STRING_NUM (3) #define CHECK_VERSION_OK_STRING_NUM (10) #define CHECK_VERSION_NG_STRING_NUM (16) -#define CHECK_VERSION_INPOSSIBLE_STRING_NUM (4) +#define CHECK_VERSION_IMPOSSIBLE_STRING_NUM (4) #define CHECK_STATUS_CODE_OK_STRING_NUM (6) #define CHECK_STATUS_CODE_NG_STRING_NUM (9) -#define CHECK_STATUS_CODE_INPOSSIBLE_STRING_NUM (2) +#define CHECK_STATUS_CODE_IMPOSSIBLE_STRING_NUM (2) #define FIND_URI_OK_STRING_NUM (4) #define FIND_URI_NG_STRING_NUM (4) @@ -236,11 +236,11 @@ void check_http_method_test(){ "get /abc/GET /abc/def/ HTTP/1.0", "GET /abc/def/ HTTP/1.0 GET /abc/def/ HTTP/1.0", }; - char buffer_inpossible[CHECK_METHOD_INPOSSIBLE_STRING_NUM][256] + char buffer_http_utility[CHECK_METHOD_IMPOSSIBLE_STRING_NUM][256] = { -// unit_test[25] check_http_method( CheckData = "GET / HTTP/1.0" / Result = INPOSSIBLE ) -// unit_test[26] check_http_method( CheckData = "Get / HTTP/1.0" / Result = INPOSSIBLE ) -// unit_test[27] check_http_method( CheckData = "" / Result = INPOSSIBLE ) +// unit_test[25] check_http_method( CheckData = "GET / HTTP/1.0" / Result = IMPOSSIBLE ) +// unit_test[26] check_http_method( CheckData = "Get / HTTP/1.0" / Result = IMPOSSIBLE ) +// unit_test[27] check_http_method( CheckData = "" / Result = IMPOSSIBLE ) "GET / HTTP/1.0", "Get / HTTP/1.0", "", @@ -271,15 +271,15 @@ void check_http_method_test(){ BOOST_CHECK( check_http_method( (const char*)buffer_ng[i], buffer_len ) == CHECK_NG ); } - for( int i = 0; i < CHECK_METHOD_INPOSSIBLE_STRING_NUM; i++, count++ ){ + for( int i = 0; i < CHECK_METHOD_IMPOSSIBLE_STRING_NUM; i++, count++ ){ std::cout.width(2); std::cout.fill('0'); std::cout << count << "---------------------------------------" << std::endl; - std::cout << "String = [" << buffer_inpossible[i] << "]" << std::endl; - buffer_len = strlen( buffer_inpossible[i] ); + std::cout << "String = [" << buffer_http_utility[i] << "]" << std::endl; + buffer_len = strlen( buffer_http_utility[i] ); std::cout << "Length = [" << buffer_len << "]" << std::endl; // [25] - [27] - BOOST_CHECK( check_http_method( (const char*)buffer_inpossible[i], buffer_len ) == CHECK_INPOSSIBLE ); + BOOST_CHECK( check_http_method( (const char*)buffer_http_utility[i], buffer_len ) == CHECK_IMPOSSIBLE ); } std::cout.width(2); @@ -317,7 +317,7 @@ void check_http_method_test_thread( int thread_no, bool* ret ){ // unit_test[31] check_http_method( CheckData = "HEAD /abc/def/ HTTP/1.0" / Result = OK / ThreadNo = 2 ) // unit_test[32] check_http_method( CheckData = "get /abc/def/ HTTP/1.0" / Result = NG / ThreadNo = 3 ) // unit_test[33] check_http_method( CheckData = "Get /abc/def/ HTTP/1.0" / Result = NG / ThreadNo = 4 ) -// unit_test[34] check_http_method( CheckData = "" / Result = INPOSSIBLE / ThreadNo = 5 ) +// unit_test[34] check_http_method( CheckData = "" / Result = IMPOSSIBLE / ThreadNo = 5 ) "GET /abc/def/ HTTP/1.0", "HEAD /abc/def/ HTTP/1.0", "get /abc/def/ HTTP/1.0", @@ -340,7 +340,7 @@ void check_http_method_test_thread( int thread_no, bool* ret ){ CHECK_OK, CHECK_NG, CHECK_NG, - CHECK_INPOSSIBLE, + CHECK_IMPOSSIBLE, }; l7vs::http_protocol_module_base::CHECK_RESULT_TAG check_result; @@ -441,12 +441,12 @@ void check_http_version_test(){ "HTTP/1.1404abcdff", "http/1.0 100 abcdff", }; - char buffer_inpossible[CHECK_VERSION_INPOSSIBLE_STRING_NUM][256] + char buffer_http_utility[CHECK_VERSION_IMPOSSIBLE_STRING_NUM][256] = { -// unit_test[27] check_http_version( CheckData = "GET /abc/def/ HTTP/1.0" / Result = INPOSSIBLE ) -// unit_test[28] check_http_version( CheckData = "GET /abc/def/ H" / Result = INPOSSIBLE ) -// unit_test[29] check_http_version( CheckData = "Get /abc/def/ H" / Result = INPOSSIBLE ) -// unit_test[30] check_http_version( CheckData = "" / Result = INPOSSIBLE ) +// unit_test[27] check_http_version( CheckData = "GET /abc/def/ HTTP/1.0" / Result = IMPOSSIBLE ) +// unit_test[28] check_http_version( CheckData = "GET /abc/def/ H" / Result = IMPOSSIBLE ) +// unit_test[29] check_http_version( CheckData = "Get /abc/def/ H" / Result = IMPOSSIBLE ) +// unit_test[30] check_http_version( CheckData = "" / Result = IMPOSSIBLE ) "GET /abc/def/ HTTP/1.0", "GET /abc/def/ H", "Get /abc/def/ H", @@ -478,15 +478,15 @@ void check_http_version_test(){ BOOST_CHECK( check_http_version( (const char*)buffer_ng[i], buffer_len ) == CHECK_NG ); } - for( int i = 0; i < CHECK_VERSION_INPOSSIBLE_STRING_NUM; i++, count++ ){ + for( int i = 0; i < CHECK_VERSION_IMPOSSIBLE_STRING_NUM; i++, count++ ){ std::cout.width(2); std::cout.fill('0'); std::cout << count << "---------------------------------------" << std::endl; - std::cout << "String = [" << buffer_inpossible[i] << "]" << std::endl; - buffer_len = strlen( buffer_inpossible[i] ); + std::cout << "String = [" << buffer_http_utility[i] << "]" << std::endl; + buffer_len = strlen( buffer_http_utility[i] ); std::cout << "Length = [" << buffer_len << "]" << std::endl; // [27] - [30] - BOOST_CHECK( check_http_version( (const char*)buffer_inpossible[i], buffer_len ) == CHECK_INPOSSIBLE ); + BOOST_CHECK( check_http_version( (const char*)buffer_http_utility[i], buffer_len ) == CHECK_IMPOSSIBLE ); } std::cout.width(2); @@ -524,7 +524,7 @@ void check_http_version_test_thread( int thread_no, bool* ret ){ // unit_test[34] check_http_version( CheckData = "HTTP/1.0 100 abcdff" / Result = OK / ThreadNo = 2 ) // unit_test[35] check_http_version( CheckData = "GET /abc/def/ HTTP/0.0" / Result = NG / ThreadNo = 3 ) // unit_test[36] check_http_version( CheckData = "HTTP/0.0 100 abcdff" / Result = NG / ThreadNo = 4 ) -// unit_test[37] check_http_version( CheckData = "" / Result = INPOSSIBLE / ThreadNo = 5 ) +// unit_test[37] check_http_version( CheckData = "" / Result = IMPOSSIBLE / ThreadNo = 5 ) "GET /abc/def/ HTTP/1.0", "HTTP/1.0 100 abcdff", "GET /abc/def/ HTTP/0.0", @@ -547,7 +547,7 @@ void check_http_version_test_thread( int thread_no, bool* ret ){ CHECK_OK, CHECK_NG, CHECK_NG, - CHECK_INPOSSIBLE, + CHECK_IMPOSSIBLE, }; l7vs::http_protocol_module_base::CHECK_RESULT_TAG check_result; @@ -627,10 +627,10 @@ void check_status_code_test(){ "HTTP/1.0 1a0 abcdff", "HTTP/1.0 10a abcdff", }; - char buffer_inpossible[CHECK_STATUS_CODE_INPOSSIBLE_STRING_NUM][256] + char buffer_http_utility[CHECK_STATUS_CODE_IMPOSSIBLE_STRING_NUM][256] = { -// unit_test[16] check_status_code( CheckData = "HTTP/1.0 100" / Result = INPOSSIBLE ) -// unit_test[17] check_status_code( CheckData = "" / Result = INPOSSIBLE ) +// unit_test[16] check_status_code( CheckData = "HTTP/1.0 100" / Result = IMPOSSIBLE ) +// unit_test[17] check_status_code( CheckData = "" / Result = IMPOSSIBLE ) "HTTP/1.0 100", "", }; @@ -660,15 +660,15 @@ void check_status_code_test(){ BOOST_CHECK( check_status_code( (const char*)buffer_ng[i], buffer_len ) == CHECK_NG ); } - for( int i = 0; i < CHECK_STATUS_CODE_INPOSSIBLE_STRING_NUM; i++, count++ ){ + for( int i = 0; i < CHECK_STATUS_CODE_IMPOSSIBLE_STRING_NUM; i++, count++ ){ std::cout.width(2); std::cout.fill('0'); std::cout << count << "---------------------------------------" << std::endl; - std::cout << "String = [" << buffer_inpossible[i] << "] + [CR]" << std::endl; - buffer_len = strlen( buffer_inpossible[i] ); + std::cout << "String = [" << buffer_http_utility[i] << "] + [CR]" << std::endl; + buffer_len = strlen( buffer_http_utility[i] ); std::cout << "Length = [" << buffer_len << "]" << std::endl; // [16] - [17] - BOOST_CHECK( check_status_code( (const char*)buffer_inpossible[i], buffer_len ) == CHECK_INPOSSIBLE ); + BOOST_CHECK( check_status_code( (const char*)buffer_http_utility[i], buffer_len ) == CHECK_IMPOSSIBLE ); } std::cout.width(2); @@ -706,7 +706,7 @@ void check_status_code_test_thread( int thread_no, bool* ret ){ // unit_test[21] check_status_code( CheckData = "HTTP/1.0 399 abcdff" / Result = OK / ThreadNo = 2 ) // unit_test[22] check_status_code( CheckData = "HTTP/1.0 099 abcdff" / Result = NG / ThreadNo = 3 ) // unit_test[23] check_status_code( CheckData = "HTTP/1.0 400 abcdff" / Result = NG / ThreadNo = 4 ) -// unit_test[24] check_status_code( CheckData = "" / Result = INPOSSIBLE / ThreadNo = 5 ) +// unit_test[24] check_status_code( CheckData = "" / Result = IMPOSSIBLE / ThreadNo = 5 ) "HTTP/1.0 100 abcdff", "HTTP/1.0 399 abcdff", "HTTP/1.0 099 abcdff", @@ -729,7 +729,7 @@ void check_status_code_test_thread( int thread_no, bool* ret ){ CHECK_OK, CHECK_NG, CHECK_NG, - CHECK_INPOSSIBLE, + CHECK_IMPOSSIBLE, }; l7vs::http_protocol_module_base::CHECK_RESULT_TAG check_result; @@ -1556,7 +1556,7 @@ void check_http_method_and_version_test(){ "/abc/def/ghi HTTP/1.0", "GET /abc/def/ http/1.0", }; -/* char buffer_inpossible[5][256] +/* char buffer_http_utility[5][256] = { "GET / HTTP/1.0", "GET / HTTP/1.1", @@ -1595,11 +1595,11 @@ void check_http_method_and_version_test(){ std::cout.width(2); std::cout.fill('0'); std::cout << count << "---------------------------------------" << std::endl; - std::cout << "String = [" << buffer_inpossible[i] << "]" << std::endl; - buffer_len = strlen( buffer_inpossible[i] ); + std::cout << "String = [" << buffer_http_utility[i] << "]" << std::endl; + buffer_len = strlen( buffer_http_utility[i] ); std::cout << "Length = [" << buffer_len << "]" << std::endl; BOOST_CHECK( check_http_method_and_version( - (const char*)buffer_inpossible[i], buffer_len ) == CHECK_INPOSSIBLE ); + (const char*)buffer_http_utility[i], buffer_len ) == CHECK_IMPOSSIBLE ); } */ std::cout.width(2); @@ -1646,7 +1646,7 @@ void check_http_version_and_status_code_test(){ "HTTP/1.0 099 abcdff", "HTTP/1.0 400 abcdff", }; - char buffer_inpossible[2][256] + char buffer_http_utility[2][256] = { "HTTP/1.0 100 abcdff", "", @@ -1681,11 +1681,11 @@ void check_http_version_and_status_code_test(){ std::cout.width(2); std::cout.fill('0'); std::cout << count << "---------------------------------------" << std::endl; - std::cout << "String = [" << buffer_inpossible[i] << "]" << std::endl; - buffer_len = strlen( buffer_inpossible[i] ); + std::cout << "String = [" << buffer_http_utility[i] << "]" << std::endl; + buffer_len = strlen( buffer_http_utility[i] ); std::cout << "Length = [" << buffer_len << "]" << std::endl; BOOST_CHECK( check_http_version_and_status_code( - (const char*)buffer_inpossible[i], buffer_len ) == CHECK_INPOSSIBLE ); + (const char*)buffer_http_utility[i], buffer_len ) == CHECK_IMPOSSIBLE ); } std::cout.width(2); diff --git a/unit_tests/module_test/http_utility_test/Makefile b/unit_tests/module_test/http_utility_test/Makefile new file mode 100644 index 00000000..b8c7d133 --- /dev/null +++ b/unit_tests/module_test/http_utility_test/Makefile @@ -0,0 +1,38 @@ +# +# +# Makefile for http_utility_base unit test frameworks. +# +# +TARGET = http_utility_ut +CPP = g++ +CPPFLAGS = -O0 -g -Werror -Wall -pthread -DMAX_BUFFER_SIZE=65535 -DDEBUG +INCLUDES = -I../../../logger \ + -I../../../parameter \ + -I../../../include \ + -I../../../module/protocol \ + -I../../../src +LIBS = -lboost_system-gcc41-mt \ + -lboost_thread-gcc41-mt \ + -lboost_regex-gcc41-mt \ + -lboost_unit_test_framework-gcc41-mt + +LDFLAGS = -lrt -ldl + +SRCS = \ + ../../../module/protocol/http_utility.cpp \ + http_utility_test.cpp + + +.SUFFIX: .cpp .o +.cpp.o: + $(CPP) $(CPPFLAGS) $(INCLUDES) -c $< -o $@ + +OBJS = $(SRCS:.cpp=.o) + +all: $(TARGET) + +$(TARGET): $(OBJS) + $(CPP) $(INCLUDES) -o $@ $(OBJS) $(LIBS) + +clean: + rm -f $(TARGET) $(OBJS) diff --git a/unit_tests/module_test/http_utility_test/http_utility_test.cpp b/unit_tests/module_test/http_utility_test/http_utility_test.cpp new file mode 100644 index 00000000..635a1688 --- /dev/null +++ b/unit_tests/module_test/http_utility_test/http_utility_test.cpp @@ -0,0 +1,1328 @@ +#define TEST_CASE + +#include +#include +#include +#include "http_utility.h" + +using namespace boost::unit_test_framework; +using namespace l7vs; + +#define CHECK_METHOD_OK_STRING_NUM (16) +#define CHECK_METHOD_NG_STRING_NUM (8) +#define CHECK_METHOD_IMPOSSIBLE_STRING_NUM (3) + +#define CHECK_VERSION_OK_STRING_NUM (10) +#define CHECK_VERSION_NG_STRING_NUM (16) +#define CHECK_VERSION_IMPOSSIBLE_STRING_NUM (4) + +#define CHECK_STATUS_CODE_OK_STRING_NUM (6) +#define CHECK_STATUS_CODE_NG_STRING_NUM (9) +#define CHECK_STATUS_CODE_IMPOSSIBLE_STRING_NUM (2) + +#define FIND_URI_OK_STRING_NUM (4) +#define FIND_URI_NG_STRING_NUM (4) + +#define FIND_STATUS_CODE_OK_STRING_NUM (2) +#define FIND_STATUS_CODE_NG_STRING_NUM (4) + +#define THREAD_LOOP_NUM (1) + + +//--test class-- +class http_utility_test : public http_utility { +public: +boost::mutex sync_mutex; +boost::condition sync_condition; +http_utility_test(){} +~http_utility_test(){} + +void find_uri_test(){ + + int count = 1; + + char disp_uri[256]; + + char buffer_ok[FIND_URI_OK_STRING_NUM][256] + = { +// unit_test[01] find_uri( FindData = "GET /abc/def/ HTTP/1.0" / Result = true ) +// unit_test[02] find_uri( FindData = "GET /abc/def/ghi HTTP/1.0" / Result = true ) +// unit_test[03] find_uri( FindData = "HEAD abcdef HTTP/1.0" / Result = true ) +// unit_test[04] find_uri( FindData = "HEAD /abc/def/ghi/jkl/mno/pqr/stu/vwx/yz0/123/456/789/ HTTP/1.0" / Result = true ) + "GET /abc/def/ HTTP/1.0", + "GET /abc/def/ghi HTTP/1.0", + "HEAD abcdef HTTP/1.0", + "HEAD /abc/def/ghi/jkl/mno/pqr/stu/vwx/yz0/123/456/789/ HTTP/1.0", + }; + + char buffer_ng[FIND_URI_NG_STRING_NUM][256] + = { +// unit_test[05] find_uri( FindData = "GET/abc/def/ HTTP/1.0" / Result = false ) +// unit_test[06] find_uri( FindData = "GET /abc/def/HTTP/1.0" / Result = false ) +// unit_test[07] find_uri( FindData = "HEAD/abc/def/HTTP/1.0" / Result = false ) +// unit_test[08] find_uri( FindData = "" / Result = false ) + "GET/abc/def/ HTTP/1.0", + "GET /abc/def/HTTP/1.0", + "HEAD/abc/def/HTTP/1.0", + "", + }; + + size_t buffer_len = 0; + size_t uri_offset = 0; + size_t uri_len = 0; + + for( int i = 0; i < FIND_URI_OK_STRING_NUM; i++, count++ ){ + std::cout.width(2); + std::cout.fill('0'); + std::cout << count << "---------------------------------------" << std::endl; + memset( disp_uri, '\0', 256 ); + uri_offset = 0; + uri_len = 0; + std::cout << "String = [" << buffer_ok[i] << "] + [CR]" << std::endl; + buffer_ok[i][strlen( buffer_ok[i] )] = '\r'; + buffer_len = strlen( buffer_ok[i] ); + std::cout << "Length = [" << buffer_len << "]" << std::endl; + // [01] - [04] + BOOST_CHECK( find_uri( (const char*)buffer_ok[i], buffer_len, uri_offset, uri_len ) == true ); + memcpy( disp_uri, buffer_ok[i] + uri_offset, uri_len ); + std::cout << "URI Offset = [" << uri_offset << "]" << std::endl; + std::cout << "URI Length = [" << uri_len << "]" << std::endl; + std::cout << "URI String = [" << disp_uri << "]" << std::endl; + } + + for( int i = 0; i < FIND_URI_NG_STRING_NUM; i++, count++ ){ + std::cout.width(2); + std::cout.fill('0'); + std::cout << count << "---------------------------------------" << std::endl; + memset( disp_uri, '\0', 256 ); + uri_offset = 0; + uri_len = 0; + std::cout << "String = [" << buffer_ng[i] << "] + [CR]" << std::endl; + buffer_ng[i][strlen( buffer_ng[i] )] = '\r'; + buffer_len = strlen( buffer_ng[i] ); + std::cout << "Length = [" << buffer_len << "]" << std::endl; + // [05] - [07] + BOOST_CHECK( find_uri( (const char*)buffer_ng[i], buffer_len, uri_offset, uri_len ) == false ); + memcpy( disp_uri, buffer_ng[i] + uri_offset, uri_len ); + std::cout << "URI Offset = [" << uri_offset << "]" << std::endl; + std::cout << "URI Length = [" << uri_len << "]" << std::endl; + std::cout << "URI String = [" << disp_uri << "]" << std::endl; + } + + std::cout.width(2); + std::cout.fill('0'); + std::cout << count << "---------------------------------------" << std::endl; + memset( disp_uri, '\0', 256 ); + uri_offset = 0; + uri_len = 0; + buffer_len = 0; + std::cout << "String = [NULL]" << std::endl; + std::cout << "Length = [" << buffer_len << "]" << std::endl; +// unit_test[09] find_uri( FindData = NULL, Length = 0 / Result = false ) + BOOST_CHECK( find_uri( NULL, buffer_len, uri_offset, uri_len ) == false ); + std::cout << "URI Offset = [" << uri_offset << "]" << std::endl; + std::cout << "URI Length = [" << uri_len << "]" << std::endl; + std::cout << "URI String = [" << disp_uri << "]" << std::endl; + count++; + + std::cout.width(2); + std::cout.fill('0'); + std::cout << count << "---------------------------------------" << std::endl; + memset( disp_uri, '\0', 256 ); + uri_offset = 0; + uri_len = 0; + buffer_len = 100; + std::cout << "String = [NULL]" << std::endl; + std::cout << "Length = [" << buffer_len << "]" << std::endl; +// unit_test[10] find_uri( FindData = NULL, Length = 100 / Result = false ) + BOOST_CHECK( find_uri( NULL, buffer_len, uri_offset, uri_len ) == false ); + std::cout << "URI Offset = [" << uri_offset << "]" << std::endl; + std::cout << "URI Length = [" << uri_len << "]" << std::endl; + std::cout << "URI String = [" << disp_uri << "]" << std::endl; + count++; + +} + +void find_uri_test_thread( int thread_no, bool* ret ){ + + boost::xtime start_time; + boost::xtime end_time; + + int count = 1; + + char disp_uri[256]; + + char buffer[5][256] + = { +// unit_test[11] find_uri( FindData = "GET /abc/def/ HTTP/1.0" / Result = true / ThreadNo = 1 ) +// unit_test[12] find_uri( FindData = "HEAD /abc/def/ghi/jkl/mno/pqr/stu/vwx/yz0/123/456/789/ HTTP/1.0" / Result = true / ThreadNo = 2 ) +// unit_test[13] find_uri( FindData = "GET/abc/def/ HTTP/1.0" / Result = false / ThreadNo = 3 ) +// unit_test[14] find_uri( FindData = "HEAD/abc/def/HTTP/1.0" / Result = false / ThreadNo = 4 ) +// unit_test[15] find_uri( FindData = "" / Result = false / ThreadNo = 5 ) + "GET /abc/def/ HTTP/1.0", + "HEAD /abc/def/ghi/jkl/mno/pqr/stu/vwx/yz0/123/456/789/ HTTP/1.0", + "GET/abc/def/ HTTP/1.0", + "HEAD/abc/def/HTTP/1.0", + "", + }; + + int edit_flag[5] + = { + 1, + 1, + 1, + 1, + 0, + }; + + bool result[5] + = { + true, + true, + false, + false, + false, + }; + + bool find_result; + + size_t buffer_len = 0; + size_t uri_offset = 0; + size_t uri_len = 0; + + std::cout << "[Thread_" << thread_no << "] "; + std::cout.width(2); + std::cout.fill('0'); + std::cout << count << "---------------------------------------" << std::endl; + memset( disp_uri, '\0', 256 ); + uri_offset = 0; + uri_len = 0; + std::cout << "[Thread_" << thread_no << "] " << "String = [" << buffer[thread_no-1] << "]" << std::endl; + if( edit_flag[thread_no-1] == 1){ + buffer[thread_no-1][strlen( buffer[thread_no-1] )] = '\r'; + } + buffer_len = strlen( buffer[thread_no-1] ); + std::cout << "[Thread_" << thread_no << "] " << "Length = [" << buffer_len << "]" << std::endl; + std::cout << "[Thread_" << thread_no << "] " << "Wait..." << std::endl; + { + boost::mutex::scoped_lock lk( sync_mutex ); + sync_condition.wait( lk ); + } + boost::xtime_get(&start_time, boost::TIME_UTC); + // [11] - [15] + find_result = find_uri( (const char*)buffer[thread_no-1], buffer_len, uri_offset, uri_len ); + if( find_result == result[thread_no-1] ){ + *ret = true; + } + else{ + *ret = false; + } +// BOOST_CHECK( find_uri( (const char*)buffer[thread_no-1], buffer_len, uri_offset, uri_len ) == result[thread_no-1] ); + boost::xtime_get(&end_time, boost::TIME_UTC); + memcpy( disp_uri, buffer[thread_no-1] + uri_offset, uri_len ); + std::cout << "[Thread_" << thread_no << "] " << "URI Offset = [" << uri_offset << "]" << std::endl; + std::cout << "[Thread_" << thread_no << "] " << "URI Length = [" << uri_len << "]" << std::endl; + std::cout << "[Thread_" << thread_no << "] " << "URI String = [" << disp_uri << "]" << std::endl; + std::cout << "[Thread_" << thread_no << "] " << "StartTime = [" << start_time.nsec << "]" << std::endl; + std::cout << "[Thread_" << thread_no << "] " << "EndTime = [" << end_time.nsec << "]" << std::endl; + std::cout << "[Thread_" << thread_no << "] " << "CheckEnd" << std::endl; + +} + + +void find_status_code_test(){ + + int count = 1; + + char disp_status_code[256]; + + char buffer_ok[FIND_STATUS_CODE_OK_STRING_NUM][256] + = { +// unit_test[01] find_status_code( FindData = "HTTP/1.0 000 abcdff" / Result = true ) +// unit_test[02] find_status_code( FindData = "HTTP/1.0 999 abcdff" / Result = true ) + "HTTP/1.0 000 abcdff", + "HTTP/1.0 999 abcdff", + }; + + char buffer_ng[FIND_STATUS_CODE_NG_STRING_NUM][256] + = { +// unit_test[03] find_status_code( FindData = "HTTP/1.0 10 abcdff" / Result = false ) +// unit_test[04] find_status_code( FindData = "HTTP/1.0 1000 abcdff" / Result = false ) +// unit_test[05] find_status_code( FindData = "HTTP/1.0 aaa abcdff" / Result = false ) +// unit_test[06] find_status_code( FindData = "" / Result = false ) + "HTTP/1.0 10 abcdff", + "HTTP/1.0 1000 abcdff", + "HTTP/1.0 aaa abcdff", + "", + }; + + size_t buffer_len = 0; + size_t status_code_offset = 0; + size_t status_code_len = 0; + + for( int i = 0; i < FIND_STATUS_CODE_OK_STRING_NUM; i++, count++ ){ + std::cout.width(2); + std::cout.fill('0'); + std::cout << count << "---------------------------------------" << std::endl; + memset( disp_status_code, '\0', 256 ); + status_code_offset = 0; + status_code_len = 0; + std::cout << "String = [" << buffer_ok[i] << "] + [CR]" << std::endl; + buffer_ok[i][strlen( buffer_ok[i] )] = '\r'; + buffer_len = strlen( buffer_ok[i] ); + std::cout << "Length = [" << buffer_len << "]" << std::endl; + // [01] - [02] + BOOST_CHECK( find_status_code( (const char*)buffer_ok[i], buffer_len, status_code_offset, status_code_len ) == true ); + memcpy( disp_status_code, buffer_ok[i] + status_code_offset, status_code_len ); + std::cout << "STATUS CODE Offset = [" << status_code_offset << "]" << std::endl; + std::cout << "STATUS CODE Length = [" << status_code_len << "]" << std::endl; + std::cout << "STATUS CODE String = [" << disp_status_code << "]" << std::endl; + } + + for( int i = 0; i < FIND_STATUS_CODE_NG_STRING_NUM; i++, count++ ){ + std::cout.width(2); + std::cout.fill('0'); + std::cout << count << "---------------------------------------" << std::endl; + memset( disp_status_code, '\0', 256 ); + status_code_offset = 0; + status_code_len = 0; + std::cout << "String = [" << buffer_ng[i] << "] + [CR]" << std::endl; + buffer_ng[i][strlen( buffer_ng[i] )] = '\r'; + buffer_len = strlen( buffer_ng[i] ); + std::cout << "Length = [" << buffer_len << "]" << std::endl; + // [03] - [06] + BOOST_CHECK( find_status_code( (const char*)buffer_ng[i], buffer_len, status_code_offset, status_code_len ) == false ); + memcpy( disp_status_code, buffer_ng[i] + status_code_offset, status_code_len ); + std::cout << "STATUS CODE Offset = [" << status_code_offset << "]" << std::endl; + std::cout << "STATUS CODE Length = [" << status_code_len << "]" << std::endl; + std::cout << "STATUS CODE String = [" << disp_status_code << "]" << std::endl; + } + + std::cout.width(2); + std::cout.fill('0'); + std::cout << count << "---------------------------------------" << std::endl; + memset( disp_status_code, '\0', 256 ); + status_code_offset = 0; + status_code_len = 0; + buffer_len = 0; + std::cout << "String = [NULL]" << std::endl; + std::cout << "Length = [" << buffer_len << "]" << std::endl; +// unit_test[07] find_status_code( FindData = NULL, Length = 0 / Result = false ) + BOOST_CHECK( find_status_code( NULL, buffer_len, status_code_offset, status_code_len ) == false ); + std::cout << "STATUS CODE Offset = [" << status_code_offset << "]" << std::endl; + std::cout << "STATUS CODE Length = [" << status_code_len << "]" << std::endl; + std::cout << "STATUS CODE String = [" << disp_status_code << "]" << std::endl; + count++; + + std::cout.width(2); + std::cout.fill('0'); + std::cout << count << "---------------------------------------" << std::endl; + memset( disp_status_code, '\0', 256 ); + status_code_offset = 0; + status_code_len = 0; + buffer_len = 0; + std::cout << "String = [NULL]" << std::endl; + std::cout << "Length = [" << buffer_len << "]" << std::endl; +// unit_test[08] find_status_code( FindData = NULL, Length = 100 / Result = false ) + BOOST_CHECK( find_status_code( NULL, buffer_len, status_code_offset, status_code_len ) == false ); + std::cout << "STATUS CODE Offset = [" << status_code_offset << "]" << std::endl; + std::cout << "STATUS CODE Length = [" << status_code_len << "]" << std::endl; + std::cout << "STATUS CODE String = [" << disp_status_code << "]" << std::endl; + count++; + +} + +void find_status_code_test_thread( int thread_no, bool* ret ){ + + boost::xtime start_time; + boost::xtime end_time; + + int count = 1; + + char disp_status_code[256]; + + char buffer[5][256] + = { +// unit_test[09] find_status_code( FindData = "HTTP/1.0 000 abcdff" / Result = true / ThreadNo = 1 ) +// unit_test[10] find_status_code( FindData = "HTTP/1.0 999 abcdff" / Result = true / ThreadNo = 2 ) +// unit_test[11] find_status_code( FindData = "HTTP/1.0 10 abcdff" / Result = false / ThreadNo = 3 ) +// unit_test[12] find_status_code( FindData = "HTTP/1.0 1000 abcdff" / Result = false / ThreadNo = 4 ) +// unit_test[13] find_status_code( FindData = "" / Result = false / ThreadNo = 5 ) + "HTTP/1.0 000 abcdff", + "HTTP/1.0 999 abcdff", + "HTTP/1.0 10 abcdff", + "HTTP/1.0 1000 abcdff", + "", + }; + + int edit_flag[5] + = { + 1, + 1, + 1, + 1, + 0, + }; + + bool result[5] + = { + true, + true, + false, + false, + false, + }; + + bool find_result; + + size_t buffer_len = 0; + size_t status_code_offset = 0; + size_t status_code_len = 0; + + std::cout << "[Thread_" << thread_no << "] "; + std::cout.width(2); + std::cout.fill('0'); + std::cout << count << "---------------------------------------" << std::endl; + memset( disp_status_code, '\0', 256 ); + status_code_offset = 0; + status_code_len = 0; + std::cout << "[Thread_" << thread_no << "] " << "String = [" << buffer[thread_no-1] << "]" << std::endl; + if( edit_flag[thread_no-1] == 1){ + buffer[thread_no-1][strlen( buffer[thread_no-1] )] = '\r'; + } + buffer_len = strlen( buffer[thread_no-1] ); + std::cout << "[Thread_" << thread_no << "] " << "Length = [" << buffer_len << "]" << std::endl; + std::cout << "[Thread_" << thread_no << "] " << "Wait..." << std::endl; + { + boost::mutex::scoped_lock lk( sync_mutex ); + sync_condition.wait( lk ); + } + boost::xtime_get(&start_time, boost::TIME_UTC); + // [09] - [13] + find_result = find_status_code( (const char*)buffer[thread_no-1], buffer_len, status_code_offset, status_code_len ); + if( find_result == result[thread_no-1] ){ + *ret = true; + } + else{ + *ret = false; + } +// BOOST_CHECK( find_status_code( (const char*)buffer[thread_no-1], buffer_len, status_code_offset, status_code_len ) == result[thread_no-1] ); + boost::xtime_get(&end_time, boost::TIME_UTC); + memcpy( disp_status_code, buffer[thread_no-1] + status_code_offset, status_code_len ); + std::cout << "[Thread_" << thread_no << "] " << "STATUS CODE Offset = [" << status_code_offset << "]" << std::endl; + std::cout << "[Thread_" << thread_no << "] " << "STATUS CODE Length = [" << status_code_len << "]" << std::endl; + std::cout << "[Thread_" << thread_no << "] " << "STATUS CODE String = [" << disp_status_code << "]" << std::endl; + std::cout << "[Thread_" << thread_no << "] " << "StartTime = [" << start_time.nsec << "]" << std::endl; + std::cout << "[Thread_" << thread_no << "] " << "EndTime = [" << end_time.nsec << "]" << std::endl; + std::cout << "[Thread_" << thread_no << "] " << "CheckEnd" << std::endl; + +} + +void find_http_header_test(){ + + int count = 1; + int i = 0; + int j = 0; + + char disp_http_header[4096]; + + std::string http_header_name[10] + = { + "Cookie", + "X-Forwarded-For", + "Cookie2", + "X-Forwarded-For2", + "", + "cookie", + "COOKIE", + "content-length", + "Content-Length", + "CONTENT-LENGTH", + }; + + bool result_1[10] + = { +// unit_test[01] find_http_header( FindData = "...Cookie: 10.10.10.10:11111...BlankLine...", HeaderName = "Cookie", ReturnCode = "\r" / Result = true ) +// unit_test[02] find_http_header( FindData = "...X-Forwarded-For: 20.20.20.20...BlankLine...", HeaderName = "X-Forwarded-For", ReturnCode = "\r" / Result = true ) +// unit_test[03] find_http_header( FindData = "...BlankLine...Cookie2: 30.30.30.30:33333...", HeaderName = "Cookie2", ReturnCode = "\r" / Result = false ) +// unit_test[04] find_http_header( FindData = "...BlankLine...X-Forwarded-For2: 40.40.40.40...", HeaderName = "X-Forwarded-For2", ReturnCode = "\r" / Result = false ) +// unit_test[05] find_http_header( FindData = "...BlankLine...", HeaderName = "", ReturnCode = "\r" / Result = true ) +// unit_test[06] find_http_header( FindData = "...Cookie: 10.10.10.10:11111...BlankLine...", HeaderName = "cookie", ReturnCode = "\r" / Result = true ) +// unit_test[07] find_http_header( FindData = "...Cookie: 10.10.10.10:11111...BlankLine...", HeaderName = "COOKIE", ReturnCode = "\r" / Result = true ) +// unit_test[08] find_http_header( FindData = "...CONTENT-LENGTH: 1000...BlankLine...", HeaderName = "content-length", ReturnCode = "\r" / Result = true ) +// unit_test[09] find_http_header( FindData = "...CONTENT-LENGTH: 1000...BlankLine...", HeaderName = "Content-Length", ReturnCode = "\r" / Result = true ) +// unit_test[10] find_http_header( FindData = "...CONTENT-LENGTH: 1000...BlankLine...", HeaderName = "CONTENT-LENGTH", ReturnCode = "\r" / Result = true ) + +// unit_test[11] find_http_header( FindData = "...Cookie: 10.10.10.10:11111...BlankLine...", HeaderName = "Cookie", ReturnCode = "\n" / Result = true ) +// unit_test[12] find_http_header( FindData = "...X-Forwarded-For: 20.20.20.20...BlankLine...", HeaderName = "X-Forwarded-For", ReturnCode = "\n" / Result = true ) +// unit_test[13] find_http_header( FindData = "...BlankLine...Cookie2: 30.30.30.30:33333...", HeaderName = "Cookie2", ReturnCode = "\n" / Result = false ) +// unit_test[14] find_http_header( FindData = "...BlankLine...X-Forwarded-For2: 40.40.40.40...", HeaderName = "X-Forwarded-For2", ReturnCode = "\n" / Result = false ) +// unit_test[15] find_http_header( FindData = "...BlankLine...", HeaderName = "", ReturnCode = "\n" / Result = true ) +// unit_test[16] find_http_header( FindData = "...Cookie: 10.10.10.10:11111...BlankLine...", HeaderName = "cookie", ReturnCode = "\n" / Result = true ) +// unit_test[17] find_http_header( FindData = "...Cookie: 10.10.10.10:11111...BlankLine...", HeaderName = "COOKIE", ReturnCode = "\n" / Result = true ) +// unit_test[18] find_http_header( FindData = "...CONTENT-LENGTH: 1000...BlankLine...", HeaderName = "content-length", ReturnCode = "\n" / Result = true ) +// unit_test[19] find_http_header( FindData = "...CONTENT-LENGTH: 1000...BlankLine...", HeaderName = "Content-Length", ReturnCode = "\n" / Result = true ) +// unit_test[20] find_http_header( FindData = "...CONTENT-LENGTH: 1000...BlankLine...", HeaderName = "CONTENT-LENGTH", ReturnCode = "\n" / Result = true ) + +// unit_test[21] find_http_header( FindData = "...Cookie: 10.10.10.10:11111...BlankLine...", HeaderName = "Cookie", ReturnCode = "\r\n" / Result = true ) +// unit_test[22] find_http_header( FindData = "...X-Forwarded-For: 20.20.20.20...BlankLine...", HeaderName = "X-Forwarded-For", ReturnCode = "\r\n" / Result = true ) +// unit_test[23] find_http_header( FindData = "...BlankLine...Cookie2: 30.30.30.30:33333...", HeaderName = "Cookie2", ReturnCode = "\r\n" / Result = false ) +// unit_test[24] find_http_header( FindData = "...BlankLine...X-Forwarded-For2: 40.40.40.40...", HeaderName = "X-Forwarded-For2", ReturnCode = "\r\n" / Result = false ) +// unit_test[25] find_http_header( FindData = "...BlankLine...", HeaderName = "", ReturnCode = "\r\n" / Result = true ) +// unit_test[26] find_http_header( FindData = "...Cookie: 10.10.10.10:11111...BlankLine...", HeaderName = "cookie", ReturnCode = "\r\n" / Result = true ) +// unit_test[27] find_http_header( FindData = "...Cookie: 10.10.10.10:11111...BlankLine...", HeaderName = "COOKIE", ReturnCode = "\r\n" / Result = true ) +// unit_test[28] find_http_header( FindData = "...CONTENT-LENGTH: 1000...BlankLine...", HeaderName = "content-length", ReturnCode = "\r\n" / Result = true ) +// unit_test[29] find_http_header( FindData = "...CONTENT-LENGTH: 1000...BlankLine...", HeaderName = "Content-Length", ReturnCode = "\r\n" / Result = true ) +// unit_test[30] find_http_header( FindData = "...CONTENT-LENGTH: 1000...BlankLine...", HeaderName = "CONTENT-LENGTH", ReturnCode = "\r\n" / Result = true ) + true, + true, + false, + false, + true, + true, + true, + true, + true, + true, + }; + + bool result_2[10] + = { +// unit_test[31] find_http_header( FindData = "BlankLine...Cookie: 10.10.10.10:11111...", HeaderName = "Cookie", ReturnCode = "\r" / Result = false ) +// unit_test[32] find_http_header( FindData = "BlankLine...X-Forwarded-For: 20.20.20.20...", HeaderName = "X-Forwarded-For", ReturnCode = "\r" / Result = false ) +// unit_test[33] find_http_header( FindData = "BlankLine...Cookie2: 30.30.30.30:33333...", HeaderName = "Cookie2", ReturnCode = "\r" / Result = false ) +// unit_test[34] find_http_header( FindData = "BlankLine...X-Forwarded-For2: 40.40.40.40...", HeaderName = "X-Forwarded-For2", ReturnCode = "\r" / Result = false ) +// unit_test[35] find_http_header( FindData = "BlankLine...", HeaderName = "", ReturnCode = "\r" / Result = true ) +// unit_test[36] find_http_header( FindData = "BlankLine...Cookie: 10.10.10.10:11111...", HeaderName = "cookie", ReturnCode = "\r" / Result = false ) +// unit_test[37] find_http_header( FindData = "BlankLine...Cookie: 10.10.10.10:11111...", HeaderName = "COOKIE", ReturnCode = "\r" / Result = false ) +// unit_test[38] find_http_header( FindData = "BlankLine...CONTENT-LENGTH: 1000...", HeaderName = "content-length", ReturnCode = "\r" / Result = false ) +// unit_test[39] find_http_header( FindData = "BlankLine...CONTENT-LENGTH: 1000...", HeaderName = "Content-Length", ReturnCode = "\r" / Result = false ) +// unit_test[40] find_http_header( FindData = "BlankLine...CONTENT-LENGTH: 1000...", HeaderName = "CONTENT-LENGTH", ReturnCode = "\r" / Result = false ) + +// unit_test[41] find_http_header( FindData = "BlankLine...Cookie: 10.10.10.10:11111...", HeaderName = "Cookie", ReturnCode = "\n" / Result = false ) +// unit_test[42] find_http_header( FindData = "BlankLine...X-Forwarded-For: 20.20.20.20...", HeaderName = "X-Forwarded-For", ReturnCode = "\n" / Result = false ) +// unit_test[43] find_http_header( FindData = "BlankLine...Cookie2: 30.30.30.30:33333...", HeaderName = "Cookie2", ReturnCode = "\n" / Result = false ) +// unit_test[44] find_http_header( FindData = "BlankLine...X-Forwarded-For2: 40.40.40.40...", HeaderName = "X-Forwarded-For2", ReturnCode = "\n" / Result = false ) +// unit_test[45] find_http_header( FindData = "BlankLine...", HeaderName = "", ReturnCode = "\n" / Result = true ) +// unit_test[46] find_http_header( FindData = "BlankLine...Cookie: 10.10.10.10:11111...", HeaderName = "cookie", ReturnCode = "\n" / Result = false ) +// unit_test[47] find_http_header( FindData = "BlankLine...Cookie: 10.10.10.10:11111...", HeaderName = "COOKIE", ReturnCode = "\n" / Result = false ) +// unit_test[48] find_http_header( FindData = "BlankLine...CONTENT-LENGTH: 1000...", HeaderName = "content-length", ReturnCode = "\n" / Result = false ) +// unit_test[49] find_http_header( FindData = "BlankLine...CONTENT-LENGTH: 1000...", HeaderName = "Content-Length", ReturnCode = "\n" / Result = false ) +// unit_test[50] find_http_header( FindData = "BlankLine...CONTENT-LENGTH: 1000...", HeaderName = "CONTENT-LENGTH", ReturnCode = "\n" / Result = false ) + +// unit_test[51] find_http_header( FindData = "BlankLine...Cookie: 10.10.10.10:11111...", HeaderName = "Cookie", ReturnCode = "\r\n" / Result = false ) +// unit_test[52] find_http_header( FindData = "BlankLine...X-Forwarded-For: 20.20.20.20...", HeaderName = "X-Forwarded-For", ReturnCode = "\r\n" / Result = false ) +// unit_test[53] find_http_header( FindData = "BlankLine...Cookie2: 30.30.30.30:33333...", HeaderName = "Cookie2", ReturnCode = "\r\n" / Result = false ) +// unit_test[54] find_http_header( FindData = "BlankLine...X-Forwarded-For2: 40.40.40.40...", HeaderName = "X-Forwarded-For2", ReturnCode = "\r\n" / Result = false ) +// unit_test[55] find_http_header( FindData = "BlankLine...", HeaderName = "", ReturnCode = "\r\n" / Result = true ) +// unit_test[56] find_http_header( FindData = "BlankLine...Cookie: 10.10.10.10:11111...", HeaderName = "cookie", ReturnCode = "\r\n" / Result = false ) +// unit_test[57] find_http_header( FindData = "BlankLine...Cookie: 10.10.10.10:11111...", HeaderName = "COOKIE", ReturnCode = "\r\n" / Result = false ) +// unit_test[58] find_http_header( FindData = "BlankLine...CONTENT-LENGTH: 1000...", HeaderName = "content-length", ReturnCode = "\r\n" / Result = false ) +// unit_test[59] find_http_header( FindData = "BlankLine...CONTENT-LENGTH: 1000...", HeaderName = "Content-Length", ReturnCode = "\r\n" / Result = false ) +// unit_test[60] find_http_header( FindData = "BlankLine...CONTENT-LENGTH: 1000...", HeaderName = "CONTENT-LENGTH", ReturnCode = "\r\n" / Result = false ) + false, + false, + false, + false, + true, + false, + false, + false, + false, + false, + }; + + char buffer_all_1[3][4096]; + char buffer_all_2[3][4096]; + + char buffer_line_1[8][256] + = { + "GET /abc/def/ HTTP/1.0", + "Cookie: 10.10.10.10:11111", + "X-Forwarded-For: 20.20.20.20", + "CONTENT-LENGTH: 1000", + "", + "GET /abc/def/ HTTP/1.0", + "Cookie2: 30.30.30.30:33333", + "X-Forwarded-For2: 40.40.40.40", + }; + + + char buffer_line_2[8][256] + = { + "GET /abc/def/ HTTP/1.0", + "", + "Cookie: 10.10.10.10:11111", + "X-Forwarded-For: 20.20.20.20", + "CONTENT-LENGTH: 1000", + "GET /abc/def/ HTTP/1.0", + "Cookie2: 30.30.30.30:33333", + "X-Forwarded-For2: 40.40.40.40", + }; + + size_t buffer_len = 0; + size_t http_header_offset = 0; + size_t http_header_len = 0; + + memset( buffer_all_1, '\0', sizeof(buffer_all_1)); + memset( buffer_all_2, '\0', sizeof(buffer_all_2)); + for( i = 0; i < 8; i++ ){ + for( j = 0; j < 3; j++ ){ + memcpy( buffer_all_1[j] + strlen( buffer_all_1[j] ), buffer_line_1[i], strlen( buffer_line_1[i] )); + if( j == 0 || j == 2 ){ + buffer_all_1[j][strlen( buffer_all_1[j] )] = '\r'; + } + if( j == 1 || j == 2 ){ + buffer_all_1[j][strlen( buffer_all_1[j] )] = '\n'; + } + + } + } + + for( i = 0; i < 8; i++ ){ + for( j = 0; j < 3; j++ ){ + memcpy( buffer_all_2[j] + strlen( buffer_all_2[j] ), buffer_line_2[i], strlen( buffer_line_1[i] )); + if( j == 0 || j == 2 ){ + buffer_all_2[j][strlen( buffer_all_2[j] )] = '\r'; + } + if( j == 1 || j == 2 ){ + buffer_all_2[j][strlen( buffer_all_2[j] )] = '\n'; + } + + } + } + + + for( i = 0; i < 3; i++ ){ + buffer_len = strlen( buffer_all_1[i] ); + for( j = 0; j < 10; j++, count++ ){ + std::cout.width(2); + std::cout.fill('0'); + std::cout << count << "---------------------------------------" << std::endl; + http_header_offset = 0; + http_header_len = 0; + std::cout << "Length = [" << buffer_len << "]" << std::endl; + std::cout << "Http Header Name = [" << http_header_name[j] << "]" << std::endl; + std::cout << "Http Header Name Length = [" << http_header_name[j].length() << "]" << std::endl; + // [01] - [30] + BOOST_CHECK( find_http_header( (const char*)buffer_all_1[i], buffer_len, http_header_name[j], http_header_offset, http_header_len ) == result_1[j] ); + memset( disp_http_header, '\0', sizeof(disp_http_header)); + memcpy( disp_http_header, buffer_all_1[i] + http_header_offset, http_header_len ); + std::cout << "Http Header Offset = [" << http_header_offset << "]" << std::endl; + std::cout << "Http Header Length = [" << http_header_len << "]" << std::endl; + std::cout << "Http Header String = [" << disp_http_header << "]" << std::endl; + } + } + + for( i = 0; i < 3; i++ ){ + buffer_len = strlen( buffer_all_2[i] ); + for( j = 0; j < 10; j++, count++ ){ + std::cout.width(2); + std::cout.fill('0'); + std::cout << count << "---------------------------------------" << std::endl; + http_header_offset = 0; + http_header_len = 0; + std::cout << "Length = [" << buffer_len << "]" << std::endl; + std::cout << "Http Header Name = [" << http_header_name[j] << "]" << std::endl; + std::cout << "Http Header Name Length = [" << http_header_name[j].length() << "]" << std::endl; + // [31] - [60] + BOOST_CHECK( find_http_header( (const char*)buffer_all_2[i], buffer_len, http_header_name[j], http_header_offset, http_header_len ) == result_2[j] ); + memset( disp_http_header, '\0', sizeof(disp_http_header)); + memcpy( disp_http_header, buffer_all_2[i] + http_header_offset, http_header_len ); + std::cout << "Http Header Offset = [" << http_header_offset << "]" << std::endl; + std::cout << "Http Header Length = [" << http_header_len << "]" << std::endl; + std::cout << "Http Header String = [" << disp_http_header << "]" << std::endl; + } + } + + std::cout.width(2); + std::cout.fill('0'); + std::cout << count << "---------------------------------------" << std::endl; + http_header_offset = 0; + http_header_len = 0; + buffer_len = 0; + std::cout << "Length = [" << buffer_len << "]" << std::endl; + std::cout << "Http Header Name = [" << http_header_name[0] << "]" << std::endl; + std::cout << "Http Header Name Length = [" << http_header_name[0].length() << "]" << std::endl; +// unit_test[61] find_http_header( FindData = NULL, HeaderName = "Cookie", Length = 0 / Result = false ) + BOOST_CHECK( find_http_header( NULL, buffer_len, http_header_name[0], http_header_offset, http_header_len ) == false ); + memset( disp_http_header, '\0', sizeof(disp_http_header)); + std::cout << "Http Header Offset = [" << http_header_offset << "]" << std::endl; + std::cout << "Http Header Length = [" << http_header_len << "]" << std::endl; + std::cout << "Http Header String = [" << disp_http_header << "]" << std::endl; + count++; + + std::cout.width(2); + std::cout.fill('0'); + std::cout << count << "---------------------------------------" << std::endl; + http_header_offset = 0; + http_header_len = 0; + buffer_len = 100; + std::cout << "Length = [" << buffer_len << "]" << std::endl; + std::cout << "Http Header Name = [" << http_header_name[0] << "]" << std::endl; + std::cout << "Http Header Name Length = [" << http_header_name[0].length() << "]" << std::endl; +// unit_test[62] find_http_header( FindData = NULL, HeaderName = "Cookie", Length = 100 / Result = false ) + BOOST_CHECK( find_http_header( NULL, buffer_len, http_header_name[0], http_header_offset, http_header_len ) == false ); + memset( disp_http_header, '\0', sizeof(disp_http_header)); + std::cout << "Http Header Offset = [" << http_header_offset << "]" << std::endl; + std::cout << "Http Header Length = [" << http_header_len << "]" << std::endl; + std::cout << "Http Header String = [" << disp_http_header << "]" << std::endl; + count++; + +} + +void find_http_header_test_thread( int thread_no, bool* ret ){ + + boost::xtime start_time; + boost::xtime end_time; + + int count = 1; + int i = 0; + + char disp_http_header[4096]; + + std::string http_header_name[5] + = { +// unit_test[63] find_http_header( FindData = "...Cookie: 10.10.10.10:11111...BlankLine...", HeaderName = "Cookie" / Result = true / ThreadNo = 1 ) +// unit_test[64] find_http_header( FindData = "...X-Forwarded-For: 20.20.20.20...BlankLine...", HeaderName = "X-Forwarded-For" / Result = true / ThreadNo = 2 ) +// unit_test[65] find_http_header( FindData = "...BlankLine...Cookie2: 30.30.30.30:33333...", HeaderName = "Cookie2" / Result = false / ThreadNo = 3 ) +// unit_test[66] find_http_header( FindData = "...BlankLine...X-Forwarded-For2: 40.40.40.40...", HeaderName = "X-Forwarded-For2" / Result = false / ThreadNo = 4 ) +// unit_test[67] find_http_header( FindData = "...BlankLine...", HeaderName = "" / Result = true / ThreadNo = 5 ) + "Cookie", + "X-Forwarded-For", + "Cookie2", + "X-Forwarded-For2", + "", + }; + + bool result[5] + = { + true, + true, + false, + false, + true, + }; + + char buffer_all[4096]; + + char buffer_line[8][256] + = { + "GET /abc/def/ HTTP/1.0", + "Cookie: 10.10.10.10:11111", + "X-Forwarded-For: 20.20.20.20", + "CONTENT-LENGTH: 1000", + "", + "GET /abc/def/ HTTP/1.0", + "Cookie2: 30.30.30.30:33333", + "X-Forwarded-For2: 40.40.40.40", + }; + + bool find_result; + + size_t buffer_len = 0; + size_t http_header_offset = 0; + size_t http_header_len = 0; + + memset( buffer_all, '\0', sizeof(buffer_all)); + for( i = 0; i < 8; i++ ){ + memcpy( buffer_all + strlen( buffer_all ), buffer_line[i], strlen( buffer_line[i] )); + buffer_all[strlen( buffer_all )] = '\r'; + } + + std::cout << "[Thread_" << thread_no << "] "; + std::cout.width(2); + std::cout.fill('0'); + std::cout << count << "---------------------------------------" << std::endl; + memset( disp_http_header, '\0', sizeof(disp_http_header)); + http_header_offset = 0; + http_header_len = 0; + buffer_len = strlen( buffer_all ); + std::cout << "[Thread_" << thread_no << "] " << "Length = [" << buffer_len << "]" << std::endl; + std::cout << "[Thread_" << thread_no << "] " << "Http Header Name = [" << http_header_name[thread_no-1] << "]" << std::endl; + std::cout << "[Thread_" << thread_no << "] " << "Http Header Name Length = [" << http_header_name[thread_no-1].length() << "]" << std::endl; + std::cout << "[Thread_" << thread_no << "] " << "Wait..." << std::endl; + { + boost::mutex::scoped_lock lk( sync_mutex ); + sync_condition.wait( lk ); + } + boost::xtime_get(&start_time, boost::TIME_UTC); + // [63] - [67] + find_result = find_http_header( (const char*)buffer_all, buffer_len, http_header_name[thread_no-1], http_header_offset, http_header_len ); + if( find_result == result[thread_no-1] ){ + *ret = true; + } + else{ + *ret = false; + } +// BOOST_CHECK( find_http_header( (const char*)buffer_all, buffer_len, http_header_name[thread_no-1], http_header_offset, http_header_len ) == result[thread_no-1] ); + boost::xtime_get(&end_time, boost::TIME_UTC); + memcpy( disp_http_header, buffer_all + http_header_offset, http_header_len ); + + std::cout << "[Thread_" << thread_no << "] " << "Http Header Offset = [" << http_header_offset << "]" << std::endl; + std::cout << "[Thread_" << thread_no << "] " << "Http Header Length = [" << http_header_len << "]" << std::endl; + std::cout << "[Thread_" << thread_no << "] " << "Http Header String = [" << disp_http_header << "]" << std::endl; + std::cout << "[Thread_" << thread_no << "] " << "StartTime = [" << start_time.nsec << "]" << std::endl; + std::cout << "[Thread_" << thread_no << "] " << "EndTime = [" << end_time.nsec << "]" << std::endl; + std::cout << "[Thread_" << thread_no << "] " << "CheckEnd" << std::endl; + +} + +void check_http_method_and_version_test(){ + + int count = 1; + + char buffer_ok[30][256] + = { + "GET /abc/def/ HTTP/1.0", + "HEAD /abc/def/ HTTP/1.0", + "POST /abc/def/ HTTP/1.0", + "PUT /abc/def/ HTTP/1.0", + "PROPFIND /abc/def/ HTTP/1.0", + "PROPPATCH /abc/def/ HTTP/1.0", + "OPTIONS /abc/def/ HTTP/1.0", + "CONNECT /abc/def/ HTTP/1.0", + "COPY /abc/def/ HTTP/1.0", + "TRACE /abc/def/ HTTP/1.0", + "DELETE /abc/def/ HTTP/1.0", + "LOCK /abc/def/ HTTP/1.0", + "UNLOCK /abc/def/ HTTP/1.0", + "MOVE /abc/def/ HTTP/1.0", + "MKCOL /abc/def/ HTTP/1.0", + "GET /abc/def/ HTTP/1.1", + "HEAD /abc/def/ HTTP/1.1", + "POST /abc/def/ HTTP/1.1", + "PUT /abc/def/ HTTP/1.1", + "PROPFIND /abc/def/ HTTP/1.1", + "PROPPATCH /abc/def/ HTTP/1.1", + "OPTIONS /abc/def/ HTTP/1.1", + "CONNECT /abc/def/ HTTP/1.1", + "COPY /abc/def/ HTTP/1.1", + "TRACE /abc/def/ HTTP/1.1", + "DELETE /abc/def/ HTTP/1.1", + "LOCK /abc/def/ HTTP/1.1", + "UNLOCK /abc/def/ HTTP/1.1", + "MOVE /abc/def/ HTTP/1.1", + "MKCOL /abc/def/ HTTP/1.1", + }; + char buffer_ng[16][256] + = { + "get /abc/def/ HTTP/1.0", + "Get /abc/def/ HTTP/1.0", + "GET/abc/def/ HTTP/1.0", + "GGET /abc/def/ HTTP/1.0", + " GET /abc/def/ HTTP/1.0", + "get GET /abc/def/ HTTP/1.0", + "get /abc/GET /abc/def/ HTTP/1.0", + "GET /abc/def/ HTTP/1.0 GET /abc/def/ HTTP/1.0", + "GET /abc/def/ HTTP/0.0", + "GET /abc/def/ HTTP/0.9", + "GET /abc/def/ HTTP/1.2", + "GET /abc/def/ HTTP/2.0", + "GET /abc/def/ghiHTTP/1.0", + "GET/abc/def/ghi HTTP/1.1", + "/abc/def/ghi HTTP/1.0", + "GET /abc/def/ http/1.0", + }; +/* char buffer_http_utility[5][256] + = { + "GET / HTTP/1.0", + "GET / HTTP/1.1", + "Get / HTTP/1.0", + "GET / HTTP/1.2", + "", + }; メモリ確保用のエラーがなくなったため不要*/ + size_t buffer_len = 0; + + for( int i = 0; i < 30; i++, count++ ){ + std::cout.width(2); + std::cout.fill('0'); + std::cout << count << "---------------------------------------" << std::endl; + std::cout << "String = [" << buffer_ok[i] << "] + [CR]" << std::endl; + buffer_ok[i][strlen( buffer_ok[i] )] = '\r'; + buffer_len = strlen( buffer_ok[i] ); + std::cout << "Length = [" << buffer_len << "]" << std::endl; + BOOST_CHECK( check_http_method_and_version( + (const char*)buffer_ok[i], buffer_len ) == CHECK_OK ); + } + + for( int i = 0; i < 16; i++, count++ ){ + std::cout.width(2); + std::cout.fill('0'); + std::cout << count << "---------------------------------------" << std::endl; + std::cout << "String = [" << buffer_ng[i] << "] + [CR]" << std::endl; + buffer_ng[i][strlen( buffer_ng[i] )] = '\r'; + buffer_len = strlen( buffer_ng[i] ); + std::cout << "Length = [" << buffer_len << "]" << std::endl; + BOOST_CHECK( check_http_method_and_version( + (const char*)buffer_ng[i], buffer_len ) == CHECK_NG ); + } + +/*malloc errorがなくなったため、テスト不要 + for( int i = 0; i < 5; i++, count++ ){ + std::cout.width(2); + std::cout.fill('0'); + std::cout << count << "---------------------------------------" << std::endl; + std::cout << "String = [" << buffer_http_utility[i] << "]" << std::endl; + buffer_len = strlen( buffer_http_utility[i] ); + std::cout << "Length = [" << buffer_len << "]" << std::endl; + BOOST_CHECK( check_http_method_and_version( + (const char*)buffer_http_utility[i], buffer_len ) == CHECK_IMPOSSIBLE ); + } +*/ + std::cout.width(2); + std::cout.fill('0'); + std::cout << count << "---------------------------------------" << std::endl; + buffer_len = 0; + std::cout << "String = [NULL]" << std::endl; + std::cout << "Length = [" << buffer_len << "]" << std::endl; + BOOST_CHECK( check_http_method_and_version( NULL, buffer_len ) == CHECK_NG ); + count++; + + std::cout.width(2); + std::cout.fill('0'); + std::cout << count << "---------------------------------------" << std::endl; + buffer_len = 100; + std::cout << "String = [NULL]" << std::endl; + std::cout << "Length = [" << buffer_len << "]" << std::endl; + BOOST_CHECK( check_http_method_and_version( NULL, buffer_len ) == CHECK_NG ); + count++; + +} + +void check_http_version_and_status_code_test(){ + + int count = 1; + + char buffer_ok[4][256] + = { + "HTTP/1.0 100 abcdff", + "HTTP/1.1 100 abcdff", + "HTTP/1.0 399 abcdff", + "HTTP/1.1 399 abcdff", + }; + char buffer_ng[10][256] + = { + "HTTP/0.0 100 abcdff", + "HTTP/0.9 100 abcdff", + "HTTP/1.2 100 abcdff", + "HTTP/2.0 100 abcdff", + "HTTP/1.0 100abcdff", + "HTTP/1.1100 abcdff", + "HTTP/1.1100abcdff", + "http/1.0 100 abcdff", + "HTTP/1.0 099 abcdff", + "HTTP/1.0 400 abcdff", + }; + char buffer_http_utility[2][256] + = { + "HTTP/1.0 100 abcdff", + "", + }; + size_t buffer_len = 0; + + for( int i = 0; i < 4; i++, count++ ){ + std::cout.width(2); + std::cout.fill('0'); + std::cout << count << "---------------------------------------" << std::endl; + std::cout << "String = [" << buffer_ok[i] << "] + [CR]" << std::endl; + buffer_ok[i][strlen( buffer_ok[i] )] = '\r'; + buffer_len = strlen( buffer_ok[i] ); + std::cout << "Length = [" << buffer_len << "]" << std::endl; + BOOST_CHECK( check_http_version_and_status_code( + (const char*)buffer_ok[i], buffer_len ) == CHECK_OK ); + } + + for( int i = 0; i < 10; i++, count++ ){ + std::cout.width(2); + std::cout.fill('0'); + std::cout << count << "---------------------------------------" << std::endl; + std::cout << "String = [" << buffer_ng[i] << "] + [CR]" << std::endl; + buffer_ng[i][strlen( buffer_ng[i] )] = '\r'; + buffer_len = strlen( buffer_ng[i] ); + std::cout << "Length = [" << buffer_len << "]" << std::endl; + BOOST_CHECK( check_http_version_and_status_code( + (const char*)buffer_ng[i], buffer_len ) == CHECK_NG ); + } + + for( int i = 0; i < 2; i++, count++ ){ + std::cout.width(2); + std::cout.fill('0'); + std::cout << count << "---------------------------------------" << std::endl; + std::cout << "String = [" << buffer_http_utility[i] << "]" << std::endl; + buffer_len = strlen( buffer_http_utility[i] ); + std::cout << "Length = [" << buffer_len << "]" << std::endl; + BOOST_CHECK( check_http_version_and_status_code( + (const char*)buffer_http_utility[i], buffer_len ) == CHECK_IMPOSSIBLE ); + } + + std::cout.width(2); + std::cout.fill('0'); + std::cout << count << "---------------------------------------" << std::endl; + buffer_len = 0; + std::cout << "String = [NULL]" << std::endl; + std::cout << "Length = [" << buffer_len << "]" << std::endl; + BOOST_CHECK( check_http_version_and_status_code( NULL, buffer_len ) == CHECK_NG ); + count++; + + std::cout.width(2); + std::cout.fill('0'); + std::cout << count << "---------------------------------------" << std::endl; + buffer_len = 100; + std::cout << "String = [NULL]" << std::endl; + std::cout << "Length = [" << buffer_len << "]" << std::endl; + BOOST_CHECK( check_http_version_and_status_code( NULL, buffer_len ) == CHECK_NG ); + count++; + +} + +void find_http_header_others_test(){ + + int count = 1; + int i = 0; + int j = 0; + + char disp_http_header[4096]; + + char buffer_all_1[3][4096]; + char buffer_all_2[3][4096]; + + char buffer_line_1[8][256] + = { + "GET /abc/def/ HTTP/1.0", + "Cookie: 10.10.10.10:11111", + "X-Forwarded-For: 20.20.20.20", + "CONTENT-LENGTH: 1000", + "", + "GET /abc/def/ HTTP/1.0", + "Cookie2: 30.30.30.30:33333", + "X-Forwarded-For2: 40.40.40.40", + }; + + + char buffer_line_2[8][256] + = { + "GET /abc/def/ HTTP/1.0", + "", + "Cookie: 10.10.10.10:11111", + "X-Forwarded-For: 20.20.20.20", + "CONTENT-LENGTH: 1000", + "GET /abc/def/ HTTP/1.0", + "Cookie2: 30.30.30.30:33333", + "X-Forwarded-For2: 40.40.40.40", + }; + + size_t buffer_len = 0; + size_t http_header_offset = 0; + size_t http_header_len = 0; + + memset( buffer_all_1, '\0', sizeof(buffer_all_1)); + memset( buffer_all_2, '\0', sizeof(buffer_all_2)); + for( i = 0; i < 8; i++ ){ + for( j = 0; j < 3; j++ ){ + memcpy( buffer_all_1[j] + strlen( buffer_all_1[j] ), buffer_line_1[i], strlen( buffer_line_1[i] )); + if( j == 0 || j == 2 ){ + buffer_all_1[j][strlen( buffer_all_1[j] )] = '\r'; + } + if( j == 1 || j == 2 ){ + buffer_all_1[j][strlen( buffer_all_1[j] )] = '\n'; + } + + } + } + + for( i = 0; i < 8; i++ ){ + for( j = 0; j < 3; j++ ){ + memcpy( buffer_all_2[j] + strlen( buffer_all_2[j] ), buffer_line_2[i], strlen( buffer_line_1[i] )); + if( j == 0 || j == 2 ){ + buffer_all_2[j][strlen( buffer_all_2[j] )] = '\r'; + } + if( j == 1 || j == 2 ){ + buffer_all_2[j][strlen( buffer_all_2[j] )] = '\n'; + } + + } + } + + for( i = 0; i < 3; i++ ){ + buffer_len = strlen( buffer_all_1[i] ); + for( j = 0; j < 4; j++ ){ + std::cout.width(2); + std::cout.fill('0'); + std::cout << count << "---------------------------------------" << std::endl; + count++; + http_header_offset = 0; + http_header_len = 0; + std::cout << "Length = [" << buffer_len << "]" << std::endl; + + if( j == 0 ){ + std::cout << "MethodName = [find_http_header_cookie]" << std::endl; + BOOST_CHECK( find_http_header_cookie( (const char*)buffer_all_1[i], buffer_len, http_header_offset, http_header_len ) == true ); + } + else if( j == 1 ){ + std::cout << "MethodName = [find_http_header_content_length]" << std::endl; + BOOST_CHECK( find_http_header_content_length( (const char*)buffer_all_1[i], buffer_len, http_header_offset, http_header_len ) == true ); + } + else if( j == 2 ){ + std::cout << "MethodName = [find_http_header_x_forwarded_for]" << std::endl; + BOOST_CHECK( find_http_header_x_forwarded_for( (const char*)buffer_all_1[i], buffer_len, http_header_offset, http_header_len ) == true ); + } + else{ + std::cout << "MethodName = [find_http_header_all]" << std::endl; + BOOST_CHECK( find_http_header_all( (const char*)buffer_all_1[i], buffer_len, http_header_offset, http_header_len ) == true ); + } + + memset( disp_http_header, '\0', sizeof(disp_http_header)); + memcpy( disp_http_header, buffer_all_1[i] + http_header_offset, http_header_len ); + std::cout << "Http Header Offset = [" << http_header_offset << "]" << std::endl; + std::cout << "Http Header Length = [" << http_header_len << "]" << std::endl; + std::cout << "Http Header String = [" << disp_http_header << "]" << std::endl; + } + } + + for( i = 0; i < 3; i++ ){ + buffer_len = strlen( buffer_all_2[i] ); + for( j = 0; j < 4; j++ ){ + std::cout.width(2); + std::cout.fill('0'); + std::cout << count << "---------------------------------------" << std::endl; + count++; + http_header_offset = 0; + http_header_len = 0; + std::cout << "Length = [" << buffer_len << "]" << std::endl; + + if( j == 0 ){ + std::cout << "MethodName = [find_http_header_cookie]" << std::endl; + BOOST_CHECK( find_http_header_cookie( (const char*)buffer_all_2[i], buffer_len, http_header_offset, http_header_len ) == false ); + } + else if( j == 1 ){ + std::cout << "MethodName = [find_http_header_content_length]" << std::endl; + BOOST_CHECK( find_http_header_content_length( (const char*)buffer_all_2[i], buffer_len, http_header_offset, http_header_len ) == false ); + } + else if( j == 2 ){ + std::cout << "MethodName = [find_http_header_x_forwarded_for]" << std::endl; + BOOST_CHECK( find_http_header_x_forwarded_for( (const char*)buffer_all_2[i], buffer_len, http_header_offset, http_header_len ) == false ); + } + else{ + std::cout << "MethodName = [find_http_header_all]" << std::endl; + BOOST_CHECK( find_http_header_all( (const char*)buffer_all_2[i], buffer_len, http_header_offset, http_header_len ) == true ); + } + + memset( disp_http_header, '\0', sizeof(disp_http_header)); + memcpy( disp_http_header, buffer_all_2[i] + http_header_offset, http_header_len ); + std::cout << "Http Header Offset = [" << http_header_offset << "]" << std::endl; + std::cout << "Http Header Length = [" << http_header_len << "]" << std::endl; + std::cout << "Http Header String = [" << disp_http_header << "]" << std::endl; + } + } +} + +}; + + +//------------------------------------------------------------------- +void find_uri_test_thread( http_utility_test* http_utility_test_1, int thread_no, bool* ret ){ + + for( int i = 0; i < THREAD_LOOP_NUM; i++ ){ + http_utility_test_1->find_uri_test_thread( thread_no, ret ); + } + +} +void nn() +{ +} +void find_uri_test(){ + + bool thread_1; + bool thread_2; + bool thread_3; + bool thread_4; + bool thread_5; + + http_utility_test http_utility_test_1; + + BOOST_MESSAGE( "----- find_uri test start -----" ); + http_utility_test_1.find_uri_test(); + BOOST_MESSAGE( "----- find_uri test end -----" ); + + BOOST_MESSAGE( "----- find_uri test multi thread start -----" ); + boost::thread t1( boost::bind( &find_uri_test_thread, + &http_utility_test_1, 1, &thread_1)); + boost::thread t2( boost::bind( &find_uri_test_thread, + &http_utility_test_1, 2, &thread_2)); + boost::thread t3( boost::bind( &find_uri_test_thread, + &http_utility_test_1, 3, &thread_3)); + boost::thread t4( boost::bind( &find_uri_test_thread, + &http_utility_test_1, 4, &thread_4)); + boost::thread t5( boost::bind( &find_uri_test_thread, + &http_utility_test_1, 5, &thread_5)); + + sleep(1); + + http_utility_test_1.sync_condition.notify_all(); + + t1.join(); + t2.join(); + t3.join(); + t4.join(); + t5.join(); + + BOOST_CHECK( thread_1 == true ); + BOOST_CHECK( thread_2 == true ); + BOOST_CHECK( thread_3 == true ); + BOOST_CHECK( thread_4 == true ); + BOOST_CHECK( thread_5 == true ); + + BOOST_MESSAGE( "----- find_uri test multi thread end -----" ); +} +//------------------------------------------------------------------- +void find_status_code_test_thread( http_utility_test* http_utility_test_1, int thread_no, bool* ret ){ + + for( int i = 0; i < THREAD_LOOP_NUM; i++ ){ + http_utility_test_1->find_status_code_test_thread( thread_no, ret ); + } + +} +void find_status_code_test(){ + + bool thread_1; + bool thread_2; + bool thread_3; + bool thread_4; + bool thread_5; + + http_utility_test http_utility_test_1; + + BOOST_MESSAGE( "----- find_status_code test start -----" ); + http_utility_test_1.find_status_code_test(); + BOOST_MESSAGE( "----- find_status_code test end -----" ); + + BOOST_MESSAGE( "----- find_status_code test multi thread start -----" ); + boost::thread t1( boost::bind( &find_status_code_test_thread, + &http_utility_test_1, 1, &thread_1)); + boost::thread t2( boost::bind( &find_status_code_test_thread, + &http_utility_test_1, 2, &thread_2)); + boost::thread t3( boost::bind( &find_status_code_test_thread, + &http_utility_test_1, 3, &thread_3)); + boost::thread t4( boost::bind( &find_status_code_test_thread, + &http_utility_test_1, 4, &thread_4)); + boost::thread t5( boost::bind( &find_status_code_test_thread, + &http_utility_test_1, 5, &thread_5)); + + sleep(1); + + http_utility_test_1.sync_condition.notify_all(); + + t1.join(); + t2.join(); + t3.join(); + t4.join(); + t5.join(); + + BOOST_CHECK( thread_1 == true ); + BOOST_CHECK( thread_2 == true ); + BOOST_CHECK( thread_3 == true ); + BOOST_CHECK( thread_4 == true ); + BOOST_CHECK( thread_5 == true ); + + BOOST_MESSAGE( "----- find_status_code test multi thread end -----" ); +} +//------------------------------------------------------------------- +void find_http_header_test_thread( http_utility_test* http_utility_test_1, int thread_no, bool* ret ){ + + for( int i = 0; i < THREAD_LOOP_NUM; i++ ){ + http_utility_test_1->find_http_header_test_thread( thread_no, ret ); + } + +} +void find_http_header_test(){ + + bool thread_1; + bool thread_2; + bool thread_3; + bool thread_4; + bool thread_5; + + http_utility_test http_utility_test_1; + + BOOST_MESSAGE( "----- find_http_header test start -----" ); + http_utility_test_1.find_http_header_test(); + BOOST_MESSAGE( "----- find_http_header test end -----" ); + + BOOST_MESSAGE( "----- find_http_header test multi thread start -----" ); + boost::thread t1( boost::bind( &find_http_header_test_thread, + &http_utility_test_1, 1, &thread_1)); + boost::thread t2( boost::bind( &find_http_header_test_thread, + &http_utility_test_1, 2, &thread_2)); + boost::thread t3( boost::bind( &find_http_header_test_thread, + &http_utility_test_1, 3, &thread_3)); + boost::thread t4( boost::bind( &find_http_header_test_thread, + &http_utility_test_1, 4, &thread_4)); + boost::thread t5( boost::bind( &find_http_header_test_thread, + &http_utility_test_1, 5, &thread_5)); + + sleep(1); + + http_utility_test_1.sync_condition.notify_all(); + + t1.join(); + t2.join(); + t3.join(); + t4.join(); + t5.join(); + + BOOST_CHECK( thread_1 == true ); + BOOST_CHECK( thread_2 == true ); + BOOST_CHECK( thread_3 == true ); + BOOST_CHECK( thread_4 == true ); + BOOST_CHECK( thread_5 == true ); + + BOOST_MESSAGE( "----- find_http_header test multi thread end -----" ); +} + +void check_http_method_and_version_test(){ + + http_utility_test http_utility_test_1; + + BOOST_MESSAGE( "----- check_http_method_and_version test start -----" ); + http_utility_test_1.check_http_method_and_version_test(); + BOOST_MESSAGE( "----- check_http_method_and_version test end -----" ); + +} + +void check_http_version_and_status_code_test(){ + + http_utility_test http_utility_test_1; + + BOOST_MESSAGE( "----- check_http_version_and_status_code test start -----" ); + http_utility_test_1.check_http_version_and_status_code_test(); + BOOST_MESSAGE( "----- check_http_version_and_status_code test end -----" ); + +} + +void find_http_header_others_test(){ + + http_utility_test http_utility_test_1; + + BOOST_MESSAGE( "----- find_http_header others test start -----" ); + http_utility_test_1.find_http_header_others_test(); + BOOST_MESSAGE( "----- find_http_header others test end -----" ); + +} + +//------------------------------------------------------------------- +test_suite* init_unit_test_suite( int argc, char* argv[] ){ + + test_suite* ts = BOOST_TEST_SUITE( "http_utility class test" ); + + ts->add( BOOST_TEST_CASE( &find_uri_test ) ); + ts->add( BOOST_TEST_CASE( &find_status_code_test ) ); + ts->add( BOOST_TEST_CASE( &find_http_header_test ) ); + ts->add( BOOST_TEST_CASE( &check_http_method_and_version_test ) ); + ts->add( BOOST_TEST_CASE( &check_http_version_and_status_code_test ) ); + ts->add( BOOST_TEST_CASE( &find_http_header_others_test ) ); + + framework::master_test_suite().add( ts ); + + return 0; +} diff --git a/unit_tests/module_test/protocol_module_base_test/Makefile b/unit_tests/module_test/protocol_module_base_test/Makefile new file mode 100644 index 00000000..15ef585a --- /dev/null +++ b/unit_tests/module_test/protocol_module_base_test/Makefile @@ -0,0 +1,32 @@ +# +# +# Makefile for protocol_module_base unit test frameworks. +# +# +TARGET = protocol_module_base_ut +CPP = g++ +CPPFLAGS = -g -Wall -Werror -pthread -O0 -DMAX_BUFFER_SIZE=65535u +INCLUDES = -I../../../logger +LIBS = -lboost_system-gcc41-mt \ + -lboost_unit_test_framework-gcc41-mt + +LDFLAGS = -lrt -ldl + +SRCS = protocol_module_base_ut.cpp + +OBJS = $(SRCS:.cpp=.o) + +all: $(TARGET) + +$(TARGET): $(OBJS) + @$(CPP) $(INCLUDES) -o $@ $(OBJS) $(LIBS) + @echo "make all done!(^_^)" + +clean: + @echo "clean...(>_<)" + @rm -f $(TARGET) $(OBJS) + @echo "clean done!" + +.cpp.o: + @$(CPP) $(CPPFLAGS) $(INCLUDES) -c $< + diff --git a/unit_tests/module_test/protocol_module_base_test/protocol_module_base_ut.cpp b/unit_tests/module_test/protocol_module_base_test/protocol_module_base_ut.cpp new file mode 100644 index 00000000..2e23ed45 --- /dev/null +++ b/unit_tests/module_test/protocol_module_base_test/protocol_module_base_ut.cpp @@ -0,0 +1,319 @@ +#include +#include "../../../include/protocol_module_base.h" + +using namespace l7vs; +using namespace boost; +using namespace boost::unit_test; + +class protocol_module_base_test_class: public protocol_module_base { +public: + protocol_module_base_test_class() : protocol_module_base("test") { + } + + ~protocol_module_base_test_class() { + } + + bool is_tcp() { + return true; + } + + bool is_udp() { + return false; + } + + void replication_interrupt() { + } + + void initialize(rs_list_itr_func_type inlist_begin, + rs_list_itr_func_type inlist_end, + rs_list_itr_next_func_type inlist_next, + boost::function inlist_lock, + boost::function inlist_unlock) { + } + + void finalize() { + } + + bool is_use_sorry() { + return false; + } + + void handle_rslist_update() { + } + + check_message_result check_parameter(const std::vector& args) { + check_message_result result; + return result; + } + + check_message_result set_parameter(const std::vector& args) { + check_message_result result; + return result; + } + + check_message_result add_parameter(const std::vector& args) { + check_message_result result; + return result; + } + + void register_schedule(tcp_schedule_func_type inschedule) { + } + + void register_schedule(udp_schedule_func_type inschedule) { + } + + EVENT_TAG handle_session_initialize(const boost::thread::id up_thread_id, + const boost::thread::id down_thread_id, + const boost::asio::ip::tcp::endpoint& client_endpoint_tcp, + const boost::asio::ip::udp::endpoint& client_endpoint_udp) { + return STOP; + } + + EVENT_TAG handle_session_finalize(const boost::thread::id up_thread_id, + const boost::thread::id down_thread_id) { + return STOP; + } + + EVENT_TAG handle_accept(const boost::thread::id thread_id) { + return STOP; + } + + EVENT_TAG handle_client_recv(const boost::thread::id thread_id, + const boost::array& recvbuffer, + const size_t recvlen) { + return STOP; + } + + EVENT_TAG handle_realserver_select(const boost::thread::id thread_id, + boost::asio::ip::tcp::endpoint& rs_endpoint) { + return STOP; + } + + EVENT_TAG handle_realserver_select(const boost::thread::id thread_id, + boost::asio::ip::udp::endpoint& rs_endpoint, + boost::array& sendbuffer, + size_t& datalen) { + return STOP; + } + + EVENT_TAG handle_realserver_connect(const boost::thread::id thread_id, + boost::array& sendbuffer, + size_t& datalen) { + return STOP; + } + + EVENT_TAG handle_realserver_connection_fail(const boost::thread::id thread_id, + const boost::asio::ip::tcp::endpoint& rs_endpoint) { + return STOP; + } + + EVENT_TAG handle_realserver_send(const boost::thread::id thread_id) { + return STOP; + } + + EVENT_TAG handle_sorryserver_select(const boost::thread::id thread_id, + boost::asio::ip::tcp::endpoint& sorry_endpoint) { + return STOP; + } + + EVENT_TAG handle_sorryserver_connect(const boost::thread::id thread_id, + boost::array& sendbuffer, + size_t& datalen) { + return STOP; + } + + EVENT_TAG handle_sorryserver_connection_fail(const boost::thread::id thread_id, + const boost::asio::ip::tcp::endpoint& sorry_endpoint) { + return STOP; + } + + EVENT_TAG handle_sorryserver_send(const boost::thread::id thread_id) { + return STOP; + } + + EVENT_TAG handle_realserver_recv(const boost::thread::id thread_id, + const boost::asio::ip::tcp::endpoint& rs_endpoint, + const boost::array& recvbuffer, + const size_t recvlen) { + return STOP; + } + + EVENT_TAG handle_realserver_recv(const boost::thread::id thread_id, + const boost::asio::ip::udp::endpoint& rs_endpoint, + const boost::array& recvbuffer, + const size_t recvlen) { + return STOP; + } + + EVENT_TAG handle_sorryserver_recv(const boost::thread::id thread_id, + const boost::asio::ip::tcp::endpoint& sorry_endpoint, + const boost::array& recvbuffer, + const size_t recvlen) { + return STOP; + } + + EVENT_TAG handle_response_send_inform(const boost::thread::id thread_id) { + return STOP; + } + + EVENT_TAG handle_client_connection_check(const boost::thread::id thread_id, + boost::array& sendbuffer, + size_t& datalen) { + return STOP; + } + + EVENT_TAG handle_client_select(const boost::thread::id thread_id, + boost::asio::ip::udp::endpoint& cl_endpoint, + boost::array& sendbuffer, + size_t& datalen) { + return STOP; + } + + EVENT_TAG handle_client_send(const boost::thread::id thread_id) { + return STOP; + } + + EVENT_TAG handle_client_disconnect(const boost::thread::id thread_id) { + return STOP; + } + + EVENT_TAG handle_sorry_enable(const boost::thread::id thread_id) { + return STOP; + } + + EVENT_TAG handle_sorry_disable(const boost::thread::id thread_id) { + return STOP; + } + + EVENT_TAG handle_realserver_disconnect(const boost::thread::id thread_id, + const boost::asio::ip::tcp::endpoint& rs_endpoint) { + return STOP; + } + + EVENT_TAG handle_sorryserver_disconnect(const boost::thread::id thread_id, + const boost::asio::ip::tcp::endpoint& sorry_endpoint) { + return STOP; + } + + EVENT_TAG handle_realserver_close(const boost::thread::id thread_id, + const boost::asio::ip::udp::endpoint& rs_endpoint) { + return STOP; + } + + void is_exec_OK_test() + { + std::cout << "[1]--------------------------------------------- " << std::endl; + //unit_test[1] 正常系で必ずtrueを返す(SSL以外モード) + BOOST_CHECK_EQUAL(this->is_exec_OK(VS_CONTACT_CLASS_NORMAL), true); + + //unit_test[2] 正常系で必ずtrueを返す(SSLモード) + std::cout << "[2]--------------------------------------------- " << std::endl; + BOOST_CHECK_EQUAL(this->is_exec_OK(VS_CONTACT_CLASS_SSL), true); + } + +}; + +void dump_memory_test(){ + struct check_condition + { + char memory[256]; + size_t memory_size; + std::string out_string; + }; + + // テスト条件(正常系): + check_condition condition_empty_string[12] = + { + {"a", 0, ""}, + {"a", 1, "\n61\n"}, + {"ab", 2, "\n6162\n"}, + {"abc", 3, "\n6162 63\n"}, + {"abcd", 4, "\n6162 6364\n"}, + {"abcde", 5, "\n6162 6364 65\n"}, + {"abcdefghijklmnopqrstuvwxyzABCDEF", 32, + "\n6162 6364 6566 6768 696A 6B6C 6D6E 6F70 7172 7374 7576 7778 797A 4142 4344 4546\n"}, + {"abcdefghijklmnopqrstuvwxyzABCDEFG", 33, + "\n6162 6364 6566 6768 696A 6B6C 6D6E 6F70 7172 7374 7576 7778 797A 4142 4344 4546\n47\n"}, + {"abcdefghijklmnopqrstuvwxyzABCDEFGH", 34, + "\n6162 6364 6566 6768 696A 6B6C 6D6E 6F70 7172 7374 7576 7778 797A 4142 4344 4546\n4748\n"}, + {"abcdefghijklmnopqrstuvwxyzABCDEFGHI", 35, + "\n6162 6364 6566 6768 696A 6B6C 6D6E 6F70 7172 7374 7576 7778 797A 4142 4344 4546\n4748 49\n"}, + {"abcdefghijklmnopqrstuvwxyzABCDEFabcdefghijklmnopqrstuvwxyzABCDEF", 64, + "\n6162 6364 6566 6768 696A 6B6C 6D6E 6F70 7172 7374 7576 7778 797A 4142 4344 4546\n" + "6162 6364 6566 6768 696A 6B6C 6D6E 6F70 7172 7374 7576 7778 797A 4142 4344 4546\n"}, + {"abcdefghijklmnopqrstuvwxyzABCDEFabcdefghijklmnopqrstuvwxyzABCDEFG", 65, + "\n6162 6364 6566 6768 696A 6B6C 6D6E 6F70 7172 7374 7576 7778 797A 4142 4344 4546\n" + "6162 6364 6566 6768 696A 6B6C 6D6E 6F70 7172 7374 7576 7778 797A 4142 4344 4546\n47\n"}, + }; + + // unit_test[1] ヌルポイントのテスト(異常系) + std::string out_string = "123"; + std::string out_string_src(out_string); + protocol_module_base::dump_memory(NULL, 100, out_string); + BOOST_CHECK_EQUAL(out_string, out_string_src); + std::cout << "out_string = \n" << out_string << std::endl; + std::cout << "unit_test[1]-----------------------------\n" << std::endl; + + // unit_test[2] ポイントの内容のサイズ < データサイズのテスト(異常系) + out_string = ""; + char* less_data = "abcdefghij"; + protocol_module_base::dump_memory(less_data, 65, out_string); + BOOST_CHECK_EQUAL(out_string.size(), 164u ); + std::cout << "out_string = \n" << out_string << std::endl; + std::cout << "unit_test[2]-----------------------------\n" << std::endl; + + // 正常系テスト + for (size_t i = 0; i < 2; i++) + { + for (size_t j = 0; j < 12; j++) + { + out_string_src = ""; + + if (i == 0) + { + out_string = ""; + } + else + { + out_string = "test"; + out_string_src = out_string; + } + protocol_module_base::dump_memory(condition_empty_string[j].memory, + condition_empty_string[j].memory_size, + out_string); + BOOST_CHECK_EQUAL(out_string, out_string_src + condition_empty_string[j].out_string); + + std::cout << "condition[" << j << "].memory = " << condition_empty_string[j].memory << std::endl; + std::cout << "condition[" << j << "].memory_size = " << condition_empty_string[j].memory_size << std::endl; + std::cout << "condition[" << j << "].out_string = " << condition_empty_string[j].out_string << std::endl; + + std::cout << "out_string = " << out_string << std::endl; + + if ((j + 12 * i) >= 10) + { + std::cout << "unit_test[" << j + 12 * i + 3 << "]------------------------------------\n" << std::endl; + } + else + { + std::cout << "unit_test[" << j + 12 * i + 3 << "]-------------------------------------\n" << std::endl; + } + } + } +} + +void is_exec_OK_test() +{ + protocol_module_base_test_class obj; + obj.is_exec_OK_test(); +} + +test_suite* init_unit_test_suite( int argc, char* argv[] ){ + + test_suite* ts = BOOST_TEST_SUITE( "protocol_module_base::dump_memory test" ); + + ts->add(BOOST_TEST_CASE(&dump_memory_test)); + ts->add(BOOST_TEST_CASE(&is_exec_OK_test)); + + framework::master_test_suite().add(ts); + return 0; +} diff --git a/unit_tests/module_test/protocol_module_ip_test/Makefile b/unit_tests/module_test/protocol_module_ip_test/Makefile new file mode 100644 index 00000000..1be2e8be --- /dev/null +++ b/unit_tests/module_test/protocol_module_ip_test/Makefile @@ -0,0 +1,37 @@ +# +# +# Makefile for protocol_module_sessionless unit test frameworks. +# +# +TARGET = ip_ut +CPP = g++ +CPPFLAGS = -g -Wall -Werror -pthread -O0 -DMAX_BUFFER_SIZE=65535u +INCLUDES = -I../../../logger \ + -I../../../parameter \ + -I../../../include \ + -I../../../src +LIBS = -lboost_system-gcc41-mt \ + -lboost_thread-gcc41-mt \ + -lboost_regex-gcc41-mt \ + -lboost_unit_test_framework-gcc41-mt + +LDFLAGS = -lrt -ldl + +SRCS = ip_ut.cpp + +OBJS = $(SRCS:.cpp=.o) + +all: $(TARGET) + +$(TARGET): $(OBJS) + @$(CPP) $(INCLUDES) -o $@ $(OBJS) $(LIBS) + @echo "make all done!(^_^)" + +clean: + @echo "clean...(>_<)" + @rm -f $(TARGET) $(OBJS) + @echo "clean done!" + +.cpp.o: + @$(CPP) $(CPPFLAGS) $(INCLUDES) -c $< + diff --git a/unit_tests/module_test/protocol_module_ip_test/ip_replication_data_processor_test.cpp b/unit_tests/module_test/protocol_module_ip_test/ip_replication_data_processor_test.cpp new file mode 100644 index 00000000..73d5b2b8 --- /dev/null +++ b/unit_tests/module_test/protocol_module_ip_test/ip_replication_data_processor_test.cpp @@ -0,0 +1,1540 @@ +/* + * @file ip_replication_data_processor_test.cpp + * @brief ip replication data processor test file. + * + * L7VSD: Linux Virtual Server for Layer7 Load Balancing + * Copyright (C) 2009 NTT COMWARE Corporation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + **********************************************************************/ + +#include "ip_to_be_test_file.h" + +using namespace boost::unit_test; +using namespace l7vs; + +#define SECTION_NUMBER 200 +#define STRUCT_NUMBER 256 + +bool is_lock_function_called = false; +bool is_unlock_function_called = false; +bool is_put_into_temp_list_test_thread4_waiting = false; +bool is_put_into_temp_list_test_thread6_waiting = false; +bool is_put_into_temp_list_test_thread8_waiting = false; +bool is_put_into_temp_list_test_thread9_waiting = false; +bool is_put_into_temp_list_test_thread10_waiting = false; + +// function for testing register_replication_area_lock +void lock_function(){ + is_lock_function_called = true; +} + +// function for testing register_replication_area_unlock +void unlock_function(){ + is_unlock_function_called = true; +} + +LOG_LEVEL_TAG replication_getloglevel(){ + return LOG_LV_NONE; +} + +void replication_putLogFatal(const unsigned int id, const std::string& message, const char* file_name, int line_number){ +} + +void replication_putLogError(const unsigned int id, const std::string& message, const char* file_name, int line_number){ +} + +void replication_putLogWarn(const unsigned int id, const std::string& message, const char* file_name, int line_number){ +} + +void replication_putLogInfo(const unsigned int id, const std::string& message, const char* file_name, int line_number){ +} + +void replication_putLogDebug(const unsigned int id, const std::string& message, const char* file_name, int line_number){ +} +l7vs::ip_replication_data_processor::getloglevel_func_type replication_ingetloglevel = replication_getloglevel; +l7vs::ip_replication_data_processor::logger_func_type replication_inputLogFatal = replication_putLogFatal; +l7vs::ip_replication_data_processor::logger_func_type replication_inputLogError = replication_putLogError; +l7vs::ip_replication_data_processor::logger_func_type replication_inputLogWarn = replication_putLogWarn; +l7vs::ip_replication_data_processor::logger_func_type replication_inputLogInfo = replication_putLogInfo; +l7vs::ip_replication_data_processor::logger_func_type replication_inputLogDebug = replication_putLogDebug; + +static int calc_hash(const boost::asio::ip::tcp::endpoint& cl_endpoint) +{ + unsigned int hash = 0; + if (cl_endpoint.address().is_v4()) + { + hash= cl_endpoint.address().to_v4().to_ulong() * GOLDEN_RATIO_PRIME; + } + else + { + boost::asio::ip::address_v6::bytes_type v6_bytes = cl_endpoint.address().to_v6().to_bytes(); + boost::asio::ip::address_v4::bytes_type v4_bytes = {{v6_bytes[12],v6_bytes[13],v6_bytes[14],v6_bytes[15]}}; + boost::asio::ip::address_v4::address_v4 v4_address = boost::asio::ip::address_v4::address_v4(v4_bytes); + hash= v4_address.to_ulong() * GOLDEN_RATIO_PRIME; + } + return hash >> 32 - HASH_TABLE_BITS; +} + +// test class +class ip_replication_data_processor_test_class : public l7vs::ip_replication_data_processor { +public: + boost::mutex check_mutex; + // ip_replication_data_processor_test_class + ip_replication_data_processor_test_class( + char* ip_replication_area_begain, + int ip_replication_area_size, + const boost::asio::ip::tcp::endpoint& virtual_service_endpoint, + getloglevel_func_type ingetloglevel, + logger_func_type inputLogFatal, + logger_func_type inputLogError, + logger_func_type inputLogWarn, + logger_func_type inputLogInfo, + logger_func_type inputLogDebug ) : + ip_replication_data_processor( + ip_replication_area_begain, + ip_replication_area_size, + virtual_service_endpoint, + ingetloglevel, + inputLogFatal, + inputLogError, + inputLogWarn, + inputLogInfo, + inputLogDebug ) { + } + + // put_into_temp_list test thread + void put_into_temp_list_test_thread1(int ip_hash, + boost::asio::ip::tcp::endpoint& endpoint, time_t time) { + + l7vs::ip_replication_temp_data test_data1; + + test_data1.ip_hash = ip_hash; + test_data1.last_time = time; + test_data1.op_code = 'A'; + test_data1.rs_endpoint= endpoint; + this->put_into_temp_list(test_data1); + } + + // put_into_temp_list test thread + void put_into_temp_list_test_thread2(int ip_hash, + boost::asio::ip::tcp::endpoint& endpoint, time_t time){ + + l7vs::ip_replication_temp_data test_data1; + + test_data1.ip_hash = ip_hash; + test_data1.last_time = time; + test_data1.op_code = 'U'; + test_data1.rs_endpoint = endpoint; + this->put_into_temp_list(test_data1); + } + + // put_into_temp_list test thread + void put_into_temp_list_test_thread3(int ip_hash, + boost::asio::ip::tcp::endpoint& endpoint, time_t time){ + + l7vs::ip_replication_temp_data test_data1; + + test_data1.ip_hash = ip_hash; + test_data1.last_time = time; + test_data1.op_code = 'A'; + test_data1.rs_endpoint = endpoint; + this->put_into_temp_list(test_data1); + } + + // put_into_temp_list test thread + void put_into_temp_list_test_thread4(int ip_hash, + boost::asio::ip::tcp::endpoint& endpoint, time_t time){ + + l7vs::ip_replication_temp_data test_data1; + + test_data1.ip_hash = ip_hash; + test_data1.last_time = time; + test_data1.op_code = 'A'; + test_data1.rs_endpoint = endpoint; + + this->put_into_temp_list(test_data1); + this->put_into_temp_list(test_data1); + this->put_into_temp_list(test_data1); + this->put_into_temp_list(test_data1); + this->put_into_temp_list(test_data1); + this->put_into_temp_list(test_data1); + is_put_into_temp_list_test_thread4_waiting = true; + } + + // put_into_temp_list test thread + void put_into_temp_list_test_thread5(){ + + l7vs::ip_replication_temp_data temp_data; + this->get_from_temp_list(temp_data); + } + + // put_into_temp_list test thread + void put_into_temp_list_test_thread6(int ip_hash, + boost::asio::ip::tcp::endpoint& endpoint, time_t time){ + + l7vs::ip_replication_temp_data test_data1; + + test_data1.ip_hash = ip_hash; + test_data1.last_time = time; + test_data1.op_code = 'A'; + test_data1.rs_endpoint = endpoint; + + this->put_into_temp_list(test_data1); + this->put_into_temp_list(test_data1); + this->put_into_temp_list(test_data1); + this->put_into_temp_list(test_data1); + this->put_into_temp_list(test_data1); + this->put_into_temp_list(test_data1); + is_put_into_temp_list_test_thread6_waiting = true; + this->put_into_temp_list(test_data1); + this->put_into_temp_list(test_data1); + } + + // put_into_temp_list test thread + void put_into_temp_list_test_thread7(){ + + l7vs::ip_replication_temp_data temp_data; + + for(int i = 0; i < 4; i++){ + this->get_from_temp_list(temp_data); + } + } + + // put_into_temp_list test thread + void put_into_temp_list_test_thread8(int ip_hash, + boost::asio::ip::tcp::endpoint& endpoint, time_t time){ + + l7vs::ip_replication_temp_data test_data1; + + test_data1.ip_hash = ip_hash; + test_data1.last_time = time; + test_data1.op_code = 'A'; + test_data1.rs_endpoint = endpoint; + + this->put_into_temp_list(test_data1); + this->put_into_temp_list(test_data1); + this->put_into_temp_list(test_data1); + this->put_into_temp_list(test_data1); + this->put_into_temp_list(test_data1); + this->put_into_temp_list(test_data1); + is_put_into_temp_list_test_thread8_waiting = true; + this->put_into_temp_list(test_data1); + } + + // put_into_temp_list test thread + void put_into_temp_list_test_thread9(int ip_hash, + boost::asio::ip::tcp::endpoint& endpoint, time_t time){ + + l7vs::ip_replication_temp_data test_data1; + + test_data1.ip_hash = ip_hash; + test_data1.last_time = time; + test_data1.op_code = 'A'; + test_data1.rs_endpoint = endpoint; + + is_put_into_temp_list_test_thread9_waiting = true; + this->put_into_temp_list(test_data1); + } + + // put_into_temp_list test thread + void put_into_temp_list_test_thread10(int ip_hash, + boost::asio::ip::tcp::endpoint& endpoint, time_t time){ + + l7vs::ip_replication_temp_data test_data1; + + test_data1.ip_hash = ip_hash; + test_data1.last_time = time; + test_data1.op_code = 'A'; + test_data1.rs_endpoint = endpoint; + + is_put_into_temp_list_test_thread10_waiting = true; + this->put_into_temp_list(test_data1); + } + + // get_from_temp_list test thread + void get_from_temp_list_thread1() { + boost::asio::ip::tcp::endpoint endpoint; + l7vs::ip_replication_temp_data get_data; + this->get_from_temp_list(get_data); + { + boost::mutex::scoped_lock sclock(check_mutex); + BOOST_CHECK_EQUAL(get_data.ip_hash, 111); + BOOST_CHECK_EQUAL(get_data.op_code, 'A'); + BOOST_CHECK_EQUAL(get_data.rs_endpoint, endpoint); + BOOST_CHECK_EQUAL(get_data.last_time, 1000); + } + } + + // ip_replication_data_processor + void ip_replication_data_processor_test( + l7vs::ip_replication_data* expecting_replication_area, + boost::asio::ip::tcp::endpoint expecting_virtual_service_endpoint, + char* replication_data_area, int data_area_size, char* header_start_address, + char* real_data_start_address) { + + boost::asio::ip::tcp::endpoint test_virtual_service_endpoint; + test_virtual_service_endpoint.port(999); + l7vs::ip_replication_data_header* first_header = reinterpret_cast(header_start_address); + + cout << "[1]--------------------------------------------- " << endl; + // unit_test[1] メンバー変数が初期化されるチェックする。 + BOOST_CHECK_EQUAL(this->temp_list.size(), 0u); + BOOST_CHECK_EQUAL(this->replication_area, expecting_replication_area); + BOOST_CHECK_EQUAL(this->virtual_service_endpoint, expecting_virtual_service_endpoint); + BOOST_CHECK_EQUAL(this->getloglevel, replication_getloglevel); + BOOST_CHECK_EQUAL(this->putLogFatal, replication_putLogFatal); + BOOST_CHECK_EQUAL(this->putLogError, replication_putLogError); + BOOST_CHECK_EQUAL(this->putLogWarn, replication_putLogWarn); + BOOST_CHECK_EQUAL(this->putLogInfo, replication_putLogInfo); + BOOST_CHECK_EQUAL(this->putLogDebug, replication_putLogDebug); + + cout << "[2]--------------------------------------------- " << endl; + // unit_test[2] replication_data_area が NULLの場合, 例外が発生しない。 + try { + ip_replication_data_processor test_object1( + NULL, SECTION_NUMBER, test_virtual_service_endpoint, replication_ingetloglevel, + replication_inputLogFatal, replication_inputLogError, + replication_inputLogWarn, replication_inputLogInfo, + replication_inputLogDebug); + } catch (...) { + BOOST_ERROR("exception: ip_replication_data_processor"); + } + + cout << "[3]--------------------------------------------- " << endl; + // unit_test[3] ip_replication_area_size < 0, 例外が発生する。 + bool exception_occured = false; + try { + memset(replication_data_area, 0, 128*sizeof(l7vs::ip_replication_data_header)); + for(int i = 0; i < 128; i++){ + l7vs::ip_replication_data_header* temp= reinterpret_cast(replication_data_area) + i; + temp->size = static_cast(256 * sizeof(l7vs::ip_replication_data)); + } + l7vs::ip_replication_data_processor test_object2( + replication_data_area, -1, test_virtual_service_endpoint, + replication_ingetloglevel, replication_inputLogFatal, + replication_inputLogError, replication_inputLogWarn, + replication_inputLogInfo, replication_inputLogDebug); + } catch (...) { + exception_occured = true; + } + BOOST_CHECK(exception_occured); + + cout << "[4]--------------------------------------------- " << endl; + // unit_test[4] ip_replication_area_sizeが0の場合, 例外が発生しない。 + try { + memset(replication_data_area, 0, 128*sizeof(l7vs::ip_replication_data_header)); + for(int i = 0; i < 128; i++){ + l7vs::ip_replication_data_header* temp= reinterpret_cast(replication_data_area) + i; + temp->size = static_cast(256 * sizeof(l7vs::ip_replication_data)); + } + l7vs::ip_replication_data_processor test_object2( + replication_data_area, 0, test_virtual_service_endpoint, + replication_ingetloglevel, replication_inputLogFatal, + replication_inputLogError, replication_inputLogWarn, + replication_inputLogInfo, replication_inputLogDebug); + } catch (...) { + BOOST_ERROR("exception: ip_replication_data_processor"); + } + + cout << "[5]--------------------------------------------- " << endl; + // unit_test[5] virtual service が存在して、且つ一つvirtual serviceを追加して、追加したvirtual serviceのサイズをチェックして、offsetが正しいことを確認する場合、 + // unit_test[5] virtual service対応のreplicationデータヘッダーの情報を再設定する。 + std::string virtual_service_ip = "192.168.120.102"; + memset(replication_data_area, 0, data_area_size); + test_virtual_service_endpoint.address(boost::asio::ip::address::from_string("192.168.120.103")); + test_virtual_service_endpoint.port(80); + memcpy(first_header->virtualserver_ip, virtual_service_ip.c_str(), virtual_service_ip.length()); + first_header->virtualserver_port = 80; + first_header->size = 256 * sizeof(l7vs::ip_replication_data); + first_header->offset = static_cast(real_data_start_address - header_start_address); + l7vs::ip_replication_data_processor test_object3( + replication_data_area, + SECTION_NUMBER, test_virtual_service_endpoint, + replication_ingetloglevel, replication_inputLogFatal, + replication_inputLogError, replication_inputLogWarn, + replication_inputLogInfo, replication_inputLogDebug); + // the virtual service's size is resetted, check it + size_t expecting_size = static_cast(256 * sizeof(l7vs::ip_replication_data)); + size_t expecting_offset = static_cast(real_data_start_address - header_start_address + first_header->size); + ip_replication_data* expecting_replication_data_area = reinterpret_cast(header_start_address + first_header->offset); + BOOST_CHECK_EQUAL((first_header+1)->size, expecting_size); + BOOST_CHECK_EQUAL((first_header+1)->offset, expecting_offset); + BOOST_CHECK_EQUAL(this->replication_area, expecting_replication_area); + + cout << "[6]--------------------------------------------- " << endl; + // unit_test[6] virtual service が存在して、且つvirtual serviceのデータエリアが実際サイズより小さいの場合 + // unit_test[6] 処理を行わない。 + virtual_service_ip = "192.168.120.102"; + memset(replication_data_area, 0, data_area_size); + test_virtual_service_endpoint.address(boost::asio::ip::address::from_string("192.168.120.103")); + test_virtual_service_endpoint.port(80); + memcpy(first_header->virtualserver_ip, virtual_service_ip.c_str(),virtual_service_ip.length()); + first_header->virtualserver_port = 80; + first_header->size = static_cast (256 * sizeof(l7vs::ip_replication_data)); + first_header->offset = static_cast (real_data_start_address - header_start_address); + unsigned old_port = first_header->virtualserver_port; + std::string old_virtual_service_ip(first_header->virtualserver_ip); + size_t old_size = first_header->size; + size_t old_offset = first_header->offset; + ip_replication_data_header temp_old_data; + memcpy(&temp_old_data, first_header, sizeof(ip_replication_data_header)); + l7vs::ip_replication_data_processor temp_test_object( + replication_data_area, 20, + test_virtual_service_endpoint, replication_ingetloglevel, + replication_inputLogFatal, replication_inputLogError, + replication_inputLogWarn, replication_inputLogInfo, + replication_inputLogDebug); + // first_header not changed check + std::string new_virtual_service_ip(first_header->virtualserver_ip); + BOOST_CHECK_EQUAL(new_virtual_service_ip, old_virtual_service_ip); + BOOST_CHECK_EQUAL(first_header->virtualserver_port, old_port); + BOOST_CHECK_EQUAL(first_header->size, old_size); + BOOST_CHECK_EQUAL(first_header->offset, old_offset); + int compare_result = memcmp(first_header, &temp_old_data, sizeof(ip_replication_data_header)); + BOOST_CHECK_EQUAL(compare_result, 0); + + cout << "[7]--------------------------------------------- " << endl; + // unit_test[7] virtual service対応のreplicationデータヘッダーの情報を再設定して、ヘッダーエリアがfullの場合,処理を行わない。 + try { + memset(replication_data_area, 0, 128*sizeof(l7vs::ip_replication_data_header)); + for(int i = 0; i < 128; i++){ + l7vs::ip_replication_data_header* temp= reinterpret_cast(replication_data_area) + i; + temp->size = 256 * sizeof(l7vs::ip_replication_data); + } + memcpy(first_header->virtualserver_ip, virtual_service_ip.c_str(), virtual_service_ip.length()); + first_header->virtualserver_port = 80; + first_header->size = static_cast(256 * sizeof(l7vs::ip_replication_data)); + first_header->offset = static_cast(real_data_start_address - header_start_address); + l7vs::ip_replication_data_processor test_object4( + replication_data_area, + SECTION_NUMBER, test_virtual_service_endpoint, + replication_ingetloglevel, replication_inputLogFatal, + replication_inputLogError, replication_inputLogWarn, + replication_inputLogInfo, replication_inputLogDebug); + } catch (...) { + BOOST_ERROR("exception: ip_replication_data_processor"); + } + + cout << "[8]--------------------------------------------- " << endl; + // unit_test[8] virtual service対応のreplicationデータヘッダーの情報を再設定する時, ヘッダーエリアがfullでない場合 + // unit_test[8] replicationデータヘッダーの情報を変更する。 + memset(replication_data_area, 0, data_area_size); + memcpy(first_header->virtualserver_ip, virtual_service_ip.c_str(), virtual_service_ip.length()); + first_header->virtualserver_port = 80; + first_header->size = static_cast(256 * sizeof(l7vs::ip_replication_data)); + first_header->offset = static_cast(real_data_start_address - header_start_address); + l7vs::ip_replication_data_processor test_object5( + replication_data_area, + SECTION_NUMBER, test_virtual_service_endpoint, + replication_ingetloglevel, replication_inputLogFatal, + replication_inputLogError, replication_inputLogWarn, + replication_inputLogInfo, replication_inputLogDebug); + // the virtual service information's size is resized, get it + expecting_size = static_cast(256 * sizeof(l7vs::ip_replication_data)); + // the virtual service information's offset is resized, get it + expecting_offset = static_cast(real_data_start_address - header_start_address + first_header->size); + expecting_replication_data_area = reinterpret_cast(header_start_address + first_header->offset); + // size check + BOOST_CHECK_EQUAL((first_header+1)->size, expecting_size); + // offset check + BOOST_CHECK_EQUAL((first_header+1)->offset, expecting_offset); + BOOST_CHECK_EQUAL(this->replication_area, expecting_replication_area); + + cout << "[9]--------------------------------------------- " << endl; + // unit_test[9] virtual service対応のreplicationデータヘッダーが存在しなくて、且つヘッダーエリアがfullでなく、且つ + // unit_test[9] replicationデータエリアの領域が足りない場合、処理を行わない。 + try { + memset(replication_data_area, 0, 128*sizeof(l7vs::ip_replication_data_header)); + std::string temp_virtual_service_ip = "255.255.255.255"; + test_virtual_service_endpoint.address(boost::asio::ip::address::from_string("192.168.120.104")); + test_virtual_service_endpoint.port(90); + for(int i = 0; i < 127; i++){ + l7vs::ip_replication_data_header* temp= reinterpret_cast(replication_data_area) + i; + temp->size = static_cast(256 * sizeof(l7vs::ip_replication_data)); + temp->virtualserver_port = 80; + memcpy(temp->virtualserver_ip, temp_virtual_service_ip.c_str(), temp_virtual_service_ip.length()); + } + ip_replication_data_header old_data; + memcpy(&old_data, reinterpret_cast(replication_data_area) + 127, sizeof(ip_replication_data_header)); + l7vs::ip_replication_data_processor test_object6( + replication_data_area, + 20, test_virtual_service_endpoint, + replication_ingetloglevel, replication_inputLogFatal, + replication_inputLogError, replication_inputLogWarn, + replication_inputLogInfo, replication_inputLogDebug); + compare_result = memcmp(reinterpret_cast(replication_data_area) + 127, &old_data, sizeof(ip_replication_data_header)); + BOOST_CHECK_EQUAL(compare_result, 0); + } catch (...) { + BOOST_ERROR("exception: ip_replication_data_processor"); + } + + cout << "[10]--------------------------------------------- " << endl; + // unit_test[10] virtual service対応のreplicationデータヘッダーが存在して、且つreplicationデータエリアの領域が足りる場合、 + // unit_test[10] ヘッダーエリアに、virtual serviceを追加する。 + memset(replication_data_area, 0, 128*sizeof(l7vs::ip_replication_data_header)); + test_virtual_service_endpoint.address(boost::asio::ip::address::from_string("192.168.1.112")); + test_virtual_service_endpoint.port(80); + memcpy(first_header->virtualserver_ip, virtual_service_ip.c_str(), virtual_service_ip.length()); + first_header->virtualserver_port = 80; + first_header->offset = static_cast(real_data_start_address - header_start_address); + first_header->size = 256 * sizeof(ip_replication_data); + l7vs::ip_replication_data_processor test_object7( + replication_data_area, + SECTION_NUMBER, test_virtual_service_endpoint, + replication_ingetloglevel, replication_inputLogFatal, + replication_inputLogError, replication_inputLogWarn, + replication_inputLogInfo, replication_inputLogDebug); + expecting_size = static_cast(256 * sizeof(l7vs::ip_replication_data)); + expecting_offset = static_cast(real_data_start_address - header_start_address) + 256 * sizeof(ip_replication_data); + expecting_replication_data_area = reinterpret_cast(real_data_start_address); + // ip information's size check + BOOST_CHECK_EQUAL((first_header + 1)->size, expecting_size); + // ip information's offset check + BOOST_CHECK_EQUAL((first_header + 1)->offset, expecting_offset); + // replication_area check + BOOST_CHECK_EQUAL(replication_area, expecting_replication_area); + + cout << "[11]--------------------------------------------- " << endl; + // unit_test[11] virtual serviceが存在しなくて、且つヘッダーエリアがfullの場合,処理を行わない。 + try { + memset(replication_data_area, 0, 128*sizeof(l7vs::ip_replication_data_header)); + std::string temp_virtual_service_ip = "255.255.255.255"; + for(int i = 0; i < 128; i++){ + l7vs::ip_replication_data_header* temp= reinterpret_cast(replication_data_area) + i; + temp->size = static_cast(256 * sizeof(l7vs::ip_replication_data)); + memcpy(temp->virtualserver_ip, temp_virtual_service_ip.c_str(), temp_virtual_service_ip.length()); + } + l7vs::ip_replication_data_processor test_object8( + replication_data_area, + SECTION_NUMBER, test_virtual_service_endpoint, + replication_ingetloglevel, replication_inputLogFatal, + replication_inputLogError, replication_inputLogWarn, + replication_inputLogInfo, replication_inputLogDebug); + } catch (...) { + BOOST_ERROR("exception: ip_replication_data_processor"); + } + + cout << "[12]--------------------------------------------- " << endl; + // unit_test[12] virtual serviceのipがipv6で、且つ一つvirtual serviceを追加する場合 + // unit_test[12] virtual service対応のreplicationデータヘッダーの情報を再設定する。 + virtual_service_ip = "abcd:21d0:8936:4866:eefe:567d:3a4b:1230"; + memset(replication_data_area, 0, data_area_size); + test_virtual_service_endpoint.address(boost::asio::ip::address::from_string("16.23.45.1")); + test_virtual_service_endpoint.port(80); + memcpy(first_header->virtualserver_ip, virtual_service_ip.c_str(), virtual_service_ip.length()); + first_header->virtualserver_port = 80; + first_header->size = static_cast(256 * sizeof(l7vs::ip_replication_data)); + first_header->offset = static_cast(real_data_start_address - header_start_address); + l7vs::ip_replication_data_processor test_object9( + replication_data_area, + SECTION_NUMBER, test_virtual_service_endpoint, + replication_ingetloglevel, replication_inputLogFatal, + replication_inputLogError, replication_inputLogWarn, + replication_inputLogInfo, replication_inputLogDebug); + // the virtual service's size is resetted, check it + expecting_size = static_cast(256 * sizeof(l7vs::ip_replication_data)); + expecting_offset = static_cast(real_data_start_address - header_start_address + first_header->size); + expecting_replication_data_area = reinterpret_cast(real_data_start_address); + BOOST_CHECK_EQUAL((first_header+1)->size, expecting_size); + BOOST_CHECK_EQUAL((first_header+1)->offset, expecting_offset); + BOOST_CHECK_EQUAL(this->replication_area, expecting_replication_area); + } + + // put_into_temp_list_test + void put_into_temp_list_test(){ + + time_t last_time = time(0); + boost::asio::ip::tcp::endpoint endpoint; + l7vs::ip_replication_temp_data test_data1; + l7vs::ip_replication_temp_data test_data2; + l7vs::ip_replication_temp_data test_data3; + + cout << "[13]--------------------------------------------- " << endl; + // unit_test[13] 1つのアイテムの場合、temp_listにデータを追加する。 + test_data1.ip_hash = 1111; + test_data1.last_time = last_time; + test_data1.op_code = 'A'; + test_data1.rs_endpoint = endpoint; + this->temp_list.clear(); + this->put_into_temp_list(test_data1); + l7vs::ip_replication_temp_data& put_into_data = this->temp_list.back(); + // the item which put into the temp_list check + // ip_hash check + BOOST_CHECK_EQUAL(put_into_data.ip_hash, test_data1.ip_hash); + // last_time check + BOOST_CHECK_EQUAL(put_into_data.last_time, test_data1.last_time); + // op_code check + BOOST_CHECK_EQUAL(put_into_data.op_code, 'A'); + // rs_endpoint check + BOOST_CHECK_EQUAL(put_into_data.rs_endpoint, test_data1.rs_endpoint); + + cout << "[14]--------------------------------------------- " << endl; + // unit_test[14] 2つのアイテムの場合、temp_listにデータを追加する。 + test_data1.ip_hash = 1111; + test_data1.last_time = last_time; + test_data1.op_code = 'U'; + test_data1.rs_endpoint = endpoint; + test_data2.ip_hash = 2222; + test_data2.last_time = last_time; + test_data2.op_code = 'A'; + test_data2.rs_endpoint = endpoint; + this->temp_list.clear(); + this->put_into_temp_list(test_data1); + this->put_into_temp_list(test_data2); + l7vs::ip_replication_temp_data& first_put_into_data = this->temp_list.front(); + l7vs::ip_replication_temp_data& second_put_into_data = this->temp_list.back(); + // the items which put into the temp_list check + // ip_hash check + BOOST_CHECK_EQUAL(first_put_into_data.ip_hash, test_data1.ip_hash); + BOOST_CHECK_EQUAL(second_put_into_data.ip_hash, test_data2.ip_hash); + // last_time check + BOOST_CHECK_EQUAL(first_put_into_data.last_time, test_data1.last_time); + BOOST_CHECK_EQUAL(second_put_into_data.last_time, test_data2.last_time); + // op_code check + BOOST_CHECK_EQUAL(first_put_into_data.op_code, 'U'); + BOOST_CHECK_EQUAL(second_put_into_data.op_code, 'A'); + // rs_endpoint check + BOOST_CHECK_EQUAL(first_put_into_data.rs_endpoint, test_data1.rs_endpoint); + BOOST_CHECK_EQUAL(second_put_into_data.rs_endpoint, test_data2.rs_endpoint); + + cout << "[15]--------------------------------------------- " << endl; + // unit_test[15] 3つのアイテムの場合、temp_listにデータを追加する。 + test_data1.ip_hash = 1111; + test_data1.last_time = last_time; + test_data1.op_code = 'U'; + test_data1.rs_endpoint = endpoint; + test_data2.ip_hash = 222; + test_data2.last_time = last_time; + test_data2.op_code = 'A'; + test_data2.rs_endpoint = endpoint; + test_data3.ip_hash = 333; + test_data3.last_time = last_time; + test_data3.op_code = 'A'; + test_data3.rs_endpoint = endpoint; + this->temp_list.clear(); + this->put_into_temp_list(test_data1); + this->put_into_temp_list(test_data2); + this->put_into_temp_list(test_data3); + first_put_into_data = this->temp_list[0]; + second_put_into_data = this->temp_list[1]; + l7vs::ip_replication_temp_data& third_put_into_data = this->temp_list[2]; + // the items which put into the temp_list check + // ip_hash check + BOOST_CHECK_EQUAL(first_put_into_data.ip_hash, test_data1.ip_hash); + BOOST_CHECK_EQUAL(second_put_into_data.ip_hash, test_data2.ip_hash); + BOOST_CHECK_EQUAL(third_put_into_data.ip_hash, test_data3.ip_hash); + // last_time check + BOOST_CHECK_EQUAL(first_put_into_data.last_time, test_data1.last_time); + BOOST_CHECK_EQUAL(second_put_into_data.last_time, test_data2.last_time); + BOOST_CHECK_EQUAL(third_put_into_data.last_time, test_data3.last_time); + // op_code check + BOOST_CHECK_EQUAL(first_put_into_data.op_code, 'U'); + BOOST_CHECK_EQUAL(second_put_into_data.op_code, 'A'); + BOOST_CHECK_EQUAL(third_put_into_data.op_code, 'A'); + // rs_endpoint check + BOOST_CHECK_EQUAL(first_put_into_data.rs_endpoint, test_data1.rs_endpoint); + BOOST_CHECK_EQUAL(second_put_into_data.rs_endpoint, test_data2.rs_endpoint); + BOOST_CHECK_EQUAL(third_put_into_data.rs_endpoint, test_data3.rs_endpoint); + + cout << "[16]--------------------------------------------- " << endl; + // unit_test[16] マルチスレッドの場合、temp_listにデータを正常追加する。 + try{ + boost::thread_group thread_group; + this->temp_list.clear(); + thread_group.create_thread(boost::bind( + &ip_replication_data_processor_test_class::put_into_temp_list_test_thread1, + this, 111, endpoint, last_time)); + thread_group.create_thread(boost::bind( + &ip_replication_data_processor_test_class::put_into_temp_list_test_thread2, + this, 222, endpoint, last_time)); + thread_group.create_thread(boost::bind( + &ip_replication_data_processor_test_class::put_into_temp_list_test_thread3, + this, 333, endpoint, last_time)); + thread_group.join_all(); + } catch(...){ + BOOST_ERROR("exception: put_into_temp_list"); + } + BOOST_CHECK_EQUAL(this->temp_list.size(), 3u); + // temp_list item check + int count = static_cast(this->temp_list.size()); + for(int i = 0; i < count; i++){ + ip_replication_temp_data& temp = this->temp_list[i]; + if(temp.ip_hash == 111){ + BOOST_CHECK_EQUAL(temp.op_code, 'A'); + BOOST_CHECK_EQUAL(temp.rs_endpoint, endpoint); + BOOST_CHECK_EQUAL(temp.last_time, last_time); + } else if(temp.ip_hash == 222){ + BOOST_CHECK_EQUAL(temp.op_code, 'U'); + BOOST_CHECK_EQUAL(temp.rs_endpoint, endpoint); + BOOST_CHECK_EQUAL(temp.last_time, last_time); + } else if(temp.ip_hash == 333){ + BOOST_CHECK_EQUAL(temp.op_code, 'A'); + BOOST_CHECK_EQUAL(temp.rs_endpoint, endpoint); + BOOST_CHECK_EQUAL(temp.last_time, last_time); + } else { + BOOST_ERROR("error: put_into_temp_list"); + } + } + + cout << "[17]--------------------------------------------- " << endl; + // unit_test[17] マルチスレッド がつ temp_listのサイズが max_temp_listの場合、temp_listにデータを正常追加する。 + try{ + boost::thread_group thread_group; + is_put_into_temp_list_test_thread4_waiting = false; + this->temp_list.clear(); + thread_group.create_thread(boost::bind( + &ip_replication_data_processor_test_class::put_into_temp_list_test_thread4, + this, 111, endpoint, last_time)); + while(!is_put_into_temp_list_test_thread4_waiting){ + } + thread_group.create_thread(boost::bind(&ip_replication_data_processor_test_class::put_into_temp_list_test_thread5, this)); + thread_group.join_all(); + } catch(...){ + BOOST_ERROR("exception: put_into_temp_list"); + } + BOOST_CHECK_EQUAL(this->temp_list.size(), 5u); + // temp_list item check + count = static_cast(this->temp_list.size()); + for(int i = 0; i < count; i++){ + ip_replication_temp_data& temp = this->temp_list[i]; + BOOST_CHECK_EQUAL(temp.ip_hash, 111); + BOOST_CHECK_EQUAL(temp.rs_endpoint, endpoint); + BOOST_CHECK_EQUAL(temp.last_time, last_time); + BOOST_CHECK_EQUAL(temp.op_code, 'A'); + } + + cout << "[18]--------------------------------------------- " << endl; + // unit_test[18] ルチスレッド がつ temp_list size > max_temp_listの場合、temp_listにデータを正常追加する。 + try{ + boost::thread_group thread_group; + is_put_into_temp_list_test_thread6_waiting = false; + this->temp_list.clear(); + thread_group.create_thread(boost::bind( + &ip_replication_data_processor_test_class::put_into_temp_list_test_thread6, + this, 111, endpoint, last_time)); + while(!is_put_into_temp_list_test_thread6_waiting){ + } + thread_group.create_thread(boost::bind(&ip_replication_data_processor_test_class::put_into_temp_list_test_thread7, this)); + thread_group.join_all(); + } catch(...){ + BOOST_ERROR("exception: put_into_temp_list"); + } + BOOST_CHECK_EQUAL(this->temp_list.size(), 4u); + // temp_list item check + count = static_cast(this->temp_list.size()); + for(int i = 0; i < count; i++){ + ip_replication_temp_data& temp = this->temp_list[i]; + BOOST_CHECK_EQUAL(temp.ip_hash, 111); + BOOST_CHECK_EQUAL(temp.rs_endpoint, endpoint); + BOOST_CHECK_EQUAL(temp.last_time, last_time); + BOOST_CHECK_EQUAL(temp.op_code, 'A'); + } + + cout << "[19]--------------------------------------------- " << endl; + // unit_test[19] temp_listがfullで、且1つのスレッドが待ち状態の場合、waitingフラグを待ちに設定する。 + try{ + boost::thread_group thread_group; + + is_put_into_temp_list_test_thread8_waiting = false; + this->temp_list.clear(); + + thread_group.create_thread(boost::bind( + &ip_replication_data_processor_test_class::put_into_temp_list_test_thread8, + this, 111, endpoint, last_time)); + + while(!is_put_into_temp_list_test_thread8_waiting){ + } + // put_into_temp_list_test_thread8 is waiting check + BOOST_CHECK_EQUAL(is_put_into_temp_list_test_thread8_waiting, true); + + thread_group.create_thread(boost::bind(&ip_replication_data_processor_test_class::put_into_temp_list_test_thread7, this)); + thread_group.join_all(); + } catch(...){ + BOOST_ERROR("exception: put_into_temp_list"); + } + + cout << "[20]--------------------------------------------- " << endl; + // unit_test[20] temp_listがfullで、且2つのスレッドが待ち状態の場合、waitingフラグを待ちに設定する。 + try{ + boost::thread_group thread_group; + + is_put_into_temp_list_test_thread8_waiting = false; + is_put_into_temp_list_test_thread9_waiting = false; + this->temp_list.clear(); + + thread_group.create_thread(boost::bind( + &ip_replication_data_processor_test_class::put_into_temp_list_test_thread8, + this, 111, endpoint, last_time)); + + while(!is_put_into_temp_list_test_thread8_waiting){ + } + thread_group.create_thread(boost::bind( + &ip_replication_data_processor_test_class::put_into_temp_list_test_thread9, + this, 111, endpoint, last_time)); + + while(!is_put_into_temp_list_test_thread9_waiting){ + } + + // put_into_temp_list_test_thread8 is waiting check + BOOST_CHECK_EQUAL(is_put_into_temp_list_test_thread8_waiting, true); + // put_into_temp_list_test_thread9 is waiting check + BOOST_CHECK_EQUAL(is_put_into_temp_list_test_thread9_waiting, true); + + thread_group.create_thread(boost::bind(&ip_replication_data_processor_test_class::put_into_temp_list_test_thread7, this)); + thread_group.join_all(); + } catch(...){ + BOOST_ERROR("exception: put_into_temp_list"); + } + + cout << "[21]--------------------------------------------- " << endl; + // unit_test[21] temp_listがfullで、且3つのスレッドが待ち状態の場合、waitingフラグを待ちに設定する。 + try{ + boost::thread_group thread_group; + + is_put_into_temp_list_test_thread8_waiting = false; + is_put_into_temp_list_test_thread9_waiting = false; + is_put_into_temp_list_test_thread10_waiting = false; + this->temp_list.clear(); + + thread_group.create_thread(boost::bind( + &ip_replication_data_processor_test_class::put_into_temp_list_test_thread8, + this, 111, endpoint, last_time)); + while(!is_put_into_temp_list_test_thread8_waiting){ + } + thread_group.create_thread(boost::bind( + &ip_replication_data_processor_test_class::put_into_temp_list_test_thread9, + this, 111, endpoint, last_time)); + thread_group.create_thread(boost::bind( + &ip_replication_data_processor_test_class::put_into_temp_list_test_thread10, + this, 111, endpoint, last_time)); + while(!is_put_into_temp_list_test_thread9_waiting){ + } + while(!is_put_into_temp_list_test_thread10_waiting){ + } + + // put_into_temp_list_test_thread8 is waiting check + BOOST_CHECK_EQUAL(is_put_into_temp_list_test_thread8_waiting, true); + // put_into_temp_list_test_thread9 is waiting check + BOOST_CHECK_EQUAL(is_put_into_temp_list_test_thread9_waiting, true); + // put_into_temp_list_test_thread10 is waiting check + BOOST_CHECK_EQUAL(is_put_into_temp_list_test_thread10_waiting, true); + + thread_group.create_thread(boost::bind(&ip_replication_data_processor_test_class::put_into_temp_list_test_thread7, this)); + thread_group.join_all(); + } catch(...){ + BOOST_ERROR("exception: put_into_temp_list"); + } + } + + // write_replicaion_area_test + void write_replicaion_area_test(){ + + { + cout << "[22]--------------------------------------------- " << endl; + // unit_test[22] replication_area が NULLの場合、例外が発生しない。 + ip_replication_data *old_replication_area = this->replication_area; + try + { + this->temp_list.clear(); + this->replication_area = NULL; + this->replication_area_lock = lock_function; + this->replication_area_unlock = unlock_function; + this->write_replication_area(); + } + catch (...) + { + BOOST_ERROR("exception: write_replication_area"); + } + this->replication_area = old_replication_area; + } + + { + cout << "[23]--------------------------------------------- " << endl; + // unit_test[23] temp_listが空の場合、例外が発生しない。 + try + { + this->temp_list.clear(); + this->replication_area_lock = lock_function; + this->replication_area_unlock = unlock_function; + this->write_replication_area(); + } + catch (...) + { + BOOST_ERROR("exception: write_replication_area"); + } + + } + + { + cout << "[24]--------------------------------------------- " << endl; + // unit_test[24] op_codeが「A」で、且つreplication_areaに1つのデータが存在する場合、新データを追加する。 + memset(this->replication_area, 0, 256 * sizeof(ip_replication_data)); + this->temp_list.clear(); + + time_t time1 = time(NULL) - 1; + time_t time2 = time(NULL) - 2; + struct ip_replication_data replication_data1 = { "172.16.58.66", 80, time1, 1 }; + boost::asio::ip::tcp::endpoint cl_endpoint1 = string_to_endpoint ("192.168.1.100:1234"); + boost::asio::ip::tcp::endpoint cl_endpoint2 = string_to_endpoint ("192.168.1.101:1234"); + boost::asio::ip::tcp::endpoint rs_endpoint1 = string_to_endpoint ("172.168.58.66:80"); + boost::asio::ip::tcp::endpoint rs_endpoint2 = string_to_endpoint ("172.168.58.67:80"); + int ip_hash1 = calc_hash(cl_endpoint1); + int ip_hash2 = calc_hash(cl_endpoint2); + struct ip_replication_temp_data temp_data2 = { 'A', ip_hash2, time2, rs_endpoint2 }; + this->temp_list.push_back(temp_data2); + this->replication_area[ip_hash1] = replication_data1; + this->write_replication_area(); + BOOST_CHECK_EQUAL(strcmp(this->replication_area[ip_hash2].realserver_ip, rs_endpoint2.address().to_string().c_str()), 0); + BOOST_CHECK_EQUAL(this->replication_area[ip_hash2].realserver_port, (unsigned short)80); + BOOST_CHECK_EQUAL(this->replication_area[ip_hash2].last_time, time2); + BOOST_CHECK_EQUAL(this->replication_area[ip_hash2].valid, 1); + } + + { + cout << "[25]--------------------------------------------- " << endl; + // unit_test[25] op_codeが「A」で、且つreplication_areaに2つのデータが存在して、且つ1つ目データのvalidフラグが0の場合、新のデータを追加する。 + memset(this->replication_area, 0, 256 * sizeof(ip_replication_data)); + this->temp_list.clear(); + + time_t time1 = time(NULL) - 1; + time_t time2 = time(NULL) - 2; + time_t time3 = time(NULL) - 3; + struct ip_replication_data replication_data1 = { "172.16.58.66", 80, time1, 1 }; + struct ip_replication_data replication_data2 = { "172.16.58.67", 80, time2, 0 }; + boost::asio::ip::tcp::endpoint cl_endpoint1 = string_to_endpoint ("192.168.1.100:1234"); + boost::asio::ip::tcp::endpoint cl_endpoint2 = string_to_endpoint ("192.168.1.101:1234"); + boost::asio::ip::tcp::endpoint cl_endpoint3 = string_to_endpoint ("192.168.1.102:1234"); + boost::asio::ip::tcp::endpoint rs_endpoint1 = string_to_endpoint ("172.168.58.66:80"); + boost::asio::ip::tcp::endpoint rs_endpoint2 = string_to_endpoint ("172.168.58.67:80"); + boost::asio::ip::tcp::endpoint rs_endpoint3 = string_to_endpoint ("172.168.58.68:80"); + int ip_hash1 = calc_hash(cl_endpoint1); + int ip_hash2 = calc_hash(cl_endpoint2); + int ip_hash3 = calc_hash(cl_endpoint3); + struct ip_replication_temp_data temp_data3 = { 'A', ip_hash3, time3, rs_endpoint3 }; + this->temp_list.push_back(temp_data3); + this->replication_area[ip_hash1] = replication_data1; + this->replication_area[ip_hash2] = replication_data2; + this->write_replication_area(); + BOOST_CHECK_EQUAL(strcmp(this->replication_area[ip_hash3].realserver_ip, rs_endpoint3.address().to_string().c_str()), 0); + BOOST_CHECK_EQUAL(this->replication_area[ip_hash3].realserver_port, (unsigned short)80); + BOOST_CHECK_EQUAL(this->replication_area[ip_hash3].last_time, time3); + BOOST_CHECK_EQUAL(this->replication_area[ip_hash3].valid, 1); + } + + { + cout << "[26]--------------------------------------------- " << endl; + // unit_test[26] op_codeが「A」で、且つreplication_areaにデータが存在しない場合、新のデータを追加する。 + memset(this->replication_area, 0, 256 * sizeof(ip_replication_data)); + this->temp_list.clear(); + + time_t time1 = time(NULL) - 1; + boost::asio::ip::tcp::endpoint cl_endpoint1 = string_to_endpoint ("192.168.1.100:1234"); + boost::asio::ip::tcp::endpoint rs_endpoint1 = string_to_endpoint ("172.16.58.66:80"); + int ip_hash1 = calc_hash(cl_endpoint1); + struct ip_replication_temp_data temp_data = { 'A', ip_hash1, time1, rs_endpoint1 }; + this->temp_list.push_back(temp_data); + this->write_replication_area(); + BOOST_CHECK_EQUAL(strcmp(this->replication_area[ip_hash1].realserver_ip, rs_endpoint1.address().to_string().c_str()), 0); + BOOST_CHECK_EQUAL(this->replication_area[ip_hash1].realserver_port, (unsigned short)80); + BOOST_CHECK_EQUAL(this->replication_area[ip_hash1].last_time, time1); + BOOST_CHECK_EQUAL(this->replication_area[ip_hash1].valid, 1); + } + + { + cout << "[27]--------------------------------------------- " << endl; + // unit_test[27] op_codeが「U」で、且つセッションIDが存在している場合、該当データを更新する。 + memset(this->replication_area, 0, 256 * sizeof(ip_replication_data)); + this->temp_list.clear(); + + time_t time1_new = time(NULL) - 1; + time_t time1_old = time(NULL) - 10; + struct ip_replication_data replication_data1 = { "172.16.58.66", 80, time1_old, 1 }; + boost::asio::ip::tcp::endpoint cl_endpoint1 = string_to_endpoint ("192.168.1.100:1234"); + boost::asio::ip::tcp::endpoint rs_endpoint1 = string_to_endpoint ("172.16.58.66:80"); + int ip_hash1 = calc_hash(cl_endpoint1); + struct ip_replication_temp_data temp_data = { 'U', ip_hash1, time1_new, rs_endpoint1 }; + this->temp_list.push_back(temp_data); + this->replication_area[ip_hash1] = replication_data1; + this->write_replication_area(); + BOOST_CHECK_EQUAL(strcmp(this->replication_area[ip_hash1].realserver_ip, rs_endpoint1.address().to_string().c_str()), 0); + BOOST_CHECK_EQUAL(this->replication_area[ip_hash1].realserver_port, (unsigned short)80); + BOOST_CHECK_EQUAL(this->replication_area[ip_hash1].last_time, time1_new); + BOOST_CHECK_EQUAL(this->replication_area[ip_hash1].valid, 1); + } + + { + cout << "[28]--------------------------------------------- " << endl; + // unit_test[28] op_codeが「A」,「U」以外の場合、データを変更しない。 + memset(this->replication_area, 0, 256 * sizeof(ip_replication_data)); + this->temp_list.clear(); + + time_t time1 = time(NULL) - 1; + time_t time2 = time(NULL) - 2; + time_t time3 = time(NULL) - 3; + time_t time4 = time(NULL) - 4; + struct ip_replication_data replication_data1 = { "172.16.58.66", 80, time1, 1 }; + struct ip_replication_data replication_data2 = { "172.16.58.67", 80, time2, 1 }; + struct ip_replication_data replication_data3 = { "172.16.58.68", 80, time3, 1 }; + boost::asio::ip::tcp::endpoint cl_endpoint1 = string_to_endpoint ("192.168.1.100:1234"); + boost::asio::ip::tcp::endpoint cl_endpoint2 = string_to_endpoint ("192.168.1.101:1234"); + boost::asio::ip::tcp::endpoint cl_endpoint3 = string_to_endpoint ("192.168.1.102:1234"); + boost::asio::ip::tcp::endpoint cl_endpoint4 = string_to_endpoint ("192.168.1.103:1234"); + boost::asio::ip::tcp::endpoint rs_endpoint1 = string_to_endpoint ("172.16.58.66:80"); + boost::asio::ip::tcp::endpoint rs_endpoint2 = string_to_endpoint ("172.16.58.67:80"); + boost::asio::ip::tcp::endpoint rs_endpoint3 = string_to_endpoint ("172.16.58.68:80"); + boost::asio::ip::tcp::endpoint rs_endpoint4 = string_to_endpoint ("172.16.58.69:80"); + int ip_hash1 = calc_hash(cl_endpoint1); + int ip_hash2 = calc_hash(cl_endpoint2); + int ip_hash3 = calc_hash(cl_endpoint3); + int ip_hash4 = calc_hash(cl_endpoint4); + struct ip_replication_temp_data temp_data = { 'Z', ip_hash4, time4, rs_endpoint4 }; + this->temp_list.push_back(temp_data); + this->replication_area[ip_hash1] = replication_data1; + this->replication_area[ip_hash2] = replication_data2; + this->replication_area[ip_hash3] = replication_data3; + this->write_replication_area(); + BOOST_CHECK_EQUAL(strcmp(this->replication_area[ip_hash1].realserver_ip, rs_endpoint1.address().to_string().c_str()), 0); + BOOST_CHECK_EQUAL(this->replication_area[ip_hash1].realserver_port, (unsigned short)80); + BOOST_CHECK_EQUAL(this->replication_area[ip_hash1].last_time, time1); + BOOST_CHECK_EQUAL(this->replication_area[ip_hash1].valid, 1); + BOOST_CHECK_EQUAL(strcmp(this->replication_area[ip_hash2].realserver_ip, rs_endpoint2.address().to_string().c_str()), 0); + BOOST_CHECK_EQUAL(this->replication_area[ip_hash2].realserver_port, (unsigned short)80); + BOOST_CHECK_EQUAL(this->replication_area[ip_hash2].last_time, time2); + BOOST_CHECK_EQUAL(this->replication_area[ip_hash2].valid, 1); + BOOST_CHECK_EQUAL(strcmp(this->replication_area[ip_hash3].realserver_ip, rs_endpoint3.address().to_string().c_str()), 0); + BOOST_CHECK_EQUAL(this->replication_area[ip_hash3].realserver_port, (unsigned short)80); + BOOST_CHECK_EQUAL(this->replication_area[ip_hash3].last_time, time3); + BOOST_CHECK_EQUAL(this->replication_area[ip_hash3].valid, 1); + } + + { + cout << "[29]--------------------------------------------- " << endl; + // unit_test[29] データを追加するの場合、replication_area_lock関数を呼び出す。 + memset(this->replication_area, 0, 256 * sizeof(ip_replication_data)); + this->temp_list.clear(); + is_lock_function_called = false; + + this->replication_area_lock = lock_function; + this->replication_area_unlock = unlock_function; + time_t time1 = time(NULL) - 1; + boost::asio::ip::tcp::endpoint cl_endpoint1 = string_to_endpoint ("192.168.1.100:1234"); + boost::asio::ip::tcp::endpoint rs_endpoint1 = string_to_endpoint ("172.16.58.66:80"); + int ip_hash1 = calc_hash(cl_endpoint1); + struct ip_replication_temp_data temp_data = { 'A', ip_hash1, time1, rs_endpoint1 }; + this->temp_list.push_back(temp_data); + this->write_replication_area(); + BOOST_CHECK(is_lock_function_called); + } + + { + cout << "[30]--------------------------------------------- " << endl; + // unit_test[30] データを追加するの場合、replication_area_unlock関数を呼び出す。 + memset(this->replication_area, 0, 256 * sizeof(ip_replication_data)); + this->temp_list.clear(); + is_unlock_function_called = false; + + this->replication_area_lock = lock_function; + this->replication_area_unlock = unlock_function; + time_t time1 = time(NULL) - 1; + boost::asio::ip::tcp::endpoint cl_endpoint1 = string_to_endpoint ("192.168.1.100:1234"); + boost::asio::ip::tcp::endpoint rs_endpoint1 = string_to_endpoint ("172.16.58.66:80"); + int ip_hash1 = calc_hash(cl_endpoint1); + struct ip_replication_temp_data temp_data = { 'A', ip_hash1, time1, rs_endpoint1 }; + this->temp_list.push_back(temp_data); + this->write_replication_area(); + BOOST_CHECK(is_unlock_function_called); + } + + { + cout << "[31]--------------------------------------------- " << endl; + // unit_test[31] endpointがipv6で、replicationエリアにデータがなくて、該当ipv6のendpointを追加する。 + memset(this->replication_area, 0, 256 * sizeof(ip_replication_data)); + this->temp_list.clear(); + + time_t time1 = time(NULL) - 1; + boost::asio::ip::tcp::endpoint cl_endpoint1 = string_to_endpoint ("192.168.1.100:1234"); + boost::asio::ip::tcp::endpoint rs_endpoint1 = boost::asio::ip::tcp::endpoint(boost::asio::ip::address::from_string("abcd:21d0:8936:4866:eefe:567d:3a4b:1230"), 80); + int ip_hash1 = calc_hash(cl_endpoint1); + struct ip_replication_temp_data temp_data = { 'A', ip_hash1, time1, rs_endpoint1 }; + this->temp_list.push_back(temp_data); + this->write_replication_area(); + BOOST_CHECK_EQUAL(strcmp(this->replication_area[ip_hash1].realserver_ip, rs_endpoint1.address().to_string().c_str()), 0); + BOOST_CHECK_EQUAL(this->replication_area[ip_hash1].realserver_port, 80); + BOOST_CHECK_EQUAL(this->replication_area[ip_hash1].last_time, time1); + BOOST_CHECK_EQUAL(this->replication_area[ip_hash1].valid, 1); + } + + { + cout << "[32]--------------------------------------------- " << endl; + // unit_test[32] op_codeが「U」で、endpointがipv6で、replicationエリアにデータがある場合、該当ipv6のendpointを更新する。 + memset(this->replication_area, 0, 256 * sizeof(ip_replication_data)); + this->temp_list.clear(); + + time_t time1_old = time(NULL) - 1; + time_t time1_new = time(NULL) - 2; + struct ip_replication_data replication_data1 = { "abcd:21d0:8936:4866:eefe:567d:3a4b:1230", 80, time1_old, 1}; + boost::asio::ip::tcp::endpoint cl_endpoint1 = string_to_endpoint ("192.168.1.100:1234"); + boost::asio::ip::tcp::endpoint rs_endpoint1 = boost::asio::ip::tcp::endpoint(boost::asio::ip::address::from_string("abcd:21d0:8936:4866:eefe:567d:3a4b:1230"), 80); + int ip_hash1 = calc_hash(cl_endpoint1); + struct ip_replication_temp_data temp_data = { 'U', ip_hash1, time1_new, rs_endpoint1 }; + this->temp_list.push_back(temp_data); + this->replication_area[ip_hash1] = replication_data1; + this->write_replication_area(); + BOOST_CHECK_EQUAL(strcmp(this->replication_area[ip_hash1].realserver_ip, rs_endpoint1.address().to_string().c_str()), 0); + BOOST_CHECK_EQUAL(this->replication_area[ip_hash1].realserver_port, 80); + BOOST_CHECK_EQUAL(this->replication_area[ip_hash1].last_time, time1_new); + BOOST_CHECK_EQUAL(this->replication_area[ip_hash1].valid, 1); + } + + { + cout << "[33]--------------------------------------------- " << endl; + // unit_test[33] op_codeが「A」で、ipが"0.0.0.0"で、該当のデータを追加する。 + memset(this->replication_area, 0, 256 * sizeof(ip_replication_data)); + this->temp_list.clear(); + + time_t time1 = time(NULL) - 1; + boost::asio::ip::tcp::endpoint cl_endpoint1 = string_to_endpoint ("0.0.0.0:0"); + boost::asio::ip::tcp::endpoint rs_endpoint1 = string_to_endpoint ("0.0.0.0:0"); + int ip_hash1 = calc_hash(cl_endpoint1); + struct ip_replication_temp_data temp_data = { 'A', ip_hash1, time1, rs_endpoint1 }; + this->temp_list.push_back(temp_data); + this->write_replication_area(); + BOOST_CHECK_EQUAL(strcmp(this->replication_area[ip_hash1].realserver_ip, rs_endpoint1.address().to_string().c_str()), 0); + BOOST_CHECK_EQUAL(this->replication_area[ip_hash1].realserver_port, 0); + BOOST_CHECK_EQUAL(this->replication_area[ip_hash1].last_time, time1); + BOOST_CHECK_EQUAL(this->replication_area[ip_hash1].valid, 1); + } + + { + cout << "[34]--------------------------------------------- " << endl; + // unit_test[34] op_codeが「A」で、ipが"255.255.255.255"で、該当のデータを追加する。 + memset(this->replication_area, 0, 256 * sizeof(ip_replication_data)); + this->temp_list.clear(); + + time_t time1 = time(NULL) - 1; + boost::asio::ip::tcp::endpoint cl_endpoint1 = string_to_endpoint ("255.255.255.255:65535"); + boost::asio::ip::tcp::endpoint rs_endpoint1 = string_to_endpoint ("255.255.255.255:65535"); + int ip_hash1 = calc_hash(cl_endpoint1); + struct ip_replication_temp_data temp_data = { 'A', ip_hash1, time1, rs_endpoint1 }; + this->temp_list.push_back(temp_data); + this->write_replication_area(); + BOOST_CHECK_EQUAL(strcmp(this->replication_area[ip_hash1].realserver_ip, rs_endpoint1.address().to_string().c_str()), 0); + BOOST_CHECK_EQUAL(this->replication_area[ip_hash1].realserver_port, 65535); + BOOST_CHECK_EQUAL(this->replication_area[ip_hash1].last_time, time1); + BOOST_CHECK_EQUAL(this->replication_area[ip_hash1].valid, 1); + } + + { + cout << "[35]--------------------------------------------- " << endl; + // unit_test[35] op_codeが「U」で、ipが"0.0.0.0"で、該当のデータを追加する。 + memset(this->replication_area, 0, 256 * sizeof(ip_replication_data)); + this->temp_list.clear(); + + time_t time1_old = time(NULL) - 1; + time_t time1_new = time(NULL) - 2; + struct ip_replication_data replication_data1 = { "0.0.0.0", 0, time1_old, 1 }; + boost::asio::ip::tcp::endpoint cl_endpoint1 = string_to_endpoint ("0.0.0.0:0"); + boost::asio::ip::tcp::endpoint rs_endpoint1 = string_to_endpoint ("0.0.0.0:0"); + int ip_hash1 = calc_hash(cl_endpoint1); + struct ip_replication_temp_data temp_data = { 'U', ip_hash1, time1_new, rs_endpoint1 }; + this->replication_area[ip_hash1] = replication_data1; + this->temp_list.push_back(temp_data); + this->write_replication_area(); + BOOST_CHECK_EQUAL(strcmp(this->replication_area[ip_hash1].realserver_ip, rs_endpoint1.address().to_string().c_str()), 0); + BOOST_CHECK_EQUAL(this->replication_area[ip_hash1].realserver_port, 0); + BOOST_CHECK_EQUAL(this->replication_area[ip_hash1].last_time, time1_new); + BOOST_CHECK_EQUAL(this->replication_area[ip_hash1].valid, 1); + } + + { + cout << "[36]--------------------------------------------- " << endl; + // unit_test[36] op_codeが「U」で、ipが"255.255.255.255"で、該当のデータを追加する。 + memset(this->replication_area, 0, 256 * sizeof(ip_replication_data)); + this->temp_list.clear(); + + time_t time1_old = time(NULL) - 1; + time_t time1_new = time(NULL) - 2; + struct ip_replication_data replication_data1 = { "255.255.255.255", 65535, time1_old, 1 }; + boost::asio::ip::tcp::endpoint cl_endpoint1 = string_to_endpoint ("255.255.255.255:65535"); + boost::asio::ip::tcp::endpoint rs_endpoint1 = string_to_endpoint ("255.255.255.255:65535"); + int ip_hash1 = calc_hash(cl_endpoint1); + struct ip_replication_temp_data temp_data = { 'U', ip_hash1, time1_new, rs_endpoint1 }; + this->replication_area[ip_hash1] = replication_data1; + this->temp_list.push_back(temp_data); + this->write_replication_area(); + BOOST_CHECK_EQUAL(strcmp(this->replication_area[ip_hash1].realserver_ip, rs_endpoint1.address().to_string().c_str()), 0); + BOOST_CHECK_EQUAL(this->replication_area[ip_hash1].realserver_port, 65535); + BOOST_CHECK_EQUAL(this->replication_area[ip_hash1].last_time, time1_new); + BOOST_CHECK_EQUAL(this->replication_area[ip_hash1].valid, 1); + } + + { + cout << "[37]--------------------------------------------- " << endl; + // unit_test[37] op_codeが「U」で、ipが"FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF"で、該当のデータを追加する。 + memset(this->replication_area, 0, 256 * sizeof(ip_replication_data)); + this->temp_list.clear(); + + time_t time1_old = time(NULL) - 1; + time_t time1_new = time(NULL) - 2; + struct ip_replication_data replication_data1 = { "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", 65535, time1_old, 1 }; + boost::asio::ip::tcp::endpoint cl_endpoint1 = boost::asio::ip::tcp::endpoint(boost::asio::ip::address::from_string("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"), 65535); + boost::asio::ip::tcp::endpoint rs_endpoint1 = boost::asio::ip::tcp::endpoint(boost::asio::ip::address::from_string("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"), 65535); + int ip_hash1 = calc_hash(cl_endpoint1); + struct ip_replication_temp_data temp_data = { 'U', ip_hash1, time1_new, rs_endpoint1 }; + this->replication_area[ip_hash1] = replication_data1; + this->temp_list.push_back(temp_data); + this->write_replication_area(); + BOOST_CHECK_EQUAL(strcmp(this->replication_area[ip_hash1].realserver_ip, rs_endpoint1.address().to_string().c_str()), 0); + BOOST_CHECK_EQUAL(this->replication_area[ip_hash1].realserver_port, 65535); + BOOST_CHECK_EQUAL(this->replication_area[ip_hash1].last_time, time1_new); + BOOST_CHECK_EQUAL(this->replication_area[ip_hash1].valid, 1); + } + } + + // register_replication_area_lock_test + void register_replication_area_lock_test(){ + + boost::function register_function = &lock_function; + + cout << "[38]--------------------------------------------- " << endl; + // unit_test[38] register_replication_area_lock()関数のパラメータがNULLの場合、replication_area_lockがNULLある。 + this->register_replication_area_lock(NULL); + BOOST_CHECK_EQUAL(this->replication_area_lock.empty(), true); + + cout << "[39]--------------------------------------------- " << endl; + // unit_test[39] register_replication_area_lock()関数のパラメータがNULLでない場合、replication_area_lockがパラメータと一致する。 + this->register_replication_area_lock(register_function); + // function registered correctly check; + BOOST_CHECK_EQUAL(this->replication_area_lock, lock_function); + } + + // register_replication_area_unlock_test + void register_replication_area_unlock_test(){ + + boost::function register_function = &unlock_function; + + cout << "[40]--------------------------------------------- " << endl; + // unit_test[40] register_replication_area_unlock()関数のパラメータがNULLの場合、replication_area_unlockがNULLある。 + this->register_replication_area_unlock(NULL); + // function registered correctly check; + BOOST_CHECK_EQUAL(this->replication_area_unlock.empty(), true); + + cout << "[41]--------------------------------------------- " << endl; + // unit_test[41] register_replication_area_unlock()関数のパラメータがNULLでない場合、replication_area_unlockがパラメータと一致する。 + this->register_replication_area_unlock(register_function); + // function registered correctly check; + BOOST_CHECK_EQUAL(this->replication_area_unlock, unlock_function); + } + + // get_from_temp_list_test + void get_from_temp_list_test(){ + + int result = 10; + l7vs::ip_replication_temp_data test_data1; + l7vs::ip_replication_temp_data test_data2; + l7vs::ip_replication_temp_data get_data; + boost::asio::ip::tcp::endpoint endpoint; + + cout << "[42]--------------------------------------------- " << endl; + // unit_test[42] temp_listのサイズが0の場合、戻り値が失敗(-1)で設定する。 + this->temp_list.clear(); + result = this->get_from_temp_list(get_data); + BOOST_CHECK_EQUAL(result, -1); + + cout << "[43]--------------------------------------------- " << endl; + // unit_test[43] temp_listのサイズが1の場合、戻り値が正常(0)で設定する。 + test_data1.ip_hash = 111; + test_data1.op_code = 'A'; + test_data1.rs_endpoint = endpoint; + test_data1.last_time = 1000; + this->temp_list.clear(); + this->temp_list.push_back(test_data1); + result = this->get_from_temp_list(get_data); + BOOST_CHECK_EQUAL(result, 0); + + cout << "[44]--------------------------------------------- " << endl; + // unit_test[44] temp_listのサイズが3の場合、戻り値が正常(0)で設定する。 + this->temp_list.clear(); + this->temp_list.push_back(test_data1); + this->temp_list.push_back(test_data1); + this->temp_list.push_back(test_data1); + result = this->get_from_temp_list(get_data); + BOOST_CHECK_EQUAL(result, 0); + + cout << "[45]--------------------------------------------- " << endl; + // unit_test[45] マルチスレッドの場合、temp_listにデータを正常取得する。 + try { + this->temp_list.clear(); + this->temp_list.push_back(test_data1); + this->temp_list.push_back(test_data1); + this->temp_list.push_back(test_data1); + this->temp_list.push_back(test_data1); + boost::thread_group thread_group1; + thread_group1.create_thread(boost::bind(&ip_replication_data_processor_test_class::get_from_temp_list_thread1, this)); + thread_group1.create_thread(boost::bind(&ip_replication_data_processor_test_class::get_from_temp_list_thread1, this)); + thread_group1.create_thread(boost::bind(&ip_replication_data_processor_test_class::get_from_temp_list_thread1, this)); + thread_group1.join_all(); + } catch(...) { + BOOST_ERROR("exception: get_from_temp_list"); + } + + cout << "[46]--------------------------------------------- " << endl; + // unit_test[46] temp_listにデータがある場合、1つ目のデータを削除する。 + test_data1.ip_hash = 111; + test_data1.op_code = 'U'; + test_data1.rs_endpoint= endpoint; + test_data1.last_time = time(0); + test_data2.ip_hash = 222; + test_data2.op_code = 'A'; + test_data2.rs_endpoint = endpoint; + test_data2.last_time = time(0); + this->temp_list.clear(); + this->temp_list.push_back(test_data1); + this->temp_list.push_back(test_data2); + this->get_from_temp_list(get_data); + l7vs::ip_replication_temp_data& leave_data = this->temp_list.back(); + // first item removed check,so only one item leave, check it + BOOST_CHECK_EQUAL(this->temp_list.size(), 1u); + // ip check + BOOST_CHECK_EQUAL(leave_data.ip_hash, test_data2.ip_hash); + // op_code check + BOOST_CHECK_EQUAL(leave_data.op_code, test_data2.op_code); + // realserver_addr check + BOOST_CHECK_EQUAL(leave_data.rs_endpoint, test_data2.rs_endpoint); + // last_time check + BOOST_CHECK_EQUAL(leave_data.last_time, test_data2.last_time); + + cout << "[47]--------------------------------------------- " << endl; + // unit_test[47] temp_listに1つデータがある場合、get_from_temp_list()で取得したデータがtemp_listの内容と一致する。 + test_data1.op_code = 'A'; + this->temp_list.clear(); + this->temp_list.push_back(test_data1); + this->get_from_temp_list(get_data); + // get data check + // ip check + BOOST_CHECK_EQUAL(get_data.ip_hash, test_data1.ip_hash); + // op_code check + BOOST_CHECK_EQUAL(get_data.op_code, test_data1.op_code); + // realserver_addr check + BOOST_CHECK_EQUAL(get_data.rs_endpoint, test_data1.rs_endpoint); + // last_time check + BOOST_CHECK_EQUAL(get_data.last_time, test_data1.last_time); + + cout << "[48]--------------------------------------------- " << endl; + // unit_test[48] temp_listに2つデータがある場合、get_from_temp_list()で取得したデータがtemp_listの1つ目の内容と一致する。 + test_data1.op_code = 'U'; + test_data2.op_code = 'A'; + this->temp_list.clear(); + this->temp_list.push_back(test_data1); + this->temp_list.push_back(test_data2); + this->get_from_temp_list(get_data); + // got data check + // ip check + BOOST_CHECK_EQUAL(get_data.ip_hash, test_data1.ip_hash); + // op_code check + BOOST_CHECK_EQUAL(get_data.op_code, test_data1.op_code); + // realserver_addr check + BOOST_CHECK_EQUAL(get_data.rs_endpoint, test_data1.rs_endpoint); + // last_time check + BOOST_CHECK_EQUAL(get_data.last_time, test_data1.last_time); + } + + // get_replication_area_test + void get_replication_area_test(ip_replication_data* expecting_ip_replication_data) { + + cout << "[49]--------------------------------------------- " << endl; + // unit_test[49] get_replication_area()関数の戻り値はコンストラクタが正常に生成する値と一致する。 + ip_replication_data* get_data = this->get_replication_area(); + BOOST_CHECK_EQUAL(get_data, expecting_ip_replication_data); + } +}; + +// function ip_replication_data_processor test +void ip_replication_data_processor_test(){ + + int data_area_size = 128 * sizeof(struct l7vs::ip_replication_data_header) + 128 * 256 * sizeof(struct l7vs::ip_replication_data); + char *replication_data_area = new char[data_area_size]; + bool bret = (replication_data_area != NULL); + BOOST_REQUIRE_EQUAL(bret, true); + char *header_start_address = replication_data_area; + char *real_data_start_address = header_start_address + 128 * sizeof(struct l7vs::ip_replication_data_header); + boost::asio::ip::tcp::endpoint virtual_service_endpoint; + memset(replication_data_area, 0, data_area_size); + virtual_service_endpoint.port(999); + ip_replication_data_processor_test_class test_object( + replication_data_area, SECTION_NUMBER, virtual_service_endpoint, + replication_ingetloglevel, replication_inputLogFatal, + replication_inputLogError, replication_inputLogWarn, + replication_inputLogInfo, replication_inputLogDebug); + test_object.ip_replication_data_processor_test( + reinterpret_cast(real_data_start_address), + virtual_service_endpoint, replication_data_area, data_area_size, + header_start_address, real_data_start_address); + delete []replication_data_area; +} + +// function put_into_temp_list test +void put_into_temp_list_test(){ + + int data_area_size = 128 * sizeof(struct l7vs::ip_replication_data_header) + 128 * 256 * sizeof(struct l7vs::ip_replication_data); + char *replication_data_area = new char[data_area_size]; + bool bret = (replication_data_area != NULL); + BOOST_REQUIRE_EQUAL(bret, true); + boost::asio::ip::tcp::endpoint virtual_service_endpoint; + + memset(replication_data_area, 0, data_area_size); + + ip_replication_data_processor_test_class test_object( + replication_data_area, SECTION_NUMBER, virtual_service_endpoint, + replication_ingetloglevel, replication_inputLogFatal, + replication_inputLogError, replication_inputLogWarn, + replication_inputLogInfo, replication_inputLogDebug); + + test_object.put_into_temp_list_test(); + delete []replication_data_area; +} + +// function write_replicaion_area test +void write_replicaion_area_test(){ + + int data_area_size = 128 * sizeof(struct l7vs::ip_replication_data_header) + 128 * 256 * sizeof(struct l7vs::ip_replication_data); + char *replication_data_area = new char[data_area_size]; + bool bret = (replication_data_area != NULL); + BOOST_REQUIRE_EQUAL(bret, true); + boost::asio::ip::tcp::endpoint virtual_service_endpoint; + + memset(replication_data_area, 0, data_area_size); + + ip_replication_data_processor_test_class test_object( + replication_data_area, SECTION_NUMBER, virtual_service_endpoint, + replication_ingetloglevel, replication_inputLogFatal, + replication_inputLogError, replication_inputLogWarn, + replication_inputLogInfo, replication_inputLogDebug); + + test_object.write_replicaion_area_test(); + delete []replication_data_area; +} + +// function register_replication_area_lock test +void register_replication_area_lock_test(){ + + int data_area_size = 128 * sizeof(struct l7vs::ip_replication_data_header) + 128 * 256 * sizeof(struct l7vs::ip_replication_data); + char *replication_data_area = new char[data_area_size]; + bool bret = (replication_data_area != NULL); + BOOST_REQUIRE_EQUAL(bret, true); + boost::asio::ip::tcp::endpoint virtual_service_endpoint; + + memset(replication_data_area, 0, data_area_size); + + ip_replication_data_processor_test_class test_object( + replication_data_area, SECTION_NUMBER, virtual_service_endpoint, + replication_ingetloglevel, replication_inputLogFatal, + replication_inputLogError, replication_inputLogWarn, + replication_inputLogInfo, replication_inputLogDebug); + + test_object.register_replication_area_lock_test(); + delete []replication_data_area; +} + +// function register_replication_area_unlock test +void register_replication_area_unlock_test(){ + + int data_area_size = 128 * sizeof(struct l7vs::ip_replication_data_header) + 128 * 256 * sizeof(struct l7vs::ip_replication_data); + char *replication_data_area = new char[data_area_size]; + bool bret = (replication_data_area != NULL); + BOOST_REQUIRE_EQUAL(bret, true); + boost::asio::ip::tcp::endpoint virtual_service_endpoint; + + memset(replication_data_area, 0, data_area_size); + + ip_replication_data_processor_test_class test_object( + replication_data_area, SECTION_NUMBER, virtual_service_endpoint, + replication_ingetloglevel, replication_inputLogFatal, + replication_inputLogError, replication_inputLogWarn, + replication_inputLogInfo, replication_inputLogDebug); + + test_object.register_replication_area_unlock_test(); + delete []replication_data_area; +} + +// function get_from_temp_list test +void get_from_temp_list_test(){ + + int data_area_size = 128 * sizeof(struct l7vs::ip_replication_data_header) + 128 * 256 * sizeof(struct l7vs::ip_replication_data); + char *replication_data_area = new char[data_area_size]; + bool bret = (replication_data_area != NULL); + BOOST_REQUIRE_EQUAL(bret, true); + boost::asio::ip::tcp::endpoint virtual_service_endpoint; + + memset(replication_data_area, 0, data_area_size); + + ip_replication_data_processor_test_class test_object( + replication_data_area, SECTION_NUMBER, virtual_service_endpoint, + replication_ingetloglevel, replication_inputLogFatal, + replication_inputLogError, replication_inputLogWarn, + replication_inputLogInfo, replication_inputLogDebug); + l7vs::ip_replication_temp_data test_data1; + l7vs::ip_replication_temp_data test_data2; + l7vs::ip_replication_temp_data get_data; + boost::asio::ip::tcp::endpoint endpoint; + + test_object.get_from_temp_list_test(); + delete []replication_data_area; +} + +// get_replication_area_test +void get_replication_area_test() { + + int data_area_size = 128 * sizeof(struct l7vs::ip_replication_data_header) + 128 * 256 * sizeof(struct l7vs::ip_replication_data); + char *replication_data_area = new char[data_area_size]; + bool bret = (replication_data_area != NULL); + BOOST_REQUIRE_EQUAL(bret, true); + boost::asio::ip::tcp::endpoint virtual_service_endpoint; + + memset(replication_data_area, 0, data_area_size); + + ip_replication_data_processor_test_class test_object( + replication_data_area, SECTION_NUMBER, virtual_service_endpoint, + replication_ingetloglevel, replication_inputLogFatal, + replication_inputLogError, replication_inputLogWarn, + replication_inputLogInfo, replication_inputLogDebug); + + ip_replication_data* expecting_result; + expecting_result = reinterpret_cast (replication_data_area + + 128 * sizeof(struct l7vs::ip_replication_data_header)); + + test_object.get_replication_area_test(expecting_result); + delete []replication_data_area; +} + +void ip_replication_data_processor_test_main() +{ + // create unit test suite + test_suite* ts = BOOST_TEST_SUITE( "ip_replication_data_processor" ); + + // add test case to test suite + ts->add( BOOST_TEST_CASE( &ip_replication_data_processor_test ) ); + ts->add( BOOST_TEST_CASE( &put_into_temp_list_test ) ); + ts->add( BOOST_TEST_CASE( &write_replicaion_area_test ) ); + ts->add( BOOST_TEST_CASE( ®ister_replication_area_lock_test ) ); + ts->add( BOOST_TEST_CASE( ®ister_replication_area_unlock_test ) ); + ts->add( BOOST_TEST_CASE( &get_from_temp_list_test ) ); + ts->add( BOOST_TEST_CASE( &get_replication_area_test ) ); + + framework::master_test_suite().add( ts ); +} diff --git a/unit_tests/module_test/protocol_module_ip_test/ip_session_data_processor_test.cpp b/unit_tests/module_test/protocol_module_ip_test/ip_session_data_processor_test.cpp new file mode 100644 index 00000000..da3fc0df --- /dev/null +++ b/unit_tests/module_test/protocol_module_ip_test/ip_session_data_processor_test.cpp @@ -0,0 +1,720 @@ +/* + * @file ip_ip_session_data_processor_test.cpp + * @brief ip data processor test file. + * + * L7VSD: Linux Virtual Server for Layer7 Load Balancing + * Copyright (C) 2009 NTT COMWARE Corporation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + **********************************************************************/ + +#include "ip_to_be_test_file.h" + +using namespace boost::unit_test; +using namespace l7vs; + +#define SECTION_NUMBER 200 +#define GOLDEN_RATIO_PRIME 0x9e370001UL + +bool clear_function_return_fail = false; + +LOG_LEVEL_TAG getloglevel_test() +{ + return LOG_LV_NONE; +} + +void putLogFatal_test(const unsigned int id, const std::string& message, const char* file_name, int line_number) {} +void putLogError_test(const unsigned int id, const std::string& message, const char* file_name, int line_number) {} +void putLogWarn_test(const unsigned int id, const std::string& message, const char* file_name, int line_number) {} +void putLogInfo_test(const unsigned int id, const std::string& message, const char* file_name, int line_number) {} +void putLogDebug_test(const unsigned int id, const std::string& message, const char* file_name, int line_number) {} + +l7vs::ip_replication_data_processor::getloglevel_func_type ingetloglevel1 = getloglevel_test; +l7vs::ip_replication_data_processor::logger_func_type inputLogFatal1 = putLogFatal_test; +l7vs::ip_replication_data_processor::logger_func_type inputLogError1 = putLogError_test; +l7vs::ip_replication_data_processor::logger_func_type inputLogWarn1 = putLogWarn_test; +l7vs::ip_replication_data_processor::logger_func_type inputLogInfo1 = putLogInfo_test; +l7vs::ip_replication_data_processor::logger_func_type inputLogDebug1 = putLogDebug_test; +l7vs::ip_session_data_processor::getloglevel_func_type ingetloglevel2 = getloglevel_test; +l7vs::ip_session_data_processor::logger_func_type inputLogFatal2 = putLogFatal_test; +l7vs::ip_session_data_processor::logger_func_type inputLogError2 = putLogError_test; +l7vs::ip_session_data_processor::logger_func_type inputLogWarn2 = putLogWarn_test; +l7vs::ip_session_data_processor::logger_func_type inputLogInfo2 = putLogInfo_test; +l7vs::ip_session_data_processor::logger_func_type inputLogDebug2 = putLogDebug_test; + +class ip_replication_data_processor_replacement: public ip_replication_data_processor{ +public: + ip_replication_data_processor_replacement( + char* ip_replication_area_begain, + int ip_replication_area_size, + const boost::asio::ip::tcp::endpoint& virtual_service_endpoint, + getloglevel_func_type ingetloglevel, + logger_func_type inputLogFatal, + logger_func_type inputLogError, + logger_func_type inputLogWarn, + logger_func_type inputLogInfo, + logger_func_type inputLogDebug ) : + ip_replication_data_processor( + ip_replication_area_begain, + ip_replication_area_size, + virtual_service_endpoint, + ingetloglevel, + inputLogFatal, + inputLogError, + inputLogWarn, + inputLogInfo, + inputLogDebug ) { + } + + // to call the get_from_temp_list function + void to_get_from_temp_list( ip_replication_temp_data& data ){ + this->get_from_temp_list(data); + } + + // to get the temp_list + std::deque& get_temp_list(){ + return this->temp_list; + } + +}; + +// test class +class ip_session_data_processor_test_class : public ip_session_data_processor{ +public: + boost::mutex check_mutex; + // ip_session_data_processor_test_class + ip_session_data_processor_test_class(int timeout, + ip_replication_data_processor* replication_data_processor, + getloglevel_func_type ingetloglevel, + logger_func_type inputLogFatal, logger_func_type inputLogError, + logger_func_type inputLogWarn, logger_func_type inputLogInfo, + logger_func_type inputLogDebug) : + ip_session_data_processor(timeout, + replication_data_processor, ingetloglevel, inputLogFatal, + inputLogError, inputLogWarn, inputLogInfo, inputLogDebug) { + + } + + // get_endpoint_from_session_data_test thread + void get_endpoint_from_session_data_thread( + int ip_hash, + boost::asio::ip::tcp::endpoint& expecting_endpoint, + int ret){ + + int result = 10; + boost::asio::ip::tcp::endpoint get_endpoint; + + result = this->get_endpoint_from_session_data(ip_hash, get_endpoint); + { + boost::mutex::scoped_lock sclock(check_mutex); + BOOST_CHECK_EQUAL(result, ret); + BOOST_CHECK_EQUAL(get_endpoint, expecting_endpoint); + } + } + + // ip_session_data_processor_test + void ip_session_data_processor_test(int expecting_timeout, ip_replication_data_processor* expecting_replication_data_processor) { + + cout << "[1]--------------------------------------------- " << endl; + // unit_test[1] メンバー変数が初期化されるチェックする。 + // timeout check + BOOST_CHECK_EQUAL(this->timeout, expecting_timeout); + // replication_data_processor check + BOOST_CHECK_EQUAL(this->replication_data_processor, expecting_replication_data_processor); + // getloglevel check + BOOST_CHECK_EQUAL(this->getloglevel, getloglevel_test); + // putLogFatal check + BOOST_CHECK_EQUAL(this->putLogFatal, putLogFatal_test); + // putLogError check + BOOST_CHECK_EQUAL(this->putLogError, putLogError_test); + // putLogWarn check + BOOST_CHECK_EQUAL(this->putLogWarn, putLogWarn_test); + // putLogInfo check + BOOST_CHECK_EQUAL(this->putLogInfo, putLogInfo_test); + // putLogDebug check + BOOST_CHECK_EQUAL(this->putLogDebug, putLogDebug_test); + + cout << "[2]--------------------------------------------- " << endl; + // unit_test[2] timeout < 0の場合, 例外が発生する。 + bool exception_occur = false; + try{ + l7vs::ip_session_data_processor(-2, expecting_replication_data_processor, + ingetloglevel2, inputLogFatal2, inputLogError2, inputLogWarn2, + inputLogInfo2, inputLogDebug2); + } catch(...) { + exception_occur = true; + } + BOOST_CHECK(exception_occur); + + cout << "[3]--------------------------------------------- " << endl; + // unit_test[3] timeout が0の場合, 例外が発生しない。 + try{ + l7vs::ip_session_data_processor(0, expecting_replication_data_processor, + ingetloglevel2, inputLogFatal2, inputLogError2, inputLogWarn2, + inputLogInfo2, inputLogDebug2); + } catch(...) { + BOOST_ERROR("exception: ip_session_data_processor"); + } + + cout << "[4]--------------------------------------------- " << endl; + // unit_test[4] replication_data_processorがNULLの場合, 例外が発生する。 + exception_occur = false; + try{ + l7vs::ip_session_data_processor(2, NULL, + ingetloglevel2, inputLogFatal2, inputLogError2, inputLogWarn2, + inputLogInfo2, inputLogDebug2); + } catch(...) { + exception_occur = true; + } + BOOST_CHECK(exception_occur); + + } + + // get_endpoint_from_session_data_test + void get_endpoint_from_session_data_test(){ + + cout << "[5]--------------------------------------------- " << endl; + // unit_test[5] rs_endpoint と lasttimeが空の場合、戻り値が失敗(1)で設定する。 + { + int ret = -2; + boost::asio::ip::tcp::endpoint cl_endpoint = string_to_endpoint ("192.168.1.100:1234"); + boost::asio::ip::tcp::endpoint rs_endpoint; + boost::asio::ip::tcp::endpoint ret_endpoint; + unsigned int ip_hash = calc_hash(cl_endpoint); + ret = this->get_endpoint_from_session_data(ip_hash, ret_endpoint); + BOOST_CHECK_EQUAL(ret, 1); + } + + cout << "[6]--------------------------------------------- " << endl; + // unit_test[6] rs_endpointが空で,lasttimeが空でない場合、戻り値が失敗(1)で設定する。 + { + int ret = -2; + time_t now = time(NULL); + boost::asio::ip::tcp::endpoint cl_endpoint = string_to_endpoint ("192.168.1.100:1234"); + boost::asio::ip::tcp::endpoint rs_endpoint; + boost::asio::ip::tcp::endpoint ret_endpoint; + unsigned int ip_hash = calc_hash(cl_endpoint); + struct ip_session_table_entry session_entry = { now, rs_endpoint }; + this->session_table[ip_hash] = session_entry; + ret = this->get_endpoint_from_session_data(ip_hash, ret_endpoint); + BOOST_CHECK_EQUAL(ret , 1); + } + + cout << "[7]--------------------------------------------- " << endl; + // unit_test[7] lasttimeが空で,rs_endpointが空でない場合、戻り値が失敗(1)で設定する。 + { + int ret = -2; + time_t nul_time = (time_t) 0; + boost::asio::ip::tcp::endpoint cl_endpoint = string_to_endpoint ("192.168.1.222:1234"); + boost::asio::ip::tcp::endpoint rs_endpoint; + boost::asio::ip::tcp::endpoint ret_endpoint; + unsigned int ip_hash = calc_hash(cl_endpoint); + struct ip_session_table_entry session_entry = { nul_time, rs_endpoint }; + this->session_table[ip_hash] = session_entry; + ret = this->get_endpoint_from_session_data(ip_hash, ret_endpoint); + BOOST_CHECK_EQUAL(ret, 1); + } + + cout << "[8]--------------------------------------------- " << endl; + // unit_test[8] 1つのデータがsession_tableに存在して、タイムアウトしない場合、戻り値が正常(0)で設定する。 + { + int ret = -2; + time_t now = time(NULL); + boost::asio::ip::tcp::endpoint cl_endpoint = string_to_endpoint ("192.168.1.100:1234"); + boost::asio::ip::tcp::endpoint rs_endpoint = string_to_endpoint ("172.16.58.66:80"); + boost::asio::ip::tcp::endpoint ret_endpoint; + unsigned int ip_hash = calc_hash(cl_endpoint); + struct ip_session_table_entry session_entry = { now, rs_endpoint }; + this->session_table[ip_hash] = session_entry; + this->timeout = 3600; + ret = this->get_endpoint_from_session_data(ip_hash, ret_endpoint); + BOOST_CHECK_EQUAL(ret, 0); + BOOST_CHECK_EQUAL(ret_endpoint, rs_endpoint); + } + + cout << "[9]--------------------------------------------- " << endl; + // unit_test[9] 1つのデータがsession_tableに存在して、タイムアウトの場合、戻り値が正常(0)で設定する。 + { + int ret = -2; + time_t now = time(NULL) - 11; + boost::asio::ip::tcp::endpoint cl_endpoint = string_to_endpoint ("192.168.1.100:1234"); + boost::asio::ip::tcp::endpoint rs_endpoint = string_to_endpoint ("172.16.58.66:80"); + boost::asio::ip::tcp::endpoint ret_endpoint; + boost::asio::ip::tcp::endpoint init_endpoint; + unsigned int ip_hash = calc_hash(cl_endpoint); + struct ip_session_table_entry session_entry = { now, rs_endpoint }; + this->session_table[ip_hash] = session_entry; + this->timeout = (time_t)10; + ret = this->get_endpoint_from_session_data(ip_hash, ret_endpoint); + BOOST_CHECK_EQUAL(ret, 1); + BOOST_CHECK_EQUAL(ret_endpoint, init_endpoint); + } + + cout << "[10]--------------------------------------------- " << endl; + // unit_test[10] session_tableに3つデータがあり、且つ3つデータが全部タイムアウトしない場合、戻り値が正常(0)で設定する。 + { + int ret = -2; + time_t now = time(NULL); + boost::asio::ip::tcp::endpoint cl_endpoint1 = string_to_endpoint ("192.168.1.100:1234"); + boost::asio::ip::tcp::endpoint cl_endpoint2 = string_to_endpoint ("192.168.1.101:1234"); + boost::asio::ip::tcp::endpoint cl_endpoint3 = string_to_endpoint ("192.168.1.102:1234"); + boost::asio::ip::tcp::endpoint rs_endpoint = string_to_endpoint ("172.16.58.66:80"); + boost::asio::ip::tcp::endpoint ret_endpoint; + unsigned int ip_hash1 = calc_hash(cl_endpoint1); + unsigned int ip_hash2 = calc_hash(cl_endpoint2); + unsigned int ip_hash3 = calc_hash(cl_endpoint3); + struct ip_session_table_entry session_entry = { now, rs_endpoint }; + this->session_table[ip_hash1] = session_entry; + this->session_table[ip_hash2] = session_entry; + this->session_table[ip_hash3] = session_entry; + this->timeout = 3600; + ret = this->get_endpoint_from_session_data(ip_hash1, ret_endpoint); + BOOST_CHECK_EQUAL(ret , 0); + BOOST_CHECK_EQUAL(ret_endpoint, rs_endpoint); + } + + cout << "[11]--------------------------------------------- " << endl; + // unit_test[11] session_tableに3つデータがあり、且つ2つデータがタイムアウトしなくて,1つのデータだけタイムアウトの場合、戻り値が正常(0)で設定する。 + { + int ret = -2; + time_t now = time(NULL); + time_t time_out = time(NULL) - 10000; + boost::asio::ip::tcp::endpoint cl_endpoint1 = string_to_endpoint ("192.168.1.100:1234"); + boost::asio::ip::tcp::endpoint cl_endpoint2 = string_to_endpoint ("192.168.1.101:1234"); + boost::asio::ip::tcp::endpoint cl_endpoint3 = string_to_endpoint ("192.168.1.102:1234"); + boost::asio::ip::tcp::endpoint rs_endpoint = string_to_endpoint ("172.16.58.66:80"); + boost::asio::ip::tcp::endpoint ret_endpoint; + unsigned int ip_hash1 = calc_hash(cl_endpoint1); + unsigned int ip_hash2 = calc_hash(cl_endpoint2); + unsigned int ip_hash3 = calc_hash(cl_endpoint3); + struct ip_session_table_entry session_entry = { now, rs_endpoint }; + struct ip_session_table_entry session_timeout_entry = { time_out, rs_endpoint }; + this->session_table[ip_hash1] = session_entry; + this->session_table[ip_hash2] = session_entry; + this->session_table[ip_hash3] = session_timeout_entry; + this->timeout = 3600; + ret = this->get_endpoint_from_session_data(ip_hash1, ret_endpoint); + BOOST_CHECK_EQUAL(ret, 0); + BOOST_CHECK_EQUAL(ret_endpoint, rs_endpoint); + } + + cout << "[12]--------------------------------------------- " << endl; + // unit_test[12] session_tableに3つデータがあり、且つ3つデータが全部タイムアウトの場合、戻り値が正常(0)で設定する。 + { + int ret = -2; + time_t now = time(NULL); + boost::asio::ip::tcp::endpoint cl_endpoint1 = string_to_endpoint ("192.168.1.100:1234"); + boost::asio::ip::tcp::endpoint cl_endpoint2 = string_to_endpoint ("192.168.1.101:1234"); + boost::asio::ip::tcp::endpoint cl_endpoint3 = string_to_endpoint ("192.168.1.102:1234"); + boost::asio::ip::tcp::endpoint rs_endpoint = string_to_endpoint ("172.16.58.66:80"); + boost::asio::ip::tcp::endpoint ret_endpoint; + unsigned int ip_hash1 = calc_hash(cl_endpoint1); + unsigned int ip_hash2 = calc_hash(cl_endpoint2); + unsigned int ip_hash3 = calc_hash(cl_endpoint3); + struct ip_session_table_entry session_entry = { now, rs_endpoint }; + this->session_table[ip_hash1] = session_entry; + this->session_table[ip_hash2] = session_entry; + this->session_table[ip_hash3] = session_entry; + this->timeout = (time_t)0; + ret = this->get_endpoint_from_session_data(ip_hash1, ret_endpoint); + BOOST_CHECK_EQUAL(ret, 0); + BOOST_CHECK_EQUAL(ret_endpoint, rs_endpoint); + } + + cout << "[13]--------------------------------------------- " << endl; + // unit_test[13] メンバー関数timeoutが0でなくて、且つ検索対象データがタイムアウトの場合、戻り値が正常(1)で設定する。 + { + int ret = -2; + time_t time_out = time(NULL) - 10000; + boost::asio::ip::tcp::endpoint cl_endpoint = string_to_endpoint ("192.168.1.100:1234"); + boost::asio::ip::tcp::endpoint rs_endpoint = string_to_endpoint ("172.16.58.66:80"); + boost::asio::ip::tcp::endpoint ret_endpoint; + unsigned int ip_hash = calc_hash(cl_endpoint); + struct ip_session_table_entry session_entry = { time_out, rs_endpoint }; + this->session_table[ip_hash] = session_entry; + this->timeout = 10; + ret = this->get_endpoint_from_session_data(ip_hash, ret_endpoint); + BOOST_CHECK_EQUAL(ret, 1); + } + + cout << "[14]--------------------------------------------- " << endl; + // unit_test[14] endpointがipv6で、1つのデータが存在して、且つタイムアウトしない場合、戻り値が正常(0)で設定する。 + { + int ret = -2; + time_t now = time(NULL); + boost::asio::ip::tcp::endpoint cl_endpoint = boost::asio::ip::tcp::endpoint(boost::asio::ip::address::from_string("abcd:21d0:8936:4866:eefe:567d:3a4b:1230"), 1234); + boost::asio::ip::tcp::endpoint rs_endpoint = string_to_endpoint ("172.16.58.66:80"); + boost::asio::ip::tcp::endpoint ret_endpoint; + unsigned int ip_hash = calc_hash(cl_endpoint); + struct ip_session_table_entry session_entry = { now, rs_endpoint }; + this->session_table[ip_hash] = session_entry; + this->timeout = 3600; + ret = this->get_endpoint_from_session_data(ip_hash, ret_endpoint); + BOOST_CHECK_EQUAL(ret, 0); + BOOST_CHECK_EQUAL(ret_endpoint, rs_endpoint); + } + + cout << "[15]--------------------------------------------- " << endl; + // unit_test[15] マルチスレッドの場合、データを正常取得する。 + { + time_t now = time(NULL); + time_t timeout = time(NULL) - 10000; + boost::asio::ip::tcp::endpoint cl_endpoint1 = string_to_endpoint ("192.168.1.100:1234"); + boost::asio::ip::tcp::endpoint cl_endpoint2 = string_to_endpoint ("192.168.1.101:1234"); + boost::asio::ip::tcp::endpoint cl_endpoint3 = string_to_endpoint ("192.168.1.102:1234"); + boost::asio::ip::tcp::endpoint rs_endpoint = string_to_endpoint ("172.16.58.66:80"); + boost::asio::ip::tcp::endpoint null_endpoint; + boost::asio::ip::tcp::endpoint ret_endpoint; + unsigned int ip_hash1 = calc_hash(cl_endpoint1); + unsigned int ip_hash2 = calc_hash(cl_endpoint2); + unsigned int ip_hash3 = calc_hash(cl_endpoint3); + struct ip_session_table_entry session_entry = { now, rs_endpoint }; + struct ip_session_table_entry session_timeout_entry = { timeout, rs_endpoint }; + this->session_table[ip_hash1] = session_entry; + this->session_table[ip_hash2] = session_timeout_entry; + this->session_table[ip_hash3] = session_timeout_entry; + this->timeout = 3600; + boost::thread_group thread_group; + thread_group.create_thread(boost::bind(&ip_session_data_processor_test_class::get_endpoint_from_session_data_thread, this, ip_hash1, rs_endpoint, 0)); + thread_group.create_thread(boost::bind(&ip_session_data_processor_test_class::get_endpoint_from_session_data_thread, this, ip_hash2, null_endpoint, 1)); + thread_group.create_thread(boost::bind(&ip_session_data_processor_test_class::get_endpoint_from_session_data_thread, this, ip_hash3, null_endpoint, 1)); + thread_group.join_all(); + } + + } + + // write_session_data_test + void write_session_data_test(){ + + cout << "[16]--------------------------------------------- " << endl; + // unit_test[16] Session_tableが空、endpointが初期値でないの場合、ip_replication_temp_data.op_code='A'、 return 0 + { + memset(this->session_table.c_array(), 0, MAX_IP_SESSION_TBL_SIZE); + (dynamic_cast(this->replication_data_processor))->get_temp_list().clear(); + int ret = -2; + time_t now = time(NULL); + boost::asio::ip::tcp::endpoint cl_endpoint = string_to_endpoint ("192.168.1.100:1234"); + boost::asio::ip::tcp::endpoint rs_endpoint = string_to_endpoint ("172.16.58.66:80"); + int ip_hash = (int)calc_hash(cl_endpoint); + this->timeout = 3600; + ret = this->write_session_data(ip_hash, rs_endpoint, now); + ip_replication_temp_data temp_data; + (dynamic_cast(this->replication_data_processor))->to_get_from_temp_list(temp_data); + BOOST_CHECK_EQUAL(ret, 0); + BOOST_CHECK_EQUAL(this->session_table[ip_hash].last_time, now); + BOOST_CHECK_EQUAL(this->session_table[ip_hash].rs_endpoint, rs_endpoint); + BOOST_CHECK_EQUAL(temp_data.op_code, 'A'); + BOOST_CHECK_EQUAL(temp_data.ip_hash, ip_hash); + BOOST_CHECK_EQUAL(temp_data.last_time, now); + BOOST_CHECK_EQUAL(temp_data.rs_endpoint, rs_endpoint); + } + + cout << "[17]--------------------------------------------- " << endl; + // unit_test[17] Session_tableが空、endpointが初期値の場合、ip_replication_temp_data.op_code='U' return 0 + { + memset(this->session_table.c_array(), 0, MAX_IP_SESSION_TBL_SIZE); + (dynamic_cast(this->replication_data_processor))->get_temp_list().clear(); + int ret = -2; + time_t now = time(NULL); + boost::asio::ip::tcp::endpoint cl_endpoint = string_to_endpoint ("192.168.1.100:1234"); + boost::asio::ip::tcp::endpoint rs_endpoint; + int ip_hash = (int)calc_hash(cl_endpoint); + this->timeout = 3600; + ret = this->write_session_data(ip_hash, rs_endpoint, now); + ip_replication_temp_data temp_data; + (dynamic_cast(this->replication_data_processor))->to_get_from_temp_list(temp_data); + BOOST_CHECK_EQUAL(ret, 0); + BOOST_CHECK_EQUAL(this->session_table[ip_hash].last_time, now); + BOOST_CHECK_EQUAL(this->session_table[ip_hash].rs_endpoint, rs_endpoint); + BOOST_CHECK_EQUAL(temp_data.op_code, 'U'); + BOOST_CHECK_EQUAL(temp_data.ip_hash, ip_hash); + BOOST_CHECK_EQUAL(temp_data.last_time, now); + BOOST_CHECK_EQUAL(temp_data.rs_endpoint, rs_endpoint); + } + + cout << "[18]--------------------------------------------- " << endl; + // unit_test[18] Session_tableが空でわない、endpointが初期値でないの場合、ip_replication_temp_data.op_code='A' return 0 + { + memset(this->session_table.c_array(), 0, MAX_IP_SESSION_TBL_SIZE); + (dynamic_cast(this->replication_data_processor))->get_temp_list().clear(); + int ret = -2; + time_t time1 = time(NULL) - 1; + time_t time2 = time(NULL) - 2; + boost::asio::ip::tcp::endpoint cl_endpoint1 = string_to_endpoint ("192.168.1.100:1234"); + boost::asio::ip::tcp::endpoint cl_endpoint2 = string_to_endpoint ("192.168.1.101:1234"); + boost::asio::ip::tcp::endpoint rs_endpoint1 = string_to_endpoint ("172.16.58.66:80"); + boost::asio::ip::tcp::endpoint rs_endpoint2 = string_to_endpoint ("172.16.58.67:80"); + int ip_hash1 = (int)calc_hash(cl_endpoint1); + int ip_hash2 = (int)calc_hash(cl_endpoint2); + struct ip_session_table_entry session_entry1 = { time1, rs_endpoint1 }; + this->session_table[ip_hash1] = session_entry1; + this->timeout = 3600; + ret = this->write_session_data(ip_hash2, rs_endpoint2, time2); + ip_replication_temp_data temp_data; + (dynamic_cast(this->replication_data_processor))->to_get_from_temp_list(temp_data); + BOOST_CHECK_EQUAL(ret, 0); + BOOST_CHECK_EQUAL(this->session_table[ip_hash1].last_time, time1); + BOOST_CHECK_EQUAL(this->session_table[ip_hash1].rs_endpoint, rs_endpoint1); + BOOST_CHECK_EQUAL(this->session_table[ip_hash2].last_time, time2); + BOOST_CHECK_EQUAL(this->session_table[ip_hash2].rs_endpoint, rs_endpoint2); + BOOST_CHECK_EQUAL(temp_data.op_code, 'A'); + BOOST_CHECK_EQUAL(temp_data.ip_hash, ip_hash2); + BOOST_CHECK_EQUAL(temp_data.last_time, time2); + BOOST_CHECK_EQUAL(temp_data.rs_endpoint, rs_endpoint2); + } + + cout << "[19]--------------------------------------------- " << endl; + // unit_test[19] Session_tableが空でわない、endpointが初期値の場合、ip_replication_temp_data.op_code='U' return 0 + { + memset(this->session_table.c_array(), 0, MAX_IP_SESSION_TBL_SIZE); + (dynamic_cast(this->replication_data_processor))->get_temp_list().clear(); + int ret = -2; + time_t time1 = time(NULL) - 1; + time_t time2 = time(NULL) - 2; + boost::asio::ip::tcp::endpoint cl_endpoint1 = string_to_endpoint ("192.168.1.100:1234"); + boost::asio::ip::tcp::endpoint cl_endpoint2 = string_to_endpoint ("192.168.1.101:1234"); + boost::asio::ip::tcp::endpoint rs_endpoint1 = string_to_endpoint ("172.16.58.66:80"); + boost::asio::ip::tcp::endpoint rs_endpoint2; + int ip_hash1 = (int)calc_hash(cl_endpoint1); + int ip_hash2 = (int)calc_hash(cl_endpoint2); + struct ip_session_table_entry session_entry1 = { time1, rs_endpoint1 }; + this->session_table[ip_hash1] = session_entry1; + this->timeout = 3600; + ret = this->write_session_data(ip_hash2, rs_endpoint2, time2); + ip_replication_temp_data temp_data; + (dynamic_cast(this->replication_data_processor))->to_get_from_temp_list(temp_data); + BOOST_CHECK_EQUAL(ret, 0); + BOOST_CHECK_EQUAL(this->session_table[ip_hash1].last_time, time1); + BOOST_CHECK_EQUAL(this->session_table[ip_hash1].rs_endpoint, rs_endpoint1); + BOOST_CHECK_EQUAL(this->session_table[ip_hash2].last_time, time2); + BOOST_CHECK_EQUAL(this->session_table[ip_hash2].rs_endpoint, rs_endpoint2); + BOOST_CHECK_EQUAL(temp_data.op_code, 'U'); + BOOST_CHECK_EQUAL(temp_data.ip_hash, ip_hash2); + BOOST_CHECK_EQUAL(temp_data.last_time, time2); + BOOST_CHECK_EQUAL(temp_data.rs_endpoint, rs_endpoint2); + } + + cout << "[20]--------------------------------------------- " << endl; + // unit_test[20] Session_tableが空でわない、エンドポイントが存在するの場合、ip_replication_temp_data.op_code='U' return 0 + { + memset(this->session_table.c_array(), 0, MAX_IP_SESSION_TBL_SIZE); + (dynamic_cast(this->replication_data_processor))->get_temp_list().clear(); + int ret = -2; + time_t time1 = time(NULL) - 1; + time_t time2_old = time(NULL) - 2; + time_t time2_new = time(NULL) - 3; + boost::asio::ip::tcp::endpoint cl_endpoint1 = string_to_endpoint ("192.168.1.100:1234"); + boost::asio::ip::tcp::endpoint cl_endpoint2 = string_to_endpoint ("192.168.1.101:1234"); + boost::asio::ip::tcp::endpoint rs_endpoint1 = string_to_endpoint ("172.16.58.66:80"); + boost::asio::ip::tcp::endpoint rs_endpoint2_old = string_to_endpoint ("172.16.58.67:80"); + boost::asio::ip::tcp::endpoint rs_endpoint2_new = string_to_endpoint ("172.16.58.68:80"); + int ip_hash1 = (int)calc_hash(cl_endpoint1); + int ip_hash2 = (int)calc_hash(cl_endpoint2); + struct ip_session_table_entry session_entry1 = { time1, rs_endpoint1 }; + struct ip_session_table_entry session_entry2 = { time2_old, rs_endpoint2_old }; + this->session_table[ip_hash1] = session_entry1; + this->session_table[ip_hash2] = session_entry2; + this->timeout = 3600; + ret = this->write_session_data(ip_hash2, rs_endpoint2_new, time2_new); + ip_replication_temp_data temp_data; + (dynamic_cast(this->replication_data_processor))->to_get_from_temp_list(temp_data); + BOOST_CHECK_EQUAL(ret, 0); + BOOST_CHECK_EQUAL(this->session_table[ip_hash1].last_time, time1); + BOOST_CHECK_EQUAL(this->session_table[ip_hash1].rs_endpoint, rs_endpoint1); + BOOST_CHECK_EQUAL(this->session_table[ip_hash2].last_time, time2_new); + BOOST_CHECK_EQUAL(this->session_table[ip_hash2].rs_endpoint, rs_endpoint2_new); + BOOST_CHECK_EQUAL(temp_data.op_code, 'A'); + BOOST_CHECK_EQUAL(temp_data.ip_hash, ip_hash2); + BOOST_CHECK_EQUAL(temp_data.last_time, time2_new); + BOOST_CHECK_EQUAL(temp_data.rs_endpoint, rs_endpoint2_new); + } + + cout << "[21]--------------------------------------------- " << endl; + // unit_test[21] ip_hash異常の場合, return 1 + { + int ret = -2; + time_t now = time(NULL); + boost::asio::ip::tcp::endpoint rs_endpoint; + int ip_hash = 0xFFFFFFFF; + ret = this->write_session_data(ip_hash, rs_endpoint, now); + BOOST_CHECK_EQUAL(ret, 1); + } + } + + // read_session_data_from_replication_area_test + void read_session_data_from_replication_area_test(){ + + cout << "[22]--------------------------------------------- " << endl; + // unit_test[22] replication area初期値でないの場合 + { + memset(this->session_table.c_array(), 0, MAX_IP_SESSION_TBL_SIZE); + memset(this->replication_data_processor->get_replication_area(), 0, 128 * 256 * sizeof(struct l7vs::ip_replication_data)); + int ret = -2; + ret = this->read_session_data_from_replication_area(this->replication_data_processor->get_replication_area()); + BOOST_CHECK_EQUAL(ret, 0); + } + + cout << "[23]--------------------------------------------- " << endl; + // unit_test[23] replication area初期値の場合 + { + memset(this->session_table.c_array(), 0, MAX_IP_SESSION_TBL_SIZE); + memset(this->replication_data_processor->get_replication_area(), 0, 128 * 256 * sizeof(struct l7vs::ip_replication_data)); + int ret = -2; + time_t time1 = time(NULL) - 1; + time_t time2 = time(NULL) - 2; + time_t time3 = time(NULL) - 3; + struct ip_replication_data replication_data1 = { "172.16.58.66", 1234, time1, 1}; + struct ip_replication_data replication_data2 = { "172.16.58.67", 1235, time2, 1}; + struct ip_replication_data replication_data3 = { "172.16.58.68", 1236, time3, 1}; + this->replication_data_processor->get_replication_area()[0] = replication_data1; + this->replication_data_processor->get_replication_area()[1] = replication_data2; + this->replication_data_processor->get_replication_area()[2] = replication_data3; + ret = this->read_session_data_from_replication_area(this->replication_data_processor->get_replication_area()); + BOOST_CHECK_EQUAL(ret, 0); + BOOST_CHECK_EQUAL(this->session_table[0].last_time, time1); + BOOST_CHECK_EQUAL(strcmp(this->session_table[0].rs_endpoint.address().to_string().c_str(), "172.16.58.66"), 0); + BOOST_CHECK_EQUAL(this->session_table[0].rs_endpoint.port(), (unsigned short)1234); + BOOST_CHECK_EQUAL(this->session_table[1].last_time, time2); + BOOST_CHECK_EQUAL(strcmp(this->session_table[1].rs_endpoint.address().to_string().c_str(), "172.16.58.67"), 0); + BOOST_CHECK_EQUAL(this->session_table[1].rs_endpoint.port(), (unsigned short)1235); + BOOST_CHECK_EQUAL(this->session_table[2].last_time, time3); + BOOST_CHECK_EQUAL(strcmp(this->session_table[2].rs_endpoint.address().to_string().c_str(), "172.16.58.68"), 0); + BOOST_CHECK_EQUAL(this->session_table[2].rs_endpoint.port(), (unsigned short)1236); + } + + cout << "[24]--------------------------------------------- " << endl; + // unit_test[24] replication_areaがNULLの場合, return 1 + { + int ret = -2; + ret = this->read_session_data_from_replication_area(NULL); + BOOST_CHECK_EQUAL(ret, -1); + } + } + +}; + +// ip_session_data_processor test +void ip_session_data_processor_test(){ + + int data_area_size = 128 * sizeof(struct l7vs::ip_replication_data_header) + 128 * 256 * sizeof(struct l7vs::ip_replication_data); + char *replication_data_area = new char[data_area_size]; + bool bret = (replication_data_area != NULL); + BOOST_REQUIRE_EQUAL(bret, true); + boost::asio::ip::tcp::endpoint virtual_service_endpoint; + memset(replication_data_area, 0, data_area_size); + l7vs::ip_replication_data_processor replication_data_processor( + replication_data_area, SECTION_NUMBER, virtual_service_endpoint, + ingetloglevel1, inputLogFatal1, inputLogError1, inputLogWarn1, + inputLogInfo1, inputLogDebug1); + ip_session_data_processor_test_class test_object(5, + &replication_data_processor, ingetloglevel2, inputLogFatal2, + inputLogError2, inputLogWarn2, inputLogInfo2, inputLogDebug2); + + test_object.ip_session_data_processor_test(5, &replication_data_processor); + + delete []replication_data_area; + +} + +// get_endpoint_from_session_data test +void get_endpoint_from_session_data_test(){ + + int data_area_size = 128 * sizeof(struct l7vs::ip_replication_data_header) + 128 * 256 * sizeof(struct l7vs::ip_replication_data); + char *replication_data_area = new char[data_area_size]; + bool bret = (replication_data_area != NULL); + BOOST_REQUIRE_EQUAL(bret, true); + boost::asio::ip::tcp::endpoint virtual_service_endpoint; + + memset(replication_data_area, 0, data_area_size); + + ip_replication_data_processor_replacement replication_data_processor( + replication_data_area, SECTION_NUMBER, virtual_service_endpoint, + ingetloglevel1, inputLogFatal1, inputLogError1, inputLogWarn1, + inputLogInfo1, inputLogDebug1); + ip_session_data_processor_test_class test_object(0, + &replication_data_processor, ingetloglevel2, inputLogFatal2, + inputLogError2, inputLogWarn2, inputLogInfo2, inputLogDebug2); + + test_object.get_endpoint_from_session_data_test(); + delete []replication_data_area; + +} + +// write_session_data test +void write_session_data_test(){ + + int data_area_size = 128 * sizeof(struct l7vs::ip_replication_data_header) + 128 * 256 * sizeof(struct l7vs::ip_replication_data); + char *replication_data_area = new char[data_area_size]; + bool bret = (replication_data_area != NULL); + BOOST_REQUIRE_EQUAL(bret, true); + boost::asio::ip::tcp::endpoint virtual_service_endpoint; + + memset(replication_data_area, 0, data_area_size); + + ip_replication_data_processor_replacement replication_data_processor( + replication_data_area, SECTION_NUMBER, virtual_service_endpoint, + ingetloglevel1, inputLogFatal1, inputLogError1, inputLogWarn1, + inputLogInfo1, inputLogDebug1); + ip_session_data_processor_test_class test_object(0, + &replication_data_processor, ingetloglevel2, inputLogFatal2, + inputLogError2, inputLogWarn2, inputLogInfo2, inputLogDebug2); + + test_object.write_session_data_test(); + delete []replication_data_area; + +} + +// read_session_data_from_replication_area test +void read_session_data_from_replication_area_test(){ + + int data_area_size = 128 * sizeof(struct l7vs::ip_replication_data_header) + 128 * 256 * sizeof(struct l7vs::ip_replication_data); + char *replication_data_area = new char[data_area_size]; + bool bret = (replication_data_area != NULL); + BOOST_REQUIRE_EQUAL(bret, true); + boost::asio::ip::tcp::endpoint virtual_service_endpoint; + + memset(replication_data_area, 0, data_area_size); + + l7vs::ip_replication_data_processor replication_data_processor( + replication_data_area, SECTION_NUMBER, virtual_service_endpoint, + ingetloglevel1, inputLogFatal1, inputLogError1, inputLogWarn1, + inputLogInfo1, inputLogDebug1); + ip_session_data_processor_test_class test_object(0, + &replication_data_processor, ingetloglevel2, inputLogFatal2, + inputLogError2, inputLogWarn2, inputLogInfo2, inputLogDebug2); + + test_object.read_session_data_from_replication_area_test(); + + delete []replication_data_area; + +} + + +void ip_session_data_processor_test_main() +{ + + // create unit test suite + test_suite* ts = BOOST_TEST_SUITE( "ip_session_data_processor" ); + + // add test case to test suite + ts->add( BOOST_TEST_CASE( &ip_session_data_processor_test ) ); + ts->add( BOOST_TEST_CASE( &get_endpoint_from_session_data_test ) ); + ts->add( BOOST_TEST_CASE( &write_session_data_test ) ); + ts->add( BOOST_TEST_CASE( &read_session_data_from_replication_area_test ) ); + + framework::master_test_suite().add( ts ); +} diff --git a/unit_tests/module_test/protocol_module_ip_test/ip_to_be_test_file.h b/unit_tests/module_test/protocol_module_ip_test/ip_to_be_test_file.h new file mode 100644 index 00000000..3fe59aea --- /dev/null +++ b/unit_tests/module_test/protocol_module_ip_test/ip_to_be_test_file.h @@ -0,0 +1,42 @@ +/* + * @file ip_to_be_test_file.h + * @brief ip test header file. + * + * L7VSD: Linux Virtual Server for Layer7 Load Balancing + * Copyright (C) 2009 NTT COMWARE Corporation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + **********************************************************************/ + +#ifndef IP_TO_BE_TEST_FILE_H_ +#define IP_TO_BE_TEST_FILE_H_ + +#include + +#include "../../../module/protocol/ip_replication_data_processor.cpp" +#include "../../../module/protocol/ip_session_data_processor.cpp" +#define THREAD_COUNT 10 + + + + + + + + + +#endif /* IP_TO_BE_TEST_FILE_H_ */ diff --git a/unit_tests/module_test/protocol_module_ip_test/ip_ut.cpp b/unit_tests/module_test/protocol_module_ip_test/ip_ut.cpp new file mode 100644 index 00000000..d7cc6e7a --- /dev/null +++ b/unit_tests/module_test/protocol_module_ip_test/ip_ut.cpp @@ -0,0 +1,39 @@ +/* + * @file ip_ut.cpp + * @brief ip test main file. + * + * L7VSD: Linux Virtual Server for Layer7 Load Balancing + * Copyright (C) 2009 NTT COMWARE Corporation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + **********************************************************************/ + +#include + +#include "protocol_module_ip_test.cpp" +#include "ip_replication_data_processor_test.cpp" +#include "ip_session_data_processor_test.cpp" + +test_suite* init_unit_test_suite( int argc, char* argv[] ){ + + protocol_module_ip_test_main(); + ip_replication_data_processor_test_main(); + ip_session_data_processor_test_main(); + + return 0; +} + diff --git a/unit_tests/module_test/protocol_module_ip_test/protocol_module_ip_test.cpp b/unit_tests/module_test/protocol_module_ip_test/protocol_module_ip_test.cpp new file mode 100644 index 00000000..c76b42ca --- /dev/null +++ b/unit_tests/module_test/protocol_module_ip_test/protocol_module_ip_test.cpp @@ -0,0 +1,10920 @@ +/* + * @file protocol_module_ip_test.cpp + * @brief protocol module ip test file. + * + * L7VSD: Linux Virtual Server for Layer7 Load Balancing + * Copyright (C) 2009 NTT COMWARE Corporation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + **********************************************************************/ + +#include +#include "../../../module/protocol/http_utility.cpp" +#include "../../../module/protocol/protocol_module_ip.cpp" +#include "../../../include/replication.h" + +#define REQUEST_BUFFER_SIZE 50u //REQUEST_BUFFER_SIZE +#define RESPONSE_BUFFER_SIZE 50u //RESPONSE_BUFFER_SIZE +#define USE_BUFFER_SIZE 90u //USE_BUFFER_SIZE +#define THREAD_COUNT 10 + +using namespace std; +using namespace boost; +using namespace boost::unit_test; +using namespace l7vs; + +//log stub function +char hostname[] = "127.0.0.1"; + +LOG_LEVEL_TAG stb_getloglevel() +{ + return LOG_LV_DEBUG; +} +LOG_LEVEL_TAG stb_getloglevel_is_none() +{ + return LOG_LV_NONE; +} + +void stb_putLogFatal( const unsigned int message_id, const std::string& message, const char* file, int line) +{ + // cout << boost::format( "%s%d%06d %s %s" ) + // % "PM" + // % LOG_LV_FATAL + // % message_id + // % message.c_str() + // % hostname; + // cout << endl; +} +void stb_putLogError( const unsigned int message_id, const std::string& message, const char* file, int line) +{ + // cout << boost::format( "%s%d%06d %s %s" ) + // % "PM" + // % LOG_LV_ERROR + // % message_id + // % message.c_str() + // % hostname; + // cout << endl; +} +void stb_putLogWarn( const unsigned int message_id, const std::string& message, const char* file, int line) +{ + // cout << boost::format( "%s%d%06d %s %s" ) + // % "PM" + // % LOG_LV_WARN + // % message_id + // % message.c_str() + // % hostname; + // cout << endl; +} +void stb_putLogInfo( const unsigned int message_id, const std::string& message, const char* file, int line) +{ + // cout << boost::format( "%s%d%06d %s %s" ) + // % "PM" + // % LOG_LV_INFO + // % message_id + // % message.c_str() + // % hostname; + // cout << endl; +} +void stb_putLogDebug( const unsigned int message_id, const std::string& message, const char* file, int line) +{ + // cout << boost::format( "%s%d%06d %s %s" ) + // % "PM" + // % LOG_LV_DEBUG + // % message_id + // % message.c_str() + // % hostname; + // cout << endl; +} + +//new operator function +static bool new_flg = false; +void new_install() +{ + new_flg = true; +} +void new_uninstall() +{ + new_flg = false; +} +void* operator new[](size_t size) +{ + if (new_flg) + throw std::bad_alloc(); + else + { + void* p = malloc(size); + return p; + } +} +void operator delete[](void* p) +{ + free(p); +} + +protocol_module_ip::realserverlist_type::iterator get_rs_list_begin(protocol_module_ip::realserverlist_type* p_rs_list) +{ + return p_rs_list->begin(); +} + +protocol_module_ip::realserverlist_type::iterator get_rs_list_end(protocol_module_ip::realserverlist_type* p_rs_list) +{ + return p_rs_list->end(); +} + +protocol_module_ip::realserverlist_type::iterator get_rs_list_next(protocol_module_ip::realserverlist_type::iterator in_itr) +{ + return ++in_itr; +} + + + +//RealServerリストの各操作関数 +//RealServerリスト先頭取得関数 +protocol_module_ip::realserverlist_type::iterator rslist_begin() +{ + return protocol_module_ip::realserverlist_type::iterator(); +} +//RealServerリスト末端取得関数 +protocol_module_ip::realserverlist_type::iterator rslist_end() +{ + return protocol_module_ip::realserverlist_type::iterator(); +} +//RealServerリスト次要素取得関数 +protocol_module_ip::realserverlist_type::iterator rslist_next( + protocol_module_ip::realserverlist_type::iterator iter) +{ + return protocol_module_ip::realserverlist_type::iterator(); +} +//RealServerリストロック関数 +void rslist_lock() +{ +} +//RealServerリストアンロック関数 +void rslist_unlock() +{ +} +//コンポーネント領域割り当て関数 +void* pay_memory(const std::string& str, unsigned int* pro) +{ + return 0 ; +} +//コンポーネント領域ロック関数 +void area_lock() {} +//コンポーネント領域アンロック関数 +void area_unlock() {} +//Client振り分け処理関数 +void schedule_tcp_stb( const boost::thread::id id, + protocol_module_base::rs_list_itr_func_type func_type1, + protocol_module_base::rs_list_itr_func_type func_type2, + protocol_module_base::rs_list_itr_next_func_type func_type3, + boost::asio::ip::tcp::endpoint& ) +{ +} + +bool check_replication_area_lock=false; +bool check_replication_area_unlock=false; + +void replication_area_lock_stb() +{ + check_replication_area_lock=true; +} + +void replication_area_unlock_stb() +{ + check_replication_area_unlock=true; +} +//Thread function +void up_thread_func(){} +void down_thread_func(){} + +class ip_session_data_processor_stub : public ip_session_data_processor +{ +public: + ip_session_data_processor_stub( + int timeout, + ip_replication_data_processor* replication_data_processor, + getloglevel_func_type ingetloglevel, + logger_func_type inputLogFatal, + logger_func_type inputLogError, + logger_func_type inputLogWarn, + logger_func_type inputLogInfo, + logger_func_type inputLogDebug ): + ip_session_data_processor( + timeout, + replication_data_processor, + ingetloglevel, + inputLogFatal, + inputLogError, + inputLogWarn, + inputLogInfo, + inputLogDebug){} + + ~ip_session_data_processor_stub(){} + + ip_session_table_entry get_session_data_stub(int ip_hash) + { + return session_table[ip_hash]; + } + void write_session_data_stub(int ip_hash, const ip_session_table_entry& data) + { + + session_table[ip_hash] = data; + } +}; + +class ip_replication_data_processor_stub : public ip_replication_data_processor +{ +public: + ip_replication_data_processor_stub( + char* ip_replication_area_begain, + int ip_replication_area_size, + const boost::asio::ip::tcp::endpoint& virtual_service_endpoint, + getloglevel_func_type ingetloglevel, + logger_func_type inputLogFatal, + logger_func_type inputLogError, + logger_func_type inputLogWarn, + logger_func_type inputLogInfo, + logger_func_type inputLogDebug ): + ip_replication_data_processor( + ip_replication_area_begain, + ip_replication_area_size, + virtual_service_endpoint, + ingetloglevel, + inputLogFatal, + inputLogError, + inputLogWarn, + inputLogInfo, + inputLogDebug){} + + ~ip_replication_data_processor_stub(){} + + ip_replication_data*& get_replication_area() + { + return replication_area; + } + + std::deque& get_temp_list() + { + return temp_list; + } +}; +// using string to endpoint template function +template +boost::asio::ip::basic_endpoint string_to_endpoint(std::string str) +{ + std::string::size_type pos = str.find(":"); + std::string hostname = str.substr(0, pos); + std::string portname = str.substr(pos + 1, str.length()); + boost::asio::io_service io_service; + typename InternetProtocol::resolver resolver(io_service); + typename InternetProtocol::resolver::query query(hostname, portname); + typename InternetProtocol::resolver::iterator end; + typename InternetProtocol::resolver::iterator itr = resolver.resolve(query); + if (itr == end) + return typename InternetProtocol::endpoint(); + return *itr; +} + +//schedule function +void schedule_tcp_determinate(//endpoint = 決定 + const boost::thread::id thread_id, + protocol_module_base::rs_list_itr_func_type rs_list_begin, + protocol_module_base::rs_list_itr_func_type rs_list_end, + protocol_module_base::rs_list_itr_next_func_type rs_list_next, + boost::asio::ip::tcp::endpoint &rs_endpoint) +{ + rs_endpoint = string_to_endpoint ("10.10.10.10:8888"); +} + +void schedule_tcp_determinate_config_result(//endpoint = 決定 + const boost::thread::id thread_id, + protocol_module_base::rs_list_itr_func_type rs_list_begin, + protocol_module_base::rs_list_itr_func_type rs_list_end, + protocol_module_base::rs_list_itr_next_func_type rs_list_next, + boost::asio::ip::tcp::endpoint &rs_endpoint, + const boost::asio::ip::tcp::endpoint& result) +{ + rs_endpoint = result; +} + + +void schedule_tcp_nodeterminate(//endpoint = 未決定 + const boost::thread::id thread_id, + protocol_module_base::rs_list_itr_func_type rs_list_begin, + protocol_module_base::rs_list_itr_func_type rs_list_end, + protocol_module_base::rs_list_itr_next_func_type rs_list_next, + boost::asio::ip::tcp::endpoint &rs_endpoint) +{ +} + +void* replication_pay_memory_stb(const std::string& module_name, unsigned int* data_size) +{ + *data_size = 400; + void* data_addr = malloc( *data_size * DATA_SIZE ); + memset( data_addr, 0, *data_size * DATA_SIZE ); + ip_replication_data_header* replication_header; + replication_header=(ip_replication_data_header *)data_addr; + strcpy(replication_header->virtualserver_ip,"192.168.120.246"); + replication_header->virtualserver_port=8888; + replication_header->offset=128*sizeof(ip_replication_data_header); + replication_header->size=1024*sizeof(ip_replication_data); + ip_replication_data* replication_data=(ip_replication_data*)((ip_replication_data_header*)data_addr+128); + strcpy(replication_data->realserver_ip,"192.168.120.246"); + replication_data->realserver_port=8888; + replication_data->last_time=time(0); + replication_data->valid=1; + + return data_addr; +} + + +//test class +class protocol_module_ip_test_class : public protocol_module_ip +{ +public: + boost::mutex check_mutex; + + //stub log function install + void install_stb_log_func() + { + typedef boost::function< void ( const unsigned int, const std::string&, const char*, int ) > log_func_type; + + boost::function< LOG_LEVEL_TAG(void) > getloglevel = &stb_getloglevel; + log_func_type putLogFatal = &stb_putLogFatal; + log_func_type putLogError = &stb_putLogError; + log_func_type putLogWarn = &stb_putLogWarn; + log_func_type putLogInfo = &stb_putLogInfo; + log_func_type putLogDebug = &stb_putLogDebug; + this->init_logger_functions(getloglevel, putLogFatal, putLogError, + putLogWarn, putLogInfo, putLogDebug); + + } + void install_stb_replication_func() + { + boost::function< void* ( const std::string&, unsigned int* ) > inreplication_pay_memory=&replication_pay_memory_stb; + boost::function inlock_func=&replication_area_lock_stb; + boost::function inunlock_func=&replication_area_unlock_stb; + boost::asio::ip::tcp::endpoint tcp_ep; + boost::asio::ip::udp::endpoint udp_ep; + this->init_replication_functions(inreplication_pay_memory,inlock_func,inunlock_func,tcp_ep,udp_ep); + } + //initinalize session_thread_data_ip + void init_session_thread_data_ip(thread_data_ptr data, + boost::thread::id thread_id) + { + } + + + protocol_module_ip_test_class() + { + install_stb_log_func(); + } + + //protocol_module_ip + void protocol_module_ip_test() + { + + cout << "[1]--------------------------------------------- " << endl; + //unit_test[1] モジュール名が"ip"に設定する。 + protocol_module_ip obj; + BOOST_CHECK_EQUAL(obj.get_name(), "ip"); + + cout << "[2]--------------------------------------------- " << endl; + //unit_test[2] ipのインスタンスを生成する。 + protocol_module_ip* p = new protocol_module_ip(); + BOOST_CHECK_EQUAL(p->get_name(), "ip"); + delete p; + } + + //is_tcp + void is_tcp_test() + { + cout << "[3]--------------------------------------------- " << endl; + //unit_test[3] is_tcp TRUEを返却する + BOOST_CHECK(this->is_tcp()); + } + + //is_udp + void is_udp_test() + { + cout << "[4]--------------------------------------------- " << endl; + //unit_test[4] is_udp FALSEを返却する + BOOST_CHECK_EQUAL(this->is_udp(), false); + } + + //get_name + void get_name_test() + { + } + + //initialize + void initialize_test() + { + cout << "[5]--------------------------------------------- " << endl; + //unit_test[5] RealServerリストの各操作関数メソッドinitializeのテスト + rs_list_itr_func_type inrslist_begin = rslist_begin; + rs_list_itr_func_type inrslist_end = rslist_end; + rs_list_itr_next_func_type inrslist_next = rslist_next; + boost::function inlist_lock = rslist_lock; + boost::function inlist_unlock = rslist_unlock; + + this->initialize(inrslist_begin, inrslist_end, inrslist_next, inlist_lock, inlist_unlock); + + BOOST_CHECK_EQUAL(this->rs_list_begin, rslist_begin); + BOOST_CHECK_EQUAL(this->rs_list_end, rslist_end); + BOOST_CHECK_EQUAL(this->rs_list_next, rslist_next); + BOOST_CHECK_EQUAL(this->rs_list_lock, rslist_lock); + BOOST_CHECK_EQUAL(this->rs_list_unlock, rslist_unlock); + + cout << "[6]--------------------------------------------- " << endl; + //unit_test[6] RealServerリストの各操作関数空のテスト + inrslist_begin.clear(); + inrslist_end.clear(); + inrslist_next.clear(); + inlist_lock.clear(); + inlist_unlock.clear(); + this->initialize(inrslist_begin,inrslist_end,inrslist_next,inlist_lock,inlist_unlock); + + BOOST_CHECK_EQUAL(this->rs_list_begin.empty(), true); + BOOST_CHECK_EQUAL(this->rs_list_end.empty(), true); + BOOST_CHECK_EQUAL(this->rs_list_next.empty(), true); + BOOST_CHECK_EQUAL(this->rs_list_lock.empty(), true); + BOOST_CHECK_EQUAL(this->rs_list_unlock.empty(), true); + } + + //finalize + void finalize_test() + { + boost::function::iterator(void)> inrslist_begin = + rslist_begin; + boost::function::iterator(void)> inrslist_end = + rslist_end; + boost::function::iterator(std::list::iterator)> inrslist_next = + rslist_next; + boost::function inlist_lock = rslist_lock; + boost::function inlist_unlock = rslist_unlock; + char* ip_replication_area_begain = new char[10]; + boost::asio::ip::tcp::endpoint virtual_service_endpoint; + getloglevel_func_type ingetloglevel = stb_getloglevel; + logger_func_type inputLogFatal = stb_putLogFatal; + logger_func_type inputLogError = stb_putLogError; + logger_func_type inputLogWarn = stb_putLogWarn; + logger_func_type inputLogInfo = stb_putLogInfo; + logger_func_type inputLogDebug = stb_putLogDebug; + this->forwarded_for = FORWARDED_FOR_ON; + this->sorry_uri.assign('a'); + + cout << "[7]--------------------------------------------- " << endl; + //unit_test[7] 初期値がある場合 + int ip_replication_area_size = 10; + + this->initialize(inrslist_begin, inrslist_end, inrslist_next, + inlist_lock, inlist_unlock); + this->replication_data_processor = new ip_replication_data_processor_stub(ip_replication_area_begain, + ip_replication_area_size, virtual_service_endpoint, ingetloglevel, inputLogFatal, inputLogError, + inputLogWarn, inputLogInfo, inputLogDebug); + this->ip_data_processor = new ip_session_data_processor_stub( + 3600, this->replication_data_processor, ingetloglevel, + inputLogFatal, inputLogError, inputLogWarn, inputLogInfo, + inputLogDebug); + this->schedule_tcp = schedule_tcp_stb; + this->replication_pay_memory = replication_pay_memory_stb; + this->replication_area_lock = replication_area_lock_stb; + this->replication_area_unlock = replication_area_unlock_stb; + this->forwarded_for = FORWARDED_FOR_OFF; + char* sorryuri = "/bc78/0123456789/0123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/12345678/"; + memcpy(this->sorry_uri.c_array(), sorryuri, strlen(sorryuri)); + this->finalize(); + BOOST_CHECK(!this->getloglevel); + BOOST_CHECK(!this->putLogFatal); + BOOST_CHECK(!this->putLogError); + BOOST_CHECK(!this->putLogWarn); + BOOST_CHECK(!this->putLogInfo); + BOOST_CHECK(!this->putLogDebug); + BOOST_CHECK(!this->rs_list_begin); + BOOST_CHECK(!this->rs_list_end); + BOOST_CHECK(!this->rs_list_next); + BOOST_CHECK(!this->rs_list_lock); + BOOST_CHECK(!this->rs_list_unlock); + BOOST_CHECK(!this->replication_pay_memory); + BOOST_CHECK(!this->replication_area_lock); + BOOST_CHECK(!this->replication_area_unlock); + BOOST_CHECK(!this->schedule_tcp); + BOOST_CHECK_EQUAL(this->timeout, 0); + BOOST_CHECK_EQUAL(this->reschedule, 0); + BOOST_CHECK(this->ip_data_processor == NULL); + BOOST_CHECK(this->replication_data_processor == NULL); + BOOST_CHECK_EQUAL(this->forwarded_for,FORWARDED_FOR_OFF); + BOOST_CHECK_EQUAL(this->sorry_uri[0],'\0'); + + cout << "[8]--------------------------------------------- " << endl; + //unit_test[8] 初期値が空の場合 + this->getloglevel = stb_getloglevel; + this->putLogFatal = stb_putLogFatal; + this->putLogError = stb_putLogError; + this->putLogWarn = stb_putLogWarn; + this->putLogInfo = stb_putLogInfo; + this->putLogDebug = stb_putLogDebug; + this->rs_list_begin = NULL; + this->rs_list_end = NULL; + this->rs_list_next = NULL; + this->rs_list_lock = NULL; + this->rs_list_unlock = NULL; + this->replication_pay_memory = NULL; + this->replication_area_lock = NULL; + replication_area_unlock = NULL; + this->schedule_tcp = NULL; + this->schedule_udp = NULL; + this->timeout = 10; + this->reschedule = 10; + this->forwarded_for = FORWARDED_FOR_ON; + this->sorry_uri.assign('a'); + this->replication_data_processor = NULL; + + this->ip_data_processor = NULL; + this->finalize(); + BOOST_CHECK(!this->getloglevel); + BOOST_CHECK(!this->putLogFatal); + BOOST_CHECK(!this->putLogError); + BOOST_CHECK(!this->putLogWarn); + BOOST_CHECK(!this->putLogInfo); + BOOST_CHECK(!this->putLogDebug); + BOOST_CHECK(!this->rs_list_begin); + BOOST_CHECK(!this->rs_list_end); + BOOST_CHECK(!this->rs_list_next); + BOOST_CHECK(!this->rs_list_lock); + BOOST_CHECK(!this->rs_list_unlock); + BOOST_CHECK(!this->replication_pay_memory); + BOOST_CHECK(!this->replication_area_lock); + BOOST_CHECK(!this->replication_area_unlock); + BOOST_CHECK(!this->schedule_tcp); + BOOST_CHECK(!this->schedule_udp); + BOOST_CHECK_EQUAL(this->timeout, 0); + BOOST_CHECK_EQUAL(this->reschedule, 0); + BOOST_CHECK(this->ip_data_processor == NULL); + BOOST_CHECK(this->replication_data_processor == NULL); + BOOST_CHECK_EQUAL(this->forwarded_for,FORWARDED_FOR_OFF); + BOOST_CHECK_EQUAL(this->sorry_uri[0],'\0'); + delete[] ip_replication_area_begain; + } + + //is_use_sorry + void is_use_sorry_test() + { + cout << "[9]--------------------------------------------- " << endl; + //unit_test[9] 正常系で必ずtrueを返す + BOOST_CHECK_EQUAL(this->is_use_sorry(), true); + } + + //check_parameter + void check_parameter_test() + { + std::vector args; + + cout << "[10]--------------------------------------------- " << endl; + //unit_test[10] オプション文字列が存在しない場合, チェック結果フラグにTRUEを設定する + protocol_module_base::check_message_result check_message; + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,true); + + cout << "[11]--------------------------------------------- " << endl; + //unit_test[11] オプション文字列 = "-T", チェック結果フラグにTRUEを設定する + args.push_back("-T"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,true); + + cout << "[12]--------------------------------------------- " << endl; + //unit_test[12] オプション文字列 = "--T", チェック結果フラグにFALSEを設定する、チェック結果メッセージに"Option error."を設定する + args.clear(); + args.push_back("--T"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL(check_message.message,"Option error."); + + cout << "[13]--------------------------------------------- " << endl; + //unit_test[13] オプション文字列 = "-T -T",チェック結果フラグにTRUEを設定する + args.clear(); + args.push_back("-T"); + args.push_back("-T"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,true); + + cout << "[14]--------------------------------------------- " << endl; + //unit_test[14] チェック結果フラグにFALSEを設定する,チェック結果メッセージに"'-T/--timeout' option value '2ewqt' is not numeric character."を設定する + //unit_test[14] data test:オプション文字列 = "-T 2ewqt"の場合 + args.clear(); + args.push_back("-T"); + args.push_back("2ewqt"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL(check_message.message,"'-T/--timeout' option value '2ewqt' is not numeric character."); + + cout << "[15]--------------------------------------------- " << endl; + //unit_test[15] チェック結果フラグにFALSEを設定する,チェック結果メッセージに"'-T/--timeout' option value '$@#' is not numeric character."を設定する + //unit_test[15] data test:オプション文字列 = "-T $@#" + args.clear(); + args.push_back("-T"); + args.push_back("$@#"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL(check_message.message,"'-T/--timeout' option value '$@#' is not numeric character."); + + cout << "[16]--------------------------------------------- " << endl; + //unit_test[16] チェック結果フラグにFALSEを設定する,チェック結果メッセージに"'-T/--timeout' option value '2147483648' is too large."を設定する + //unit_test[16] test data:オプション文字列 = "-T 2147483648"場合 + args.clear(); + args.push_back("-T"); + args.push_back("2147483648"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL(check_message.message,"'-T/--timeout' option value '2147483648' is too large."); + + cout << "[17]--------------------------------------------- " << endl; + //unit_test[17] チェック結果フラグにTRUEを設定する + //unit_test[17] test data:オプション文字列 = "-T 2000"の場合 + args.clear(); + args.push_back("-T"); + args.push_back("2000"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,true); + + cout << "[18]--------------------------------------------- " << endl; + //unit_test[18] チェック結果フラグにTRUEを設定する + //unit_test[18] test data:オプション文字列 = "-T 2147483647"の場合 + args.clear(); + args.push_back("-T"); + args.push_back("2147483647"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,true); + + cout << "[19]--------------------------------------------- " << endl; + //unit_test[19] チェック結果フラグにFALSEを設定する,チェック結果メッセージに"Cannot set multiple option '-T/timeout'"を設定する + //unit_test[19] test data:オプション文字列 = "-T 2000 -T"の場合 + args.clear(); + args.push_back("-T"); + args.push_back("2000"); + args.push_back("-T"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL("Cannot set multiple option '-T/--timeout'.",check_message.message); + + cout << "[20]--------------------------------------------- " << endl; + //unit_test[20] チェック結果フラグにFALSEを設定する,チェック結果メッセージに"Cannot set multiple option '-T/timeout'"を設定する + //unit_test[20] test data:オプション文字列 = "-T 2000 -T 2000"の場合 + args.clear(); + args.push_back("-T"); + args.push_back("2000"); + args.push_back("-T"); + args.push_back("2000"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL("Cannot set multiple option '-T/--timeout'.",check_message.message); + + cout << "[21]--------------------------------------------- " << endl; + //unit_test[21] チェック結果フラグにFALSEを設定する,チェック結果メッセージに"Cannot set multiple option '-T/timeout'"を設定する + //unit_test[21] test data:オプション文字列 = "-T -T 20 -T"の場合 + args.clear(); + args.push_back("-T"); + args.push_back("-T"); + args.push_back("20"); + args.push_back("-T"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL("Cannot set multiple option '-T/--timeout'.",check_message.message); + + cout << "[22]--------------------------------------------- " << endl; + //unit_test[22] オプション文字列 = "--timeout"次要素が存在しない場合,チェック結果フラグにTRUEを設定する + args.clear(); + args.push_back("--timeout"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,true); + + cout << "[23]--------------------------------------------- " << endl; + //unit_test[23] オプション文字列 = "--timeout --timeout" の場合,チェック結果フラグにTRUEを設定する + args.clear(); + args.push_back("--timeout"); + args.push_back("--timeout"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,true); + + cout << "[24]--------------------------------------------- " << endl; + //unit_test[24] チェック結果フラグにFALSEを設定する,チェック結果メッセージに"'-T/--timeout' option value '2ewqt' is not numeric character."を設定する + //unit_test[24] test data:オプション文字列 = "--timeout 2ewqt"の場合 + args.clear(); + args.push_back("--timeout"); + args.push_back("2ewqt"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL(check_message.message,"'-T/--timeout' option value '2ewqt' is not numeric character."); + + cout << "[25]--------------------------------------------- " << endl; + //unit_test[25] チェック結果フラグにFALSEを設定する,チェック結果メッセージに"'-T/--timeout' option value '2147483648' is too large."を設定する + //unit_test[25] test data:オプション文字列 = "--timeout 2147483648"の場合 + args.clear(); + args.push_back("--timeout"); + args.push_back("2147483648"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL(check_message.message,"'-T/--timeout' option value '2147483648' is too large."); + + cout << "[26]--------------------------------------------- " << endl; + //unit_test[26] チェック結果フラグにTRUEを設定する + //unit_test[26] test data:オプション文字列 = "--timeout 2000"の場合 + args.clear(); + args.push_back("--timeout"); + args.push_back("2000"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,true); + + cout << "[27]--------------------------------------------- " << endl; + //unit_test[27] チェック結果フラグにTRUEを設定する + //unit_test[27] test data:オプション文字列 = "--timeout 2147483647"の場合 + args.clear(); + args.push_back("--timeout"); + args.push_back("2147483647"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,true); + + cout << "[28]--------------------------------------------- " << endl; + //unit_test[28] チェック結果フラグにFALSEを設定する,チェック結果メッセージに"Cannot set multiple option '-T/timeout'"を設定する + //unit_test[28] test data:オプション文字列 = "--timeout 2000 --timeout"の場合 + args.clear(); + args.push_back("--timeout"); + args.push_back("2000"); + args.push_back("--timeout"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL("Cannot set multiple option '-T/--timeout'.",check_message.message); + + cout << "[29]--------------------------------------------- " << endl; + //unit_test[29] チェック結果フラグにFALSEを設定する,チェック結果メッセージに"Cannot set multiple option '-T/timeout'"を設定する + //unit_test[29] test data:オプション文字列 = "--timeout 2000 --timeout 2000"の場合 + args.clear(); + args.push_back("--timeout"); + args.push_back("2000"); + args.push_back("--timeout"); + args.push_back("2000"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL("Cannot set multiple option '-T/--timeout'.",check_message.message); + + cout << "[30]--------------------------------------------- " << endl; + //unit_test[30] チェック結果フラグにFALSEを設定する,チェック結果メッセージに"Cannot set multiple option '-T/timeout'"を設定する + //unit_test[30] test data:オプション文字列 = "--timeout --timeout 2000 --timeout"の場合 + args.clear(); + args.push_back("--timeout"); + args.push_back("--timeout"); + args.push_back("2000"); + args.push_back("--timeout"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL("Cannot set multiple option '-T/--timeout'.",check_message.message); + + cout << "[31]--------------------------------------------- " << endl; + //unit_test[31] チェック結果に"true"を設定する + //unit_test[31] test data:オプション文字列 = "-F"の場合 + args.clear(); + args.push_back("-F"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,true); + + cout << "[32]--------------------------------------------- " << endl; + //unit_test[32] チェック結果に"false"を設定する,チェック結果メッセージに"You have to set option value ''-S/--sorryURI"を設定する + //unit_test[32] test data:オプション文字列 = "-S"の場合 + args.clear(); + args.push_back("-S"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL("You have to set option value '-S/--sorry-uri'.",check_message.message); + + cout << "[33]--------------------------------------------- " << endl; + //unit_test[33] チェック結果に"false"を設定する,チェック結果メッセージに"-S/--sorryURI' option value '%s' is too long."を設定する + //unit_test[33] test data:オプション文字列 = "-S ",次要素の文字列長 > 127の場合 + args.clear(); + args.push_back("-S"); + args.push_back("/bcdef1234567890/0123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL("'-S/--sorry-uri' option value '/bcdef1234567890/0123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/' is too long.",check_message.message); + + cout << "[34]--------------------------------------------- " << endl; + //unit_test[34] チェック結果に"true"を設定する + //unit_test[34] test data:オプション文字列 = "-S "の場合,次要素の文字列長 < 127,チェックOKの場合 + args.clear(); + args.push_back("-S"); + args.push_back("/bc78/0123456789/0123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/12345678/"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,true); + + cout << "[35]--------------------------------------------- " << endl; + //unit_test[35] チェック結果フラグにFALSEを設定する、チェック結果メッセージに"'-S/--sorry-uri' option value '%s' is not a valid URI."(%sは次要素)を設定する + //unit_test[35] test data:オプション文字列 = "-S"、次要素の文字列長 = 127 チェックNGの場合 + args.clear(); + args.push_back("-S"); + args.push_back("/a\r\n/123456789/0123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/12345678/"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL("'-S/--sorry-uri' option value '/a\r\n/123456789/0123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/12345678/' is not a valid URI.",check_message.message); + + cout << "[36]--------------------------------------------- " << endl; + //unit_test[36] sorry-uri設定フラグをON、チェック結果メッセージに"Cannot set multiple option '-S/--sorry-uri'."を設定する + //unit_test[36] test data:オプション文字列 = "-S /bc78/0123456789/0123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/12345678/" + //unit_test[36] "--sorry-uri /bc78/0123456789/0123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/12345678/"の場合 + args.clear(); + args.push_back("-S"); + args.push_back("/bc78/0123456789/0123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/12345678/"); + args.push_back("--sorry-uri"); + args.push_back("/bc78/0123456789/0123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/12345678/"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL("Cannot set multiple option '-S/--sorry-uri'.",check_message.message); + + cout << "[37]--------------------------------------------- " << endl; + //unit_test[37] チェック結果フラグにTRUEを設定する + //unit_test[37] test data:オプション文字列 ="-R"の場合 + args.clear(); + args.push_back("-R"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,true); + + cout << "[38]--------------------------------------------- " << endl; + //unit_test[38] チェック結果フラグにTRUEを設定する + //unit_test[38] test data:オプション文字列 ="-N"の場合 + args.clear(); + args.push_back("-N"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,true); + + cout << "[39]--------------------------------------------- " << endl; + //unit_test[39] チェック結果フラグにFALSEを設定する,チェック結果メッセージに"You have to choose either of reschedule or no_rescheduleを設定する + //unit_test[39] test data:オプション文字列 ="-N -R"の場合 + args.clear(); + args.push_back("-N"); + args.push_back("-R"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL("You have to choose either of reschedule or no-reschedule.",check_message.message); + + cout << "[40]--------------------------------------------- " << endl; + //unit_test[40] チェック結果フラグにFALSEを設定する,チェック結果メッセージに"You have to choose either of reschedule or no_rescheduleを設定する + //unit_test[40] test data:オプション文字列 ="-R -N"の場合 + args.clear(); + args.push_back("-R"); + args.push_back("-N"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL("You have to choose either of reschedule or no-reschedule.",check_message.message); + + cout << "[41]--------------------------------------------- " << endl; + //unit_test[41] オプション文字列 ="-T -R -N -F -S"の場合,チェック結果フラグにFALSEを設定する、チェック結果メッセージに"You have to choose either of reschedule or no_rescheduleを設定する + args.clear(); + args.push_back("-T"); + args.push_back("-R"); + args.push_back("-N"); + args.push_back("-F"); + args.push_back("-S"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL("You have to choose either of reschedule or no-reschedule.",check_message.message); + + cout << "[42]--------------------------------------------- " << endl; + //unit_test[42] オプション文字列 ="-T -N -R -S -F"の場合,チェック結果フラグにFALSEを設定する、チェック結果メッセージに"You have to choose either of reschedule or no_rescheduleを設定する + args.clear(); + args.push_back("-T"); + args.push_back("-N"); + args.push_back("-R"); + args.push_back("-S"); + args.push_back("-F"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL("You have to choose either of reschedule or no-reschedule.",check_message.message); + + cout << "[43]--------------------------------------------- " << endl; + //unit_test[43] オプション文字列 ="-T 2000 -R -S /bc78/0123456789/0123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/12345678/ -F"の場合,チェック結果フラグにTRUEを設定する + args.clear(); + args.push_back("-T"); + args.push_back("2000"); + args.push_back("-R"); + args.push_back("-S"); + args.push_back("/bc78/0123456789/0123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/12345678/"); + args.push_back("-F"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,true); + + cout << "[44]--------------------------------------------- " << endl; + //unit_test[44] オプション文字列 ="--timeout 2000 -R -S /bc78/0123456789/0123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/12345678/ -N"の場合,チェック結果フラグにTRUEを設定する + args.clear(); + args.push_back("--timeout"); + args.push_back("2000"); + args.push_back("-R"); + args.push_back("-S"); + args.push_back("/bc78/0123456789/0123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/12345678/"); + args.push_back("-N"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL("You have to choose either of reschedule or no-reschedule.",check_message.message); + + cout << "[45]--------------------------------------------- " << endl; + //unit_test[45] オプション文字列 ="-T 2000 -R"の場合,チェック結果フラグにTRUEを設定する + args.clear(); + args.push_back("-T"); + args.push_back("2000"); + args.push_back("-R"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,true); + + cout << "[46]--------------------------------------------- " << endl; + //unit_test[46] オプション文字列 ="--timeout 2000 -R -S /bc78/0123456789/0123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/12345678/ -F"の場合,チェック結果フラグにTRUEを設定する + args.clear(); + args.push_back("--timeout"); + args.push_back("2000"); + args.push_back("-R"); + args.push_back("-S"); + args.push_back("/bc78/0123456789/0123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/12345678/"); + args.push_back("-F"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,true); + + cout << "[47]--------------------------------------------- " << endl; + //unit_test[47] チェック結果フラグにFALSEを設定する,チェック結果メッセージに"You have to choose either of reschedule or no_rescheduleを設定する + //unit_test[47] test data:オプション文字列 ="-T 2000 -R -N -S /bc78/0123456789/0123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/12345678/ -F"の場合 + args.clear(); + args.push_back("-T"); + args.push_back("2000"); + args.push_back("-R"); + args.push_back("-N"); + args.push_back("-S"); + args.push_back("/bc78/0123456789/0123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/12345678/"); + args.push_back("-F"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL("You have to choose either of reschedule or no-reschedule.",check_message.message); + + cout << "[48]--------------------------------------------- " << endl; + //unit_test[48] オプション文字列 = 上記以外の場合,チェック結果フラグにFALSEを設定する,チェック結果メッセージに"Option error"を設定する + args.clear(); + args.push_back("-A"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL("Option error.",check_message.message); + } + + //set_parameter + void set_parameter_test() + { + cout << "[49]--------------------------------------------- " << endl; + //unit_test[49] チェック結果フラグにTRUEを設定する,timeoutに3600を設定する,rescheduleに0を設定する,送信元設定指示に0を設定する,ipデータをreplication_areaから回復する + //unit_test[49] test data:オプション文字列が存在しないの場合 + protocol_module_base::check_message_result check_message; + vector args; + install_stb_replication_func(); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,true); + BOOST_CHECK_EQUAL(this->timeout,3600); + BOOST_CHECK_EQUAL(this->reschedule,0); + BOOST_CHECK_EQUAL(this->forwarded_for,0); + BOOST_CHECK(this->ip_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->reschedule=111; + this->forwarded_for=111; + + cout << "[50]--------------------------------------------- " << endl; + //unit_test[50] チェック結果フラグにTRUEを設定する,timeoutに3600を設定する,rescheduleに0を設定する,送信元設定指示に0を設定する,ipデータをreplication_areaから回復する + //unit_test[50] test data:オプション文字列 = "-T"の場合 + args.clear(); + args.push_back("-T"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,true); + BOOST_CHECK_EQUAL(this->timeout,3600); + BOOST_CHECK_EQUAL(this->reschedule,0); + BOOST_CHECK_EQUAL(this->forwarded_for,0); + BOOST_CHECK(this->ip_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->reschedule=111; + this->forwarded_for=111; + + cout << "[51]--------------------------------------------- " << endl; + //unit_test[51] チェック結果フラグにFALSEを設定する,チェック結果メッセージに"Option error"を設定する,ipデータをreplication_areaから回復する + //unit_test[51] test data:オプション文字列 = "--T"の場合 + args.clear(); + args.push_back("--T"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL("Option error.",check_message.message); + BOOST_CHECK(this->ip_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->reschedule=111; + this->forwarded_for=111; + + cout << "[52]--------------------------------------------- " << endl; + //unit_test[52] チェック結果フラグにTRUEを設定する,timeoutに3600を設定する,rescheduleに0を設定する,送信元設定指示に0を設定する,ipデータをreplication_areaから回復する + //unit_test[52] test data:オプション文字列 = "-T -T"の場合 + args.clear(); + args.push_back("-T"); + args.push_back("-T"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,true); + BOOST_CHECK_EQUAL(this->timeout,3600); + BOOST_CHECK_EQUAL(this->reschedule,0); + BOOST_CHECK_EQUAL(this->forwarded_for,0); + BOOST_CHECK(this->ip_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->reschedule=111; + this->forwarded_for=111; + + cout << "[53]--------------------------------------------- " << endl; + //unit_test[53] チェック結果フラグにFALSEを設定する,チェック結果メッセージに"'-T/--timeout' option value '2ewqt' is not numeric character."を設定する,ipデータをreplication_areaから回復する + //unit_test[53] test data:オプション文字列 = "-T 2ewqt"の場合 + args.clear(); + args.push_back("-T"); + args.push_back("2ewqt"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL(check_message.message,"'-T/--timeout' option value '2ewqt' is not numeric character."); + BOOST_CHECK(this->ip_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->reschedule=111; + this->forwarded_for=111; + + cout << "[54]--------------------------------------------- " << endl; + //unit_test[54] チェック結果フラグにFALSEを設定する,チェック結果メッセージに"'-T/--timeout option' value '$@#' is not numeric character."を設定する,ipデータをreplication_areaから回復する + //unit_test[54] test data:オプション文字列 = "-T $@#"の場合 + args.clear(); + args.push_back("-T"); + args.push_back("$@#"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL(check_message.message,"'-T/--timeout' option value '$@#' is not numeric character."); + BOOST_CHECK(this->ip_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->reschedule=111; + this->forwarded_for=111; + + cout << "[55]--------------------------------------------- " << endl; + //unit_test[55] チェック結果フラグにFALSEを設定する,チェック結果メッセージに"'-T/--timeout' option value '2147483648' is too large."を設定する,ipデータをreplication_areaから回復する + //unit_test[55] test data:オプション文字列 = "-T 2147483648"の場合 + args.clear(); + args.push_back("-T"); + args.push_back("2147483648"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL(check_message.message,"'-T/--timeout' option value '2147483648' is too large."); + this->timeout=111; + this->reschedule=111; + this->forwarded_for=111; + + cout << "[56]--------------------------------------------- " << endl; + //unit_test[56] チェック結果フラグにTRUEを設定する,timeoutに2000を設定する,rescheduleに0を設定する,送信元設定指示に0を設定する,ipデータをreplication_areaから回復する + //unit_test[56] test data:オプション文字列 = "-T 2000"の場合 + args.clear(); + args.push_back("-T"); + args.push_back("2000"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(this->timeout,2000); + BOOST_CHECK_EQUAL(this->reschedule,0); + BOOST_CHECK_EQUAL(this->forwarded_for,0); + BOOST_CHECK_EQUAL(check_message.flag,true); + BOOST_CHECK(this->ip_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->reschedule=111; + this->forwarded_for=111; + + cout << "[57]--------------------------------------------- " << endl; + //unit_test[57] チェック結果フラグにTRUEを設定する,timeoutに2147483647を設定する,rescheduleに0を設定する,送信元設定指示に0を設定する,ipデータをreplication_areaから回復する + //unit_test[57] test data:オプション文字列 = "-T 2147483647"の場合 + args.clear(); + args.push_back("-T"); + args.push_back("2147483647"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(this->timeout,INT_MAX); + BOOST_CHECK_EQUAL(this->reschedule,0); + BOOST_CHECK_EQUAL(this->forwarded_for,0); + BOOST_CHECK_EQUAL(check_message.flag,true); + BOOST_CHECK(this->ip_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->reschedule=111; + this->forwarded_for=111; + + cout << "[58]--------------------------------------------- " << endl; + //unit_test[58] チェック結果フラグにTRUEを設定する,timeoutに2147483647を設定する,rescheduleに0を設定する,送信元設定指示に0を設定する,ipデータをreplication_areaから回復する + //unit_test[58] test data:オプション文字列 = "-T -T 2147483647"の場合 + args.clear(); + args.push_back("-T"); + args.push_back("-T"); + args.push_back("2147483647"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(this->timeout,INT_MAX); + BOOST_CHECK_EQUAL(this->reschedule,0); + BOOST_CHECK_EQUAL(this->forwarded_for,0); + BOOST_CHECK_EQUAL(check_message.flag,true); + BOOST_CHECK(this->ip_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->reschedule=111; + this->forwarded_for=111; + + cout << "[59]--------------------------------------------- " << endl; + //unit_test[59] チェック結果フラグにFALSEを設定する,timeoutに2147483647を設定する,チェック結果メッセージに"Cannot set multiple option '-T/timeout'"を設定する,ipデータをreplication_areaから回復する + //unit_test[59] test data:オプション文字列 = "-T 2147483647 -T"の場合 + args.clear(); + args.push_back("-T"); + args.push_back("2147483647"); + args.push_back("-T"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL(this->timeout,INT_MAX); + BOOST_CHECK_EQUAL("Cannot set multiple option '-T/--timeout'.",check_message.message); + BOOST_CHECK(this->ip_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->reschedule=111; + this->forwarded_for=111; + + cout << "[60]--------------------------------------------- " << endl; + //unit_test[60] チェック結果フラグにFALSEを設定する,timeoutに2147483647を設定する,チェック結果メッセージに"Cannot set multiple option '-T/timeout'"を設定する,ipデータをreplication_areaから回復する + //unit_test[60] test data:オプション文字列 = "-T 2147483647 -T 2147483647"の場合 + args.clear(); + args.push_back("-T"); + args.push_back("2147483647"); + args.push_back("-T"); + args.push_back("2147483647"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL(this->timeout,INT_MAX); + BOOST_CHECK_EQUAL("Cannot set multiple option '-T/--timeout'.",check_message.message); + this->timeout=111; + this->reschedule=111; + this->forwarded_for=111; + + cout << "[61]--------------------------------------------- " << endl; + //unit_test[61] チェック結果フラグにFALSEを設定する,timeoutに2147483647を設定する,チェック結果メッセージに"Cannot set multiple option '-T/timeout'"を設定する,ipデータをreplication_areaから回復する + //unit_test[61] test data:オプション文字列 = "-T -T 2147483647 -T"の場合 + args.clear(); + args.push_back("-T"); + args.push_back("-T"); + args.push_back("2147483647"); + args.push_back("-T"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL(this->timeout,INT_MAX); + BOOST_CHECK_EQUAL("Cannot set multiple option '-T/--timeout'.",check_message.message); + BOOST_CHECK(this->ip_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->reschedule=111; + this->forwarded_for=111; + + cout << "[62]--------------------------------------------- " << endl; + //unit_test[62] チェック結果フラグにTRUEを設定する,timeoutに3600を設定する,rescheduleに0を設定する,送信元設定指示に0を設定する,ipデータをreplication_areaから回復する + //unit_test[62] test data:オプション文字列 = "--timeout"の場合 + args.clear(); + args.push_back("--timeout"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,true); + BOOST_CHECK_EQUAL(this->timeout,3600); + BOOST_CHECK_EQUAL(this->reschedule,0); + BOOST_CHECK_EQUAL(this->forwarded_for,0); + this->timeout=111; + this->reschedule=111; + this->forwarded_for=111; + + cout << "[63]--------------------------------------------- " << endl; + //unit_test[63] チェック結果フラグにTRUEを設定する,timeoutに3600を設定する,rescheduleに0を設定する,送信元設定指示に0を設定する,ipデータをreplication_areaから回復する + //unit_test[63] test data:オプション文字列 = "--timeout --timeout"の場合 + args.clear(); + args.push_back("--timeout"); + args.push_back("--timeout"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,true); + BOOST_CHECK_EQUAL(this->timeout,3600); + BOOST_CHECK_EQUAL(this->reschedule,0); + BOOST_CHECK_EQUAL(this->forwarded_for,0); + BOOST_CHECK(this->ip_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->reschedule=111; + this->forwarded_for=111; + + cout << "[64]--------------------------------------------- " << endl; + //unit_test[64] チェック結果フラグにFALSEを設定する,チェック結果メッセージに"'-T/--timeout' option value '2ewqt' is not numeric character."を設定する,ipデータをreplication_areaから回復する + //unit_test[64] test data:オプション文字列 = "--timeout 2ewqt"の場合 + args.clear(); + args.push_back("--timeout"); + args.push_back("2ewqt"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL(check_message.message,"'-T/--timeout' option value '2ewqt' is not numeric character."); + BOOST_CHECK(this->ip_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->reschedule=111; + this->forwarded_for=111; + + cout << "[65]--------------------------------------------- " << endl; + //unit_test[65] チェック結果フラグにFALSEを設定する,チェック結果メッセージに"'-T/--timeout' option value '2147483648' is too large."を設定する,ipデータをreplication_areaから回復する + //unit_test[65] test data:オプション文字列 = "--timeout 2147483648"の場合 + args.clear(); + args.push_back("--timeout"); + args.push_back("2147483648"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL(check_message.message,"'-T/--timeout' option value '2147483648' is too large."); + BOOST_CHECK(this->ip_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->reschedule=111; + this->forwarded_for=111; + + cout << "[66]--------------------------------------------- " << endl; + //unit_test[66] チェック結果フラグにTRUEを設定する,timeoutに2000を設定する,rescheduleに0を設定する,送信元設定指示に0を設定する,ipデータをreplication_areaから回復する + //unit_test[66] test data:オプション文字列 = "--timeout 2000"の場合 + args.clear(); + args.push_back("--timeout"); + args.push_back("2000"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(this->timeout,2000); + BOOST_CHECK_EQUAL(this->reschedule,0); + BOOST_CHECK_EQUAL(this->forwarded_for,0); + BOOST_CHECK_EQUAL(check_message.flag,true); + BOOST_CHECK(this->ip_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->reschedule=111; + this->forwarded_for=111; + + cout << "[67]--------------------------------------------- " << endl; + //unit_test[67] チェック結果フラグにTRUEを設定する,timeoutに2147483647を設定する,rescheduleに0を設定する,送信元設定指示に0を設定する,ipデータをreplication_areaから回復する + //unit_test[67] test data:オプション文字列 = "--timeout"の場合 + args.clear(); + args.push_back("--timeout"); + args.push_back("2147483647"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(this->timeout,INT_MAX); + BOOST_CHECK_EQUAL(this->reschedule,0); + BOOST_CHECK_EQUAL(this->forwarded_for,0); + BOOST_CHECK_EQUAL(check_message.flag,true); + BOOST_CHECK(this->ip_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->reschedule=111; + this->forwarded_for=111; + + cout << "[68]--------------------------------------------- " << endl; + //unit_test[68] チェック結果フラグにTRUEを設定する,timeoutに2147483647を設定する,rescheduleに0を設定する,送信元設定指示に0を設定する,ipデータをreplication_areaから回復する + //unit_test[68] test data:オプション文字列 = "--timeout --timeout 2147483647"の場合 + args.clear(); + args.push_back("--timeout"); + args.push_back("--timeout"); + args.push_back("2147483647"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(this->timeout,INT_MAX); + BOOST_CHECK_EQUAL(this->reschedule,0); + BOOST_CHECK_EQUAL(this->forwarded_for,0); + BOOST_CHECK_EQUAL(check_message.flag,true); + BOOST_CHECK(this->ip_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->reschedule=111; + this->forwarded_for=111; + + cout << "[69]--------------------------------------------- " << endl; + //unit_test[69] チェック結果フラグにFALSEを設定する,timeoutに2147483647を設定する,チェック結果メッセージに"Cannot set multiple option '-T/timeout'"を設定する,ipデータをreplication_areaから回復する + //unit_test[69] test data:オプション文字列 = "--timeout 2147483647 --timeout"の場合 + args.clear(); + args.push_back("--timeout"); + args.push_back("2147483647"); + args.push_back("--timeout"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL(this->timeout,INT_MAX); + BOOST_CHECK_EQUAL("Cannot set multiple option '-T/--timeout'.",check_message.message); + BOOST_CHECK(this->ip_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->reschedule=111; + this->forwarded_for=111; + + cout << "[70]--------------------------------------------- " << endl; + //unit_test[70] チェック結果フラグにFALSEを設定する,timeoutに2147483647を設定する,チェック結果メッセージに"Cannot set multiple option '-T/timeout'"を設定する,ipデータをreplication_areaから回復する + //unit_test[70] test data:オプション文字列 = "--timeout 2147483647 --timeout 2147483647"の場合 + args.clear(); + args.push_back("--timeout"); + args.push_back("2147483647"); + args.push_back("--timeout"); + args.push_back("2147483647"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL(this->timeout,INT_MAX); + BOOST_CHECK_EQUAL("Cannot set multiple option '-T/--timeout'.",check_message.message); + BOOST_CHECK(this->ip_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->reschedule=111; + this->forwarded_for=111; + + cout << "[71]--------------------------------------------- " << endl; + //unit_test[71] チェック結果フラグにFALSEを設定する,timeoutに2147483647を設定する,チェック結果メッセージに"Cannot set multiple option '-T/timeout'"を設定する,ipデータをreplication_areaから回復する + //unit_test[71] test data:オプション文字列 = "--timeout --timeout 2147483647 --timeout"の場合 + args.clear(); + args.push_back("--timeout"); + args.push_back("--timeout"); + args.push_back("2147483647"); + args.push_back("--timeout"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL("Cannot set multiple option '-T/--timeout'.",check_message.message); + BOOST_CHECK_EQUAL(this->timeout,INT_MAX); + BOOST_CHECK(this->ip_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->reschedule=111; + this->forwarded_for=111; + + cout << "[72]--------------------------------------------- " << endl; + //unit_test[72] チェック結果に"true"を設定する,送信元設定指示設定に1を設定する + //unit_test[72] test data:オプション文字列 = "-F"の場合 + args.clear(); + args.push_back("-F"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,true); + BOOST_CHECK_EQUAL(this->forwarded_for,FORWARDED_FOR_ON); + BOOST_CHECK_EQUAL(this->timeout,3600); + BOOST_CHECK_EQUAL(this->reschedule,0); + this->timeout=111; + this->reschedule=111; + this->forwarded_for=111; + + + cout << "[73]--------------------------------------------- " << endl; + //unit_test[73] チェック結果に"false"を設定する,チェック結果メッセージに"You have to set option value ''-S/--sorryURI"を設定する + //unit_test[73] test data:オプション文字列 = "-S"の場合 + args.clear(); + args.push_back("-S"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL("You have to set option value '-S/--sorry-uri'.",check_message.message); + this->timeout=111; + this->reschedule=111; + this->forwarded_for=111; + + cout << "[74]--------------------------------------------- " << endl; + //unit_test[74] チェック結果に"false"を設定する,チェック結果メッセージに"-S/--sorryURI' option value '%s' is too long."を設定する + //unit_test[74] test data:オプション文字列 = "-S /bcdef1234567890/0123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/"の場合、次要素の文字列長 > 127の場合 + args.clear(); + args.push_back("-S"); + args.push_back("/bcdef1234567890/0123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL("'-S/--sorry-uri' option value '/bcdef1234567890/0123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/' is too long.",check_message.message); + this->timeout=111; + this->reschedule=111; + this->forwarded_for=111; + + cout << "[75]--------------------------------------------- " << endl; + //unit_test[75] チェック結果フラグにFALSEを設定する、チェック結果メッセージに"'-S/--sorry-uri' option value '%s' is not a valid URI."(%sは次要素)を設定する + //unit_test[75] test data:オプション文字列 = "-S /a\r\n/123456789/0123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/12345678/"、、次要素の文字列長 = 127 チェックNGの場合 + args.clear(); + args.push_back("-S"); + args.push_back("/a\r\n/123456789/0123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/12345678/"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL("'-S/--sorry-uri' option value '/a\r\n/123456789/0123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/12345678/' is not a valid URI.",check_message.message); + this->timeout=111; + this->reschedule=111; + this->forwarded_for=111; + + cout << "[76]--------------------------------------------- " << endl; + //unit_test[76] sorry-uri設定フラグをON、チェック結果メッセージに"Cannot set multiple option '-S/--sorry-uri'."を設定する + //unit_test[76] test data:オプション文字列 = "-S /bc78/0123456789/0123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/12345678/" + //unit_test[76] " --sorry-uri /bc78/0123456789/0123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/12345678/"次要素の文字列長 = 127 チェックOKの場合 + args.clear(); + args.push_back("-S"); + args.push_back("/bc78/0123456789/0123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/12345678/"); + args.push_back("--sorry-uri"); + args.push_back("/bc78/0123456789/0123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/12345678/"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL("Cannot set multiple option '-S/--sorry-uri'.",check_message.message); + this->timeout=111; + this->reschedule=111; + this->forwarded_for=111; + + cout << "[77]--------------------------------------------- " << endl; + //unit_test[77] sorry-uri設定フラグをON、チェック結果メッセージに"Cannot set multiple option '-S/--sorry-uri'."を設定する + //unit_test[77] test data:オプション文字列 = "-S /bc78/0123456789/0123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/12345678/"、次要素の文字列長 = 127 チェックOKの場合 + args.clear(); + args.push_back("-S"); + args.push_back("/bc78/0123456789/0123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/12345678/"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,true); + char* sorryuri = "/bc78/0123456789/0123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/12345678/"; + int ret = memcmp(this->sorry_uri.c_array(), sorryuri, strlen(sorryuri)); + BOOST_CHECK_EQUAL(ret,0); + this->timeout=111; + this->reschedule=111; + this->forwarded_for=111; + + cout << "[78]--------------------------------------------- " << endl; + //unit_test[78] チェック結果フラグにTRUEを設定する,rescheduleに1を設定する,timeoutに3600を設定する,送信元設定指示に0を設定する,ipデータをreplication_areaから回復する + //unit_test[78] test data:オプション文字列 = "-R" + args.clear(); + args.push_back("-R"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,true); + BOOST_CHECK_EQUAL(this->reschedule,1); + BOOST_CHECK_EQUAL(this->timeout,3600); + BOOST_CHECK_EQUAL(this->forwarded_for,0); + BOOST_CHECK(this->ip_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->reschedule=111; + this->forwarded_for=111; + + cout << "[79]--------------------------------------------- " << endl; + //unit_test[79] チェック結果フラグにFALSEを設定する,rescheduleに0を設定する,チェック結果メッセージに"You have to choose either of reschedule or no_reschedule"を設定する,ipデータをreplication_areaから回復する + //unit_test[79] test data:オプション文字列 ="-N -R" + args.clear(); + args.push_back("-N"); + args.push_back("-R"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(this->reschedule,0); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL("You have to choose either of reschedule or no-reschedule.",check_message.message); + BOOST_CHECK(this->ip_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->reschedule=111; + this->forwarded_for=111; + + cout << "[80]--------------------------------------------- " << endl; + //unit_test[80] チェック結果フラグにTRUEを設定する,rescheduleに0を設定する,timeoutに3600を設定する,送信元設定指示に0を設定する,ipデータをreplication_areaから回復する + //unit_test[80] test data:オプション文字列 = "-N" + args.clear(); + args.push_back("-N"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(this->reschedule,0); + BOOST_CHECK_EQUAL(check_message.flag,true); + BOOST_CHECK_EQUAL(this->timeout,3600); + BOOST_CHECK(this->ip_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->reschedule=111; + this->forwarded_for=111; + + cout << "[81]--------------------------------------------- " << endl; + //unit_test[81] チェック結果フラグにFALSEを設定する,rescheduleに1を設定する,チェック結果メッセージに"You have to choose either of reschedule or no_reschedule"を設定する,ipデータをreplication_areaから回復する + //unit_test[81] test data:オプション文字列 = "-R -N" + args.clear(); + args.push_back("-R"); + args.push_back("-N"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(this->reschedule,1); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL("You have to choose either of reschedule or no-reschedule.",check_message.message); + BOOST_CHECK(this->ip_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->reschedule=111; + this->forwarded_for=111; + + cout << "[82]--------------------------------------------- " << endl; + //unit_test[82] チェック結果フラグにFALSEを設定する,チェック結果メッセージに"You have to choose either of reschedule or no_reschedule"を設定する,timeoutに2000を設定する,,rescheduleに1を設定する,ipデータをreplication_areaから回復する + //unit_test[82] test data:オプション文字列 = "-T -R -N -F -S" + args.clear(); + args.push_back("-T"); + args.push_back("-R"); + args.push_back("-N"); + args.push_back("-F"); + args.push_back("-S"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL("You have to choose either of reschedule or no-reschedule.",check_message.message); + BOOST_CHECK(this->ip_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->reschedule=111; + this->forwarded_for=111; + + cout << "[83]--------------------------------------------- " << endl; + //unit_test[83] チェック結果フラグにFALSEを設定する,チェック結果メッセージに"You have to choose either of reschedule or no_reschedule"を設定する,timeoutに2000を設定する,,rescheduleに1を設定する,ipデータをreplication_areaから回復する + //unit_test[83] test data:オプション文字列 = "-T -N -R -F -S" + args.clear(); + args.push_back("-T"); + args.push_back("-N"); + args.push_back("-R"); + args.push_back("-F"); + args.push_back("-S"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL("You have to choose either of reschedule or no-reschedule.",check_message.message); + BOOST_CHECK(this->ip_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->reschedule=111; + this->forwarded_for=111; + + cout << "[84]--------------------------------------------- " << endl; + //unit_test[84] チェック結果フラグにTRUEを設定する,timeoutに2000を設定する,,rescheduleに1を設定する,送信元設定指示に0を設定する,ipデータをreplication_areaから回復する + //unit_test[84] test data:オプション文字列 = "-T 2000 -R -F -S /bc78/0123456789/0123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/12345678/" + args.clear(); + args.push_back("-T"); + args.push_back("2000"); + args.push_back("-R"); + args.push_back("-F"); + args.push_back("-S"); + args.push_back("/bc78/0123456789/0123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/12345678/"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,true); + BOOST_CHECK_EQUAL(this->timeout,2000); + BOOST_CHECK_EQUAL(this->reschedule,1); + BOOST_CHECK_EQUAL(this->forwarded_for,1); + char* sorryuri_1 = "/bc78/0123456789/0123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/12345678/"; + int ret_1 = memcmp(this->sorry_uri.c_array(), sorryuri_1, strlen(sorryuri_1)); + BOOST_CHECK_EQUAL(ret_1,0); + BOOST_CHECK(this->ip_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->reschedule=111; + this->forwarded_for=111; + + cout << "[85]--------------------------------------------- " << endl; + //unit_test[85] チェック結果フラグにTRUEを設定する,,timeoutに2000を設定する,,rescheduleに1を設定する,送信元設定指示に0を設定する,ipデータをreplication_areaから回復する + //unit_test[85] test data:オプション文字列 = "-T 2000 -R -F -S /bc78/0123456789/0123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/12345678/" + args.clear(); + args.push_back("-T"); + args.push_back("2000"); + args.push_back("-R"); + args.push_back("-F"); + args.push_back("-S"); + args.push_back("/bc78/0123456789/0123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/12345678/"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,true); + BOOST_CHECK_EQUAL(this->timeout,2000); + BOOST_CHECK_EQUAL(this->reschedule,1); + BOOST_CHECK_EQUAL(this->forwarded_for,1); + char* sorryuri_2 = "/bc78/0123456789/0123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/12345678/"; + int ret_2 = memcmp(this->sorry_uri.c_array(), sorryuri_2, strlen(sorryuri_2)); + BOOST_CHECK_EQUAL(ret_2,0); + BOOST_CHECK(this->ip_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->reschedule=111; + this->forwarded_for=111; + + cout << "[86]--------------------------------------------- " << endl; + //unit_test[86] チェック結果フラグにTRUEを設定する,,timeoutに2000を設定する,,rescheduleに1を設定する,送信元設定指示に0を設定する,ipデータをreplication_areaから回復する + //unit_test[86] test data:オプション文字列 = "--timeout 2000 -R -F -S /bc78/0123456789/0123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/12345678/" + args.clear(); + args.push_back("--timeout"); + args.push_back("2000"); + args.push_back("-R"); + args.push_back("-F"); + args.push_back("-S"); + args.push_back("/bc78/0123456789/0123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/12345678/"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,true); + BOOST_CHECK_EQUAL(this->timeout,2000); + BOOST_CHECK_EQUAL(this->reschedule,1); + BOOST_CHECK_EQUAL(this->forwarded_for,1); + char* sorryuri_3 = "/bc78/0123456789/0123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/12345678/"; + int ret_3 = memcmp(this->sorry_uri.c_array(), sorryuri_3, strlen(sorryuri_3)); + BOOST_CHECK_EQUAL(ret_3,0); + BOOST_CHECK(this->ip_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->reschedule=111; + this->forwarded_for=111; + + cout << "[87]--------------------------------------------- " << endl; + //unit_test[87] チェック結果フラグにTRUEを設定する,,timeoutに2000を設定する,,rescheduleに1を設定する,送信元設定指示に0を設定する,ipデータをreplication_areaから回復する + //unit_test[87] test data:オプション文字列 = "--timeout 2000 -R -F --sorry-uri /bc78/0123456789/0123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/12345678/" + args.clear(); + args.push_back("--timeout"); + args.push_back("2000"); + args.push_back("-R"); + args.push_back("-F"); + args.push_back("--sorry-uri"); + args.push_back("/bc78/0123456789/0123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/12345678/"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,true); + BOOST_CHECK_EQUAL(this->timeout,2000); + BOOST_CHECK_EQUAL(this->reschedule,1); + BOOST_CHECK_EQUAL(this->forwarded_for,1); + char* sorryuri_4 = "/bc78/0123456789/0123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/12345678/"; + int ret_4 = memcmp(this->sorry_uri.c_array(), sorryuri_4, strlen(sorryuri_4)); + BOOST_CHECK_EQUAL(ret_4,0); + BOOST_CHECK(this->ip_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->reschedule=111; + this->forwarded_for=111; + + cout << "[88]--------------------------------------------- " << endl; + //unit_test[88] チェック結果フラグにFALSEを設定する,チェック結果メッセージに"You have to choose either of reschedule or no_reschedule"を設定する,ipデータをreplication_areaから回復する + //unit_test[88] test data:オプション文字列 = "-T 2000 -R -N -F -S /bc78/0123456789/0123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/12345678/" + args.clear(); + args.push_back("-T"); + args.push_back("2000"); + args.push_back("-R"); + args.push_back("-N"); + args.push_back("-F"); + args.push_back("-S"); + args.push_back("/bc78/0123456789/0123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/12345678/"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL("You have to choose either of reschedule or no-reschedule.",check_message.message); + BOOST_CHECK(this->ip_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->reschedule=111; + this->forwarded_for=111; + + cout << "[89]--------------------------------------------- " << endl; + //unit_test[89] チェック結果フラグにFALSEを設定する,チェック結果メッセージに"You have to choose either of reschedule or no_reschedule"を設定する,ipデータをreplication_areaから回復する + //unit_test[89] test data:オプション文字列 = "-T 2000 -R -N -F --sorry-uri /bc78/0123456789/0123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/12345678/" + args.clear(); + args.push_back("-T"); + args.push_back("2000"); + args.push_back("-R"); + args.push_back("-N"); + args.push_back("-F"); + args.push_back("--sorry-uri"); + args.push_back("/bc78/0123456789/0123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/12345678/"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL("You have to choose either of reschedule or no-reschedule.",check_message.message); + BOOST_CHECK(this->ip_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->reschedule=111; + this->forwarded_for=111; + + cout << "[90]--------------------------------------------- " << endl; + //unit_test[90] チェック結果フラグにFALSEを設定する,チェック結果メッセージに"Option error"を設定する,ipデータをreplication_areaから回復する + //unit_test[90] test data:オプション文字列 = 上記以外 + args.clear(); + args.push_back("-A"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL("Option error.",check_message.message); + BOOST_CHECK(this->ip_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->reschedule=111; + this->forwarded_for=111; + + } + + //add_parameter + void add_parameter_test() + { + check_message_result result; + vector args; + + cout << "[91]--------------------------------------------- " << endl; + //unit_test[91] オプション文字列が存在しない場合,正常系で必ずtrueを返す + result = this->add_parameter(args); + BOOST_CHECK_EQUAL(result.flag, true); + + cout << "[92]--------------------------------------------- " << endl; + //unit_test[92] オプション文字列が存在する場合,チェック結果フラグにFALSEを設定する, チェック結果メッセージに"Cannot add option."を設定する + args.push_back("-F"); + result = this->add_parameter(args); + BOOST_CHECK_EQUAL(result.flag, false); + BOOST_CHECK_EQUAL(result.message, "Cannot add option."); + } + + //register_schedule(tcp) + void register_schedule_tcp_test() + { + cout << "[93]--------------------------------------------- " << endl; + //unit_test[93] Client振り分け処理関数のテスト + tcp_schedule_func_type func = schedule_tcp_stb; + this->register_schedule(func); + BOOST_CHECK_EQUAL(this->schedule_tcp, schedule_tcp_stb); + + cout << "[94]--------------------------------------------- " << endl; + //unit_test[94] Client振り分け処理関数空のテスト + func.clear(); + this->register_schedule(func); + BOOST_CHECK_EQUAL(this->schedule_tcp.empty(), true); + } + + //handle_session_initialize + void handle_session_initialize_test() + { + + boost::thread down_thread(down_thread_func); + boost::asio::ip::tcp::endpoint ep; + boost::asio::ip::tcp::endpoint client_endpoint = string_to_endpoint ("10.10.100.100:8800"); + boost::asio::ip::udp::endpoint client_endpoint_udp; + + cout << "[95]--------------------------------------------- " << endl; + //unit_test[95] パラメータが正常に入力去れた場合、戻り値にACCEPTを設定する。 + EVENT_TAG status = + this->handle_session_initialize(boost::this_thread::get_id(), + down_thread.get_id(), client_endpoint, + client_endpoint_udp); + BOOST_CHECK_EQUAL(status, ACCEPT); + std::map::iterator + itr; + itr = this->session_thread_data_map.find(boost::this_thread::get_id()); + BOOST_CHECK(itr != this->session_thread_data_map.end()); + BOOST_CHECK_EQUAL(itr->second->thread_id, boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(itr->second->thread_division, THREAD_DIVISION_UP_STREAM); + BOOST_CHECK_EQUAL(itr->second->pair_thread_id, down_thread.get_id()); + BOOST_CHECK_EQUAL(itr->second->accept_end_flag, ACCEPT_END_FLAG_OFF); + BOOST_CHECK_EQUAL(itr->second->end_flag, END_FLAG_OFF); + BOOST_CHECK_EQUAL(itr->second->sorry_flag, SORRY_FLAG_OFF); + BOOST_CHECK_EQUAL(itr->second->switch_flag, SWITCH_FLAG_OFF); + BOOST_CHECK_EQUAL(itr->second->client_endpoint, client_endpoint); + BOOST_CHECK(itr->second->data_buffer!=NULL); + BOOST_CHECK_EQUAL(itr->second->data_buffer_size, MAX_BUFFER_SIZE); + BOOST_CHECK_EQUAL(itr->second->data_length, 0u); + BOOST_CHECK_EQUAL(itr->second->data_offset, 0u); + BOOST_CHECK_EQUAL(itr->second->current_message_rest_size, 0u); + BOOST_CHECK_EQUAL(itr->second->data_state, HTTP_START); + BOOST_CHECK_EQUAL(itr->second->last_status, ACCEPT); + BOOST_CHECK_EQUAL(itr->second->ip_hash, static_cast(l7vs_ip_service_calc_hash(itr->second->client_endpoint))); + itr = this->session_thread_data_map.find(down_thread.get_id()); + BOOST_CHECK(itr != this->session_thread_data_map.end()); + BOOST_CHECK_EQUAL(itr->second->thread_id, down_thread.get_id()); + BOOST_CHECK_EQUAL(itr->second->thread_division, THREAD_DIVISION_DOWN_STREAM); + BOOST_CHECK_EQUAL(itr->second->pair_thread_id, boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(itr->second->accept_end_flag, ACCEPT_END_FLAG_OFF); + BOOST_CHECK_EQUAL(itr->second->end_flag, END_FLAG_OFF); + BOOST_CHECK_EQUAL(itr->second->sorry_flag, SORRY_FLAG_OFF); + BOOST_CHECK_EQUAL(itr->second->switch_flag, SWITCH_FLAG_OFF); + BOOST_CHECK_EQUAL(itr->second->client_endpoint, client_endpoint); + BOOST_CHECK(itr->second->data_buffer!=NULL); + BOOST_CHECK_EQUAL(itr->second->data_buffer_size, MAX_BUFFER_SIZE); + BOOST_CHECK_EQUAL(itr->second->data_length, 0u); + BOOST_CHECK_EQUAL(itr->second->data_offset, 0u); + BOOST_CHECK_EQUAL(itr->second->current_message_rest_size, 0u); + BOOST_CHECK_EQUAL(itr->second->data_state, HTTP_START); + BOOST_CHECK_EQUAL(itr->second->last_status, REALSERVER_RECV); + BOOST_CHECK_EQUAL(itr->second->ip_hash, static_cast(l7vs_ip_service_calc_hash(itr->second->client_endpoint))); + } + + //handle_session_initialize + void handle_session_initialize_test_thread() + { + boost::thread down_thread(down_thread_func); + boost::asio::ip::tcp::endpoint ep; + boost::asio::ip::tcp::endpoint client_endpoint = string_to_endpoint ("10.10.100.100:8800"); + boost::asio::ip::udp::endpoint client_endpoint_udp; + + cout << "[96]--------------------------------------------- " << endl; + //unit_test[96] パラメータが正常に入力去れた場合、戻り値にACCEPTを設定する。 + EVENT_TAG status = + this->handle_session_initialize(boost::this_thread::get_id(), + down_thread.get_id(), client_endpoint, + client_endpoint_udp); + { + boost::mutex::scoped_lock sclock(session_thread_data_map_mutex); + BOOST_CHECK_EQUAL(status, ACCEPT); + std::map::iterator + itr; + itr = this->session_thread_data_map.find(boost::this_thread::get_id()); + BOOST_CHECK(itr != this->session_thread_data_map.end()); + BOOST_CHECK_EQUAL(itr->second->thread_id, boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(itr->second->thread_division, THREAD_DIVISION_UP_STREAM); + BOOST_CHECK_EQUAL(itr->second->pair_thread_id, down_thread.get_id()); + BOOST_CHECK_EQUAL(itr->second->accept_end_flag, ACCEPT_END_FLAG_OFF); + BOOST_CHECK_EQUAL(itr->second->end_flag, END_FLAG_OFF); + BOOST_CHECK_EQUAL(itr->second->sorry_flag, SORRY_FLAG_OFF); + BOOST_CHECK_EQUAL(itr->second->switch_flag, SWITCH_FLAG_OFF); + BOOST_CHECK_EQUAL(itr->second->client_endpoint, client_endpoint); + BOOST_CHECK(itr->second->data_buffer!=NULL); + BOOST_CHECK_EQUAL(itr->second->data_buffer_size, MAX_BUFFER_SIZE); + BOOST_CHECK_EQUAL(itr->second->data_length, 0u); + BOOST_CHECK_EQUAL(itr->second->data_offset, 0u); + BOOST_CHECK_EQUAL(itr->second->current_message_rest_size, 0u); + BOOST_CHECK_EQUAL(itr->second->data_state, HTTP_START); + BOOST_CHECK_EQUAL(itr->second->last_status, ACCEPT); + itr = this->session_thread_data_map.find(down_thread.get_id()); + BOOST_CHECK(itr != this->session_thread_data_map.end()); + BOOST_CHECK_EQUAL(itr->second->thread_id, down_thread.get_id()); + BOOST_CHECK_EQUAL(itr->second->thread_division, THREAD_DIVISION_DOWN_STREAM); + BOOST_CHECK_EQUAL(itr->second->pair_thread_id, boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(itr->second->accept_end_flag, ACCEPT_END_FLAG_OFF); + BOOST_CHECK_EQUAL(itr->second->end_flag, END_FLAG_OFF); + BOOST_CHECK_EQUAL(itr->second->sorry_flag, SORRY_FLAG_OFF); + BOOST_CHECK_EQUAL(itr->second->switch_flag, SWITCH_FLAG_OFF); + BOOST_CHECK_EQUAL(itr->second->client_endpoint, client_endpoint); + BOOST_CHECK(itr->second->data_buffer!=NULL); + BOOST_CHECK_EQUAL(itr->second->data_buffer_size, MAX_BUFFER_SIZE); + BOOST_CHECK_EQUAL(itr->second->data_length, 0u); + BOOST_CHECK_EQUAL(itr->second->data_offset, 0u); + BOOST_CHECK_EQUAL(itr->second->current_message_rest_size, 0u); + BOOST_CHECK_EQUAL(itr->second->data_state, HTTP_START); + BOOST_CHECK_EQUAL(itr->second->last_status, REALSERVER_RECV); + } + } + + //handle_session_finalize + void handle_session_finalize_test() + { + { + cout << "[97]--------------------------------------------- " << endl; + //unit_test[97] セッションスレッドに対応する終了処理 + boost::thread down_thread(down_thread_func); + boost::asio::ip::tcp::endpoint ep_tcp = string_to_endpoint ("10.10.100.100:8800"); + boost::asio::ip::udp::endpoint ep_udp = string_to_endpoint ("10.10.100.100:8088"); + + this->handle_session_initialize(boost::this_thread::get_id(),down_thread.get_id(),ep_tcp,ep_udp); + protocol_module_base::EVENT_TAG ret = + this->handle_session_finalize(boost::this_thread::get_id(), down_thread.get_id()); + + //session_thread_data_map中にthis_thread無し + session_thread_data_map_it thread_map_iterator + = this->session_thread_data_map.find(boost::this_thread::get_id()); + bool bret = (thread_map_iterator == this->session_thread_data_map.end()); + BOOST_CHECK_EQUAL(bret,true); + //session_thread_data_map中にdown_thread無し + thread_map_iterator = this->session_thread_data_map.find(down_thread.get_id()); + bret = (thread_map_iterator == this->session_thread_data_map.end()); + BOOST_CHECK_EQUAL(bret,true); + + //遷移先ステータスを設定する status = STOP + BOOST_CHECK_EQUAL( ret, STOP); + } + { + cout << "[98]--------------------------------------------- " << endl; + //unit_test[98] session_thread_data_mapが空 + session_thread_data_map.clear(); + boost::thread down_thread(down_thread_func); + protocol_module_base::EVENT_TAG ret = + this->handle_session_finalize(boost::this_thread::get_id(), down_thread.get_id()); + + //session_thread_data_map中にthis_thread無し + session_thread_data_map_it thread_map_iterator + = this->session_thread_data_map.find(boost::this_thread::get_id()); + bool bret = (thread_map_iterator == this->session_thread_data_map.end()); + BOOST_CHECK_EQUAL(bret,true); + //session_thread_data_map中にdown_thread無し + thread_map_iterator = this->session_thread_data_map.find(down_thread.get_id()); + bret = (thread_map_iterator == this->session_thread_data_map.end()); + BOOST_CHECK_EQUAL(bret,true); + + //遷移先ステータスを設定する status = STOP + BOOST_CHECK_EQUAL( ret, STOP); + } + } + + //handle_session_finalize + void handle_session_finalize_test_thread() + { + { + cout << "[99]--------------------------------------------- " << endl; + //unit_test[99] セッションスレッドに対応する終了処理 + boost::thread down_thread(down_thread_func); + boost::asio::ip::tcp::endpoint ep_tcp = string_to_endpoint ("10.10.100.100:8800"); + boost::asio::ip::udp::endpoint ep_udp = string_to_endpoint ("10.10.100.100:8088"); + + this->handle_session_initialize(boost::this_thread::get_id(),down_thread.get_id(),ep_tcp,ep_udp); + + protocol_module_base::EVENT_TAG ret = + this->handle_session_finalize(boost::this_thread::get_id(), down_thread.get_id()); + { + boost::mutex::scoped_lock sclock(session_thread_data_map_mutex); + + //session_thread_data_map中にthis_thread無し + session_thread_data_map_it thread_map_iterator + = this->session_thread_data_map.find(boost::this_thread::get_id()); + bool bret = (thread_map_iterator == this->session_thread_data_map.end()); + BOOST_CHECK_EQUAL(bret,true); + //session_thread_data_map中にdown_thread無し + thread_map_iterator = this->session_thread_data_map.find(down_thread.get_id()); + bret = (thread_map_iterator == this->session_thread_data_map.end()); + BOOST_CHECK_EQUAL(bret,true); + + //遷移先ステータスを設定する status = STOP + BOOST_CHECK_EQUAL( ret, STOP); + } + } + } + + //handle_accept + void handle_accept_test() + { + EVENT_TAG ret; + + cout << "[100]--------------------------------------------- " << endl; + //unit_test[100] 異常系 session_thread_data_map中にThreadID対応のデータがない + { + + thread_data_ptr data_ptr(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data_ptr; + this->session_thread_data_map[boost::this_thread::get_id()].reset(); + ret = this->handle_accept(boost::this_thread::get_id()); + + //遷移先ステータスを設定する status = FINALIZE + BOOST_CHECK_EQUAL(ret, FINALIZE); + } + + cout << "[101]--------------------------------------------- " << endl; + //unit_test[101] 異常系 session_thread_data_map中にThreadIDなし場合のテスト + { + this->session_thread_data_map.clear(); + ret = this->handle_accept(boost::this_thread::get_id()); + + //遷移先ステータスを設定する status = FINALIZE + BOOST_CHECK_EQUAL(ret, FINALIZE); + } + + cout << "[102]--------------------------------------------- " << endl; + //unit_test[102] sorry状態の場合 + { + thread_data_ptr data_ptr(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data_ptr; + data_ptr->accept_end_flag = ACCEPT_END_FLAG_OFF; + data_ptr->sorry_flag = SORRY_FLAG_ON; + data_ptr->last_status = INITIALIZE; + + ret = this->handle_accept(boost::this_thread::get_id()); + + BOOST_CHECK_EQUAL(ret, SORRYSERVER_SELECT); + BOOST_CHECK_EQUAL(data_ptr->accept_end_flag, ACCEPT_END_FLAG_ON); + BOOST_CHECK_EQUAL(data_ptr->last_status, SORRYSERVER_SELECT); + } + cout << "[103]--------------------------------------------- " << endl; + //unit_test[103] sorry状態以外の場合 + { + thread_data_ptr data_ptr(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data_ptr; + data_ptr->accept_end_flag = ACCEPT_END_FLAG_OFF; + data_ptr->sorry_flag = SORRY_FLAG_OFF; + data_ptr->last_status = INITIALIZE; + + ret = this->handle_accept(boost::this_thread::get_id()); + + BOOST_CHECK_EQUAL(ret, REALSERVER_SELECT); + BOOST_CHECK_EQUAL(data_ptr->accept_end_flag, ACCEPT_END_FLAG_ON); + BOOST_CHECK_EQUAL(data_ptr->last_status, REALSERVER_SELECT); + + } + + } + + //handle_accept + void handle_accept_test_thread() + { + EVENT_TAG ret; + + cout << "[104]--------------------------------------------- " << endl; + //unit_test[104] sorry状態以外の場合 + { + thread_data_ptr data_ptr(new session_thread_data_ip); + + { + boost::mutex::scoped_lock sclock(session_thread_data_map_mutex); + this->session_thread_data_map[boost::this_thread::get_id()] = data_ptr; + data_ptr->accept_end_flag = ACCEPT_END_FLAG_OFF; + data_ptr->sorry_flag = SORRY_FLAG_OFF; + data_ptr->last_status = INITIALIZE; + } + ret = this->handle_accept(boost::this_thread::get_id()); + { + boost::mutex::scoped_lock sclock(session_thread_data_map_mutex); + BOOST_CHECK_EQUAL(ret, REALSERVER_SELECT); + BOOST_CHECK_EQUAL(data_ptr->accept_end_flag, ACCEPT_END_FLAG_ON); + BOOST_CHECK_EQUAL(data_ptr->last_status, REALSERVER_SELECT); + } + } + } + + //handle_client_recv + void handle_client_recv_test() + { + boost::array recvbuffer; + size_t recvlen = 0; + EVENT_TAG ret; + + cout << "[105]--------------------------------------------- " << endl; + //unit_test[105] 異常系 session_thread_data_map中にThreadID対応のデータがない + { + thread_data_ptr thread_data_null; + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data_null; + ret = this->handle_client_recv(boost::this_thread::get_id(), recvbuffer, recvlen); + BOOST_CHECK_EQUAL(ret, FINALIZE); + } + + cout << "[106]--------------------------------------------- " << endl; + //unit_test[106] 異常系 session_thread_data_map中にThreadIDなし場合のテスト + { + this->session_thread_data_map.clear(); + ret = this->handle_client_recv(boost::this_thread::get_id(), recvbuffer, recvlen); + BOOST_CHECK_EQUAL(ret, FINALIZE); + } + + cout << "[107]--------------------------------------------- " << endl; + //unit_test[107] recvデータサイズ>recvbufferサイズの場合 status = FINALIZE + { + thread_data_ptr thread_data(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data; + recvlen = MAX_BUFFER_SIZE + 1; + ret = this->handle_client_recv(boost::this_thread::get_id(), recvbuffer, recvlen); + BOOST_CHECK_EQUAL(ret, FINALIZE); + session_thread_data_map.clear(); + } + + cout << "[108]--------------------------------------------- " << endl; + //unit_test[108] 終了フラグがONの場合 status = CLIENT_RECV + { + thread_data_ptr thread_data(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data; + + thread_data->end_flag = END_FLAG_ON; + recvlen = 10; + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data; + ret = this->handle_client_recv(boost::this_thread::get_id(), recvbuffer, recvlen); + BOOST_CHECK_EQUAL(ret, CLIENT_RECV); + BOOST_CHECK_EQUAL(thread_data->last_status, CLIENT_RECV); + session_thread_data_map.clear(); + } + + cout << "[109]--------------------------------------------- " << endl; + //unit_test[109] 終了フラグがOFFの場合 get_data_from_recvbuffer() 追加設定不可能の場合 status = FINALIZE + { + thread_data_ptr thread_data(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data; + + thread_data->end_flag = END_FLAG_OFF; + thread_data->data_buffer_size = MAX_IP_MODULE_BUFFER_SIZE; + thread_data->data_length = MAX_IP_MODULE_BUFFER_SIZE - 1; + thread_data->data_offset = 0; + thread_data->data_buffer = new char[MAX_IP_MODULE_BUFFER_SIZE]; + recvlen = 10; + ret = this->handle_client_recv(boost::this_thread::get_id(), recvbuffer, recvlen); + BOOST_CHECK_EQUAL(ret, FINALIZE); + BOOST_CHECK_EQUAL(thread_data->last_status, FINALIZE); + session_thread_data_map.clear(); + } + + cout << "[110]--------------------------------------------- " << endl; + //unit_test[110] データ状態がHTTP_STARTの場合 find_http_header_all検索結果が該当なしの場合 + //unit_test[110] データサイズ = データバッファMAXサイズ - 受信バッファサイズの場合 sorry状態の場合 + //unit_test[110] データ状態にUNKNOWNを設定する 未送信データサイズにデータサイズを設定する status = SORRYSERVER_CONNECT + { + thread_data_ptr thread_data(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data; + + thread_data->end_flag = END_FLAG_OFF; + thread_data->data_state = HTTP_START; + thread_data->sorry_flag = SORRY_FLAG_ON; + recvbuffer.assign('0'); + memset(recvbuffer.c_array(), 0, MAX_BUFFER_SIZE); + memcpy(recvbuffer.c_array(), "1234567890", 10); + thread_data->data_buffer_size = MAX_IP_MODULE_BUFFER_SIZE; + thread_data->data_length = MAX_IP_MODULE_BUFFER_SIZE - recvbuffer.size() - 10; + thread_data->data_offset = 0; + thread_data->data_buffer = new char[MAX_IP_MODULE_BUFFER_SIZE]; + memset((thread_data->data_buffer+thread_data->data_offset), 1, thread_data->data_length); + recvlen = 10; + ret = this->handle_client_recv(boost::this_thread::get_id(), recvbuffer, recvlen); + BOOST_CHECK_EQUAL(thread_data->data_state, UNKNOWN); + BOOST_CHECK_EQUAL(thread_data->data_length, MAX_IP_MODULE_BUFFER_SIZE - recvbuffer.size()); + BOOST_CHECK_EQUAL(thread_data->current_message_rest_size,thread_data->data_length); + BOOST_CHECK_EQUAL(ret, SORRYSERVER_CONNECT); + BOOST_CHECK_EQUAL(thread_data->last_status, SORRYSERVER_CONNECT); + session_thread_data_map.clear(); + } + + cout << "[111]--------------------------------------------- " << endl; + //unit_test[111] データ状態がHTTP_STARTの場合 find_http_header_all検索結果が該当なしの場合 + //unit_test[111] データサイズ > データバッファMAXサイズ - 受信バッファサイズの場合 sorry状態の場合 + //unit_test[111] データ状態にUNKNOWNを設定する 未送信データサイズにデータサイズを設定する status = SORRYSERVER_CONNECT + { + thread_data_ptr thread_data(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data; + + thread_data->end_flag = END_FLAG_OFF; + thread_data->data_state = HTTP_START; + thread_data->sorry_flag = SORRY_FLAG_ON; + recvbuffer.assign('0'); + memset(recvbuffer.c_array(), 0, MAX_BUFFER_SIZE); + memcpy(recvbuffer.c_array(), "1234567890", 10); + thread_data->data_buffer_size = MAX_IP_MODULE_BUFFER_SIZE; + thread_data->data_length = MAX_IP_MODULE_BUFFER_SIZE - recvbuffer.size() - 10; + thread_data->data_offset = 0; + thread_data->data_buffer = new char[MAX_IP_MODULE_BUFFER_SIZE]; + memset((thread_data->data_buffer+thread_data->data_offset), 1, thread_data->data_length); + recvlen = 11; + ret = this->handle_client_recv(boost::this_thread::get_id(), recvbuffer, recvlen); + BOOST_CHECK_EQUAL(thread_data->data_state, UNKNOWN); + BOOST_CHECK_EQUAL(thread_data->data_length, MAX_IP_MODULE_BUFFER_SIZE - recvbuffer.size() + 1); + BOOST_CHECK_EQUAL(thread_data->current_message_rest_size,thread_data->data_length); + BOOST_CHECK_EQUAL(ret, SORRYSERVER_CONNECT); + BOOST_CHECK_EQUAL(thread_data->last_status, SORRYSERVER_CONNECT); + session_thread_data_map.clear(); + } + + cout << "[112]--------------------------------------------- " << endl; + //unit_test[112] データ状態がHTTP_STARTの場合 find_http_header_all検索結果が該当なしの場合 + //unit_test[112] データサイズ = データバッファMAXサイズ - 受信バッファサイズの場合 sorry状態以外の場合 + //unit_test[112] データ状態にUNKNOWNを設定する 未送信データサイズにデータサイズを設定する status = REALSERVER_CONNECT + { + thread_data_ptr thread_data(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data; + + thread_data->end_flag = END_FLAG_OFF; + thread_data->data_state = HTTP_START; + thread_data->sorry_flag = SORRY_FLAG_OFF; + recvbuffer.assign('0'); + memset(recvbuffer.c_array(), 0, MAX_BUFFER_SIZE); + memcpy(recvbuffer.c_array(), "1234567890", 10); + thread_data->data_buffer_size = MAX_IP_MODULE_BUFFER_SIZE; + thread_data->data_length = MAX_IP_MODULE_BUFFER_SIZE - recvbuffer.size() - 10; + thread_data->data_offset = 0; + thread_data->data_buffer = new char[MAX_IP_MODULE_BUFFER_SIZE]; + memset((thread_data->data_buffer+thread_data->data_offset), 1, thread_data->data_length); + recvlen = 10; + ret = this->handle_client_recv(boost::this_thread::get_id(), recvbuffer, recvlen); + BOOST_CHECK_EQUAL(thread_data->data_state, UNKNOWN); + BOOST_CHECK_EQUAL(thread_data->data_length, MAX_IP_MODULE_BUFFER_SIZE - recvbuffer.size()); + BOOST_CHECK_EQUAL(thread_data->current_message_rest_size,thread_data->data_length); + BOOST_CHECK_EQUAL(ret, REALSERVER_CONNECT); + BOOST_CHECK_EQUAL(thread_data->last_status, REALSERVER_CONNECT); + session_thread_data_map.clear(); + } + + cout << "[113]--------------------------------------------- " << endl; + //unit_test[113] データ状態がHTTP_STARTの場合 find_http_header_all検索結果が該当なしの場合 + //unit_test[113] データサイズ > データバッファMAXサイズ - 受信バッファサイズの場合 sorry状態以外の場合 + //unit_test[113] データ状態にUNKNOWNを設定する 未送信データサイズにデータサイズを設定する status = REALSERVER_CONNECT + { + thread_data_ptr thread_data(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data; + + thread_data->end_flag = END_FLAG_OFF; + thread_data->data_state = HTTP_START; + thread_data->sorry_flag = SORRY_FLAG_ON; + recvbuffer.assign('0'); + memset(recvbuffer.c_array(), 0, MAX_BUFFER_SIZE); + memcpy(recvbuffer.c_array(), "1234567890", 10); + thread_data->data_buffer_size = MAX_IP_MODULE_BUFFER_SIZE; + thread_data->data_length = MAX_IP_MODULE_BUFFER_SIZE - recvbuffer.size() - 10; + thread_data->data_offset = 0; + thread_data->data_buffer = new char[MAX_IP_MODULE_BUFFER_SIZE]; + memset((thread_data->data_buffer+thread_data->data_offset), 1, thread_data->data_length); + recvlen = 11; + ret = this->handle_client_recv(boost::this_thread::get_id(), recvbuffer, recvlen); + BOOST_CHECK_EQUAL(thread_data->data_state, UNKNOWN); + BOOST_CHECK_EQUAL(thread_data->data_length, MAX_IP_MODULE_BUFFER_SIZE - recvbuffer.size() + 1); + BOOST_CHECK_EQUAL(thread_data->current_message_rest_size,thread_data->data_length); + BOOST_CHECK_EQUAL(ret, SORRYSERVER_CONNECT); + BOOST_CHECK_EQUAL(thread_data->last_status, SORRYSERVER_CONNECT); + session_thread_data_map.clear(); + } + + cout << "[114]--------------------------------------------- " << endl; + //unit_test[114] データ状態がHTTP_STARTの場合 find_http_header_all検索結果が該当なしの場合 データサイズ < データバッファMAXサイズ - 受信バッファサイズの場合 + //unit_test[114] status = CLIENT_RECV + { + thread_data_ptr thread_data(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data; + + thread_data->end_flag = END_FLAG_OFF; + thread_data->data_state = HTTP_START; + recvbuffer.assign('0'); + memset(recvbuffer.c_array(), 0, MAX_BUFFER_SIZE); + memcpy(recvbuffer.c_array(), "1234567890", 10); + thread_data->data_buffer_size = MAX_BUFFER_SIZE; + thread_data->data_length = 10; + thread_data->data_offset = 10; + thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset((thread_data->data_buffer+thread_data->data_offset), 1, thread_data->data_length); + recvlen = 10; + ret = this->handle_client_recv(boost::this_thread::get_id(), recvbuffer, recvlen); + BOOST_CHECK_EQUAL(ret, CLIENT_RECV); + BOOST_CHECK_EQUAL(thread_data->last_status, CLIENT_RECV); + session_thread_data_map.clear(); + } + + cout << "[115]--------------------------------------------- " << endl; + //unit_test[115] データ状態がHTTP_STARTの場合 find_http_header_all検索結果が該当ありの場合 check_http_method_and_versionチェック結果が異常の場合 sorry状態の場合 + //unit_test[115] データ状態にUNKNOWNを設定する 未送信データサイズにデータサイズを設定する status = SORRYSERVER_CONNECT + { + thread_data_ptr thread_data(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data; + thread_data->end_flag = END_FLAG_OFF; + thread_data->data_state = HTTP_START; + thread_data->sorry_flag = SORRY_FLAG_ON; + recvbuffer.assign('0'); + char* http_header_ptr = "GET /index.html HTTP 1.3\r\nHost:172.16.58.240\r\n\r\n"; + size_t http_header_len = strlen(http_header_ptr); + memcpy(recvbuffer.c_array(), http_header_ptr, http_header_len); + thread_data->data_buffer_size = MAX_BUFFER_SIZE; + thread_data->data_length = 10; + thread_data->data_offset = 10; + thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset((thread_data->data_buffer+thread_data->data_offset), 1, thread_data->data_length); + recvlen = http_header_len; + ret = this->handle_client_recv(boost::this_thread::get_id(), recvbuffer, recvlen); + BOOST_CHECK_EQUAL(thread_data->data_state, UNKNOWN); + BOOST_CHECK_EQUAL(thread_data->data_length, 10u + http_header_len); + BOOST_CHECK_EQUAL(thread_data->current_message_rest_size,10u + http_header_len); + BOOST_CHECK_EQUAL(ret, SORRYSERVER_CONNECT); + BOOST_CHECK_EQUAL(thread_data->last_status, SORRYSERVER_CONNECT); + session_thread_data_map.clear(); + } + + cout << "[116]--------------------------------------------- " << endl; + //unit_test[116] データ状態がHTTP_STARTの場合 find_http_header_all検索結果が該当ありの場合 check_http_method_and_versionチェック結果が異常の場合 sorry状態以外の場合 + //unit_test[116] データ状態にUNKNOWNを設定する 未送信データサイズにデータサイズを設定する status = REALSERVER_CONNECT + { + thread_data_ptr thread_data(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data; + + thread_data->end_flag = END_FLAG_OFF; + thread_data->data_state = HTTP_START; + thread_data->sorry_flag = SORRY_FLAG_OFF; + recvbuffer.assign('0'); + char* http_header_ptr = "GET /index.html HTTP 1.3\r\nHost:172.16.58.240\r\n\r\n"; + size_t http_header_len = strlen(http_header_ptr); + memcpy(recvbuffer.c_array(), http_header_ptr, http_header_len); + thread_data->data_buffer_size = MAX_BUFFER_SIZE; + thread_data->data_length = 10; + thread_data->data_offset = 10; + thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset((thread_data->data_buffer+thread_data->data_offset), 1, thread_data->data_length); + recvlen = http_header_len; + ret = this->handle_client_recv(boost::this_thread::get_id(), recvbuffer, recvlen); + BOOST_CHECK_EQUAL(thread_data->data_state, UNKNOWN); + BOOST_CHECK_EQUAL(thread_data->data_length, 10u + http_header_len); + BOOST_CHECK_EQUAL(thread_data->current_message_rest_size,10u + http_header_len); + BOOST_CHECK_EQUAL(ret, REALSERVER_CONNECT); + BOOST_CHECK_EQUAL(thread_data->last_status, REALSERVER_CONNECT); + session_thread_data_map.clear(); + } + + cout << "[117]--------------------------------------------- " << endl; + //unit_test[117] データ状態がHTTP_STARTの場合 find_http_header_all検索結果が該当ありの場合 check_http_method_and_versionチェック結果が正常の場合 + //unit_test[117] find_http_header_content_length content_length検索結果が該当なしの場合 sorry状態の場合 + //unit_test[117] 未送信データサイズにHTTPヘッダサイズを設定する データ状態にHTTP_HEADERを設定する status = SORRYSERVER_CONNECT + { + thread_data_ptr thread_data(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data; + thread_data->end_flag = END_FLAG_OFF; + thread_data->sorry_flag = SORRY_FLAG_ON; + thread_data->data_state = HTTP_START; + recvbuffer.assign('0'); + memset(recvbuffer.c_array(), 0, MAX_BUFFER_SIZE); + memcpy(recvbuffer.c_array(), "GET /index.html HTTP/1.1\r\nHost:172.16.58.240\r\n\r\n12345678", 56); + thread_data->data_buffer_size = MAX_BUFFER_SIZE; + thread_data->data_length = 0; + thread_data->data_offset = 0; + thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset((thread_data->data_buffer+thread_data->data_offset), 1, thread_data->data_length); + recvlen = 100; + ret = this->handle_client_recv(boost::this_thread::get_id(), recvbuffer, recvlen); + BOOST_CHECK_EQUAL(thread_data->data_state, HTTP_HEADER); + BOOST_CHECK_EQUAL(thread_data->current_message_rest_size,48u); + BOOST_CHECK_EQUAL(ret, SORRYSERVER_CONNECT); + BOOST_CHECK_EQUAL(thread_data->last_status, SORRYSERVER_CONNECT); + session_thread_data_map.clear(); + } + cout << "[118]--------------------------------------------- " << endl; + //unit_test[118] データ状態がHTTP_STARTの場合 find_http_header_all検索結果が該当ありの場合 check_http_method_and_versionチェック結果が正常の場合 + //unit_test[118] find_http_header_content_length content_length検索結果が該当なしの場合 sorry状態の場合 + //unit_test[118] 未送信データサイズにHTTPヘッダサイズを設定する データ状態にHTTP_HEADERを設定する status = SORRYSERVER_CONNECT + //\r\n\r\n + { + thread_data_ptr thread_data(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data; + thread_data->end_flag = END_FLAG_OFF; + thread_data->sorry_flag = SORRY_FLAG_ON; + thread_data->data_state = HTTP_START; + recvbuffer.assign('0'); + memset(recvbuffer.c_array(), 0, MAX_BUFFER_SIZE); + char* http_header_ptr = "GET /index.html HTTP/1.1\r\n\r\n12345678"; + size_t http_header_len = strlen(http_header_ptr); + memcpy(recvbuffer.c_array(), http_header_ptr, http_header_len); + thread_data->data_buffer_size = MAX_BUFFER_SIZE; + thread_data->data_length = 0; + thread_data->data_offset = 0; + thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset((thread_data->data_buffer+thread_data->data_offset), 1, thread_data->data_length); + recvlen = 100; + ret = this->handle_client_recv(boost::this_thread::get_id(), recvbuffer, recvlen); + BOOST_CHECK_EQUAL(thread_data->data_state, HTTP_HEADER); + BOOST_CHECK_EQUAL(thread_data->current_message_rest_size,http_header_len-8); + BOOST_CHECK_EQUAL(ret, SORRYSERVER_CONNECT); + BOOST_CHECK_EQUAL(thread_data->last_status, SORRYSERVER_CONNECT); + session_thread_data_map.clear(); + } + + cout << "[119]--------------------------------------------- " << endl; + //unit_test[119] データ状態がHTTP_STARTの場合 find_http_header_all検索結果が該当ありの場合 check_http_method_and_versionチェック結果が正常の場合 + //unit_test[119] find_http_header_content_length content_length検索結果が該当なしの場合 sorry状態以外の場合 + //unit_test[119] 未送信データサイズにHTTPヘッダサイズを設定する データ状態にHTTP_HEADERを設定する status = REALSERVER_CONNECT + { + thread_data_ptr thread_data(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data; + thread_data->end_flag = END_FLAG_OFF; + thread_data->sorry_flag = SORRY_FLAG_OFF; + thread_data->data_state = HTTP_START; + recvbuffer.assign('0'); + memset(recvbuffer.c_array(), 0, MAX_BUFFER_SIZE); + memcpy(recvbuffer.c_array(), "GET /index.html HTTP/1.1\r\nHost:172.16.58.240\r\n\r\n12345678", 56); + thread_data->data_buffer_size = MAX_BUFFER_SIZE; + thread_data->data_length = 0; + thread_data->data_offset = 0; + thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset((thread_data->data_buffer+thread_data->data_offset), 1, thread_data->data_length); + recvlen = 100; + ret = this->handle_client_recv(boost::this_thread::get_id(), recvbuffer, recvlen); + BOOST_CHECK_EQUAL(thread_data->data_state, HTTP_HEADER); + BOOST_CHECK_EQUAL(thread_data->current_message_rest_size,48u); + BOOST_CHECK_EQUAL(ret, REALSERVER_CONNECT); + BOOST_CHECK_EQUAL(thread_data->last_status, REALSERVER_CONNECT); + session_thread_data_map.clear(); + } + cout << "[120]--------------------------------------------- " << endl; + //unit_test[120] データ状態がHTTP_STARTの場合 find_http_header_all検索結果が該当ありの場合 check_http_method_and_versionチェック結果が正常の場合 + //unit_test[120] find_http_header_content_length content_length検索結果が該当なしの場合 sorry状態以外の場合 + //unit_test[120] 未送信データサイズにHTTPヘッダサイズを設定する データ状態にHTTP_HEADERを設定する status = REALSERVER_CONNECT + //\r\n\r\n + { + thread_data_ptr thread_data(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data; + thread_data->end_flag = END_FLAG_OFF; + thread_data->sorry_flag = SORRY_FLAG_OFF; + thread_data->data_state = HTTP_START; + recvbuffer.assign('0'); + memset(recvbuffer.c_array(), 0, MAX_BUFFER_SIZE); + char* http_header_ptr = "GET /index.html HTTP/1.1\r\n\r\n12345678"; + size_t http_header_len = strlen(http_header_ptr); + memcpy(recvbuffer.c_array(), http_header_ptr, http_header_len); + thread_data->data_buffer_size = MAX_BUFFER_SIZE; + thread_data->data_length = 0; + thread_data->data_offset = 0; + thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset((thread_data->data_buffer+thread_data->data_offset), 1, thread_data->data_length); + recvlen = 100; + ret = this->handle_client_recv(boost::this_thread::get_id(), recvbuffer, recvlen); + BOOST_CHECK_EQUAL(thread_data->data_state, HTTP_HEADER); + BOOST_CHECK_EQUAL(thread_data->current_message_rest_size,http_header_len - 8); + BOOST_CHECK_EQUAL(ret, REALSERVER_CONNECT); + BOOST_CHECK_EQUAL(thread_data->last_status, REALSERVER_CONNECT); + session_thread_data_map.clear(); + } + + + cout << "[121]--------------------------------------------- " << endl; + //unit_test[121] データ状態がHTTP_STARTの場合 find_http_header_all検索結果が該当ありの場合 check_http_method_and_versionチェック結果が正常の場合 + //unit_test[121] find_http_header_content_length content_length検索結果が該当ありの場合 sorry状態の場合 + //unit_test[121] 未送信データサイズに「HTTPヘッダサイズ + ContentLength」を設定する データ状態にHTTP_HEADERを設定する status = SORRYSERVER_CONNECT + { + thread_data_ptr thread_data(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data; + thread_data->end_flag = END_FLAG_OFF; + thread_data->sorry_flag = SORRY_FLAG_ON; + thread_data->data_state = HTTP_START; + recvbuffer.assign('0'); + memset(recvbuffer.c_array(), 0, MAX_BUFFER_SIZE); + memcpy(recvbuffer.c_array(), "GET /index.html HTTP/1.1\r\nContent-Length: 100rnHost:172.16.58.240\r\n\r\n12345678", 77); + thread_data->data_buffer_size = MAX_BUFFER_SIZE; + thread_data->data_length = 0; + thread_data->data_offset = 0; + thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset((thread_data->data_buffer+thread_data->data_offset), 1, thread_data->data_length); + recvlen = 100; + ret = this->handle_client_recv(boost::this_thread::get_id(), recvbuffer, recvlen); + BOOST_CHECK_EQUAL(thread_data->data_state, HTTP_HEADER); + BOOST_CHECK_EQUAL(thread_data->current_message_rest_size,69u+100u); + BOOST_CHECK_EQUAL(ret, SORRYSERVER_CONNECT); + BOOST_CHECK_EQUAL(thread_data->last_status, SORRYSERVER_CONNECT); + session_thread_data_map.clear(); + } + + cout << "[122]--------------------------------------------- " << endl; + //unit_test[122] データ状態がHTTP_STARTの場合 find_http_header_all検索結果が該当ありの場合 check_http_method_and_versionチェック結果が正常の場合 + //unit_test[122] find_http_header_content_length content_length検索結果が該当ありの場合 sorry状態以外の場合 + //unit_test[122] 未送信データサイズに「HTTPヘッダサイズ + ContentLength」を設定する データ状態にHTTP_HEADERを設定する status = REALSERVER_CONNECT + { + thread_data_ptr thread_data(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data; + thread_data->end_flag = END_FLAG_OFF; + thread_data->sorry_flag = SORRY_FLAG_OFF; + thread_data->data_state = HTTP_START; + recvbuffer.assign('0'); + memset(recvbuffer.c_array(), 0, MAX_BUFFER_SIZE); + memcpy(recvbuffer.c_array(), "GET /index.html HTTP/1.1\r\nContent-Length: 100rnHost:172.16.58.240\r\n\r\n12345678", 77); + thread_data->data_buffer_size = MAX_BUFFER_SIZE; + thread_data->data_length = 0; + thread_data->data_offset = 0; + thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset((thread_data->data_buffer+thread_data->data_offset), 1, thread_data->data_length); + recvlen = 100; + ret = this->handle_client_recv(boost::this_thread::get_id(), recvbuffer, recvlen); + BOOST_CHECK_EQUAL(thread_data->data_state, HTTP_HEADER); + BOOST_CHECK_EQUAL(thread_data->current_message_rest_size,69u+100u); + BOOST_CHECK_EQUAL(ret, REALSERVER_CONNECT); + BOOST_CHECK_EQUAL(thread_data->last_status, REALSERVER_CONNECT); + session_thread_data_map.clear(); + } + + + cout << "[123]--------------------------------------------- " << endl; + //unit_test[123] データ状態がUNKNOWN sorry状態の場合 未送信データサイズにデータサイズを設定する status = SORRYSERVER_CONNECT + { + thread_data_ptr thread_data(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data; + thread_data->end_flag = END_FLAG_OFF; + thread_data->sorry_flag = SORRY_FLAG_ON; + thread_data->data_state = UNKNOWN; + recvbuffer.assign('0'); + memset(recvbuffer.c_array(), 0, MAX_BUFFER_SIZE); + memcpy(recvbuffer.c_array(), "1234567890", 10); + thread_data->data_buffer_size = MAX_BUFFER_SIZE; + thread_data->data_length = 10; + thread_data->data_offset = 10; + thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset((thread_data->data_buffer+thread_data->data_offset), 1, thread_data->data_length); + recvlen = 100; + ret = this->handle_client_recv(boost::this_thread::get_id(), recvbuffer, recvlen); + BOOST_CHECK_EQUAL(thread_data->current_message_rest_size,110u); + BOOST_CHECK_EQUAL(ret, SORRYSERVER_CONNECT); + BOOST_CHECK_EQUAL(thread_data->last_status, SORRYSERVER_CONNECT); + session_thread_data_map.clear(); + } + + cout << "[124]--------------------------------------------- " << endl; + //unit_test[124] データ状態がUNKNOWN sorry状態以外の場合 未送信データサイズにデータサイズを設定する status = REALSERVER_CONNECT + { + thread_data_ptr thread_data(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data; + thread_data->end_flag = END_FLAG_OFF; + thread_data->sorry_flag = SORRY_FLAG_OFF; + thread_data->data_state = UNKNOWN; + recvbuffer.assign('0'); + memset(recvbuffer.c_array(), 0, MAX_BUFFER_SIZE); + memcpy(recvbuffer.c_array(), "1234567890", 10); + thread_data->data_buffer_size = MAX_BUFFER_SIZE; + thread_data->data_length = 10; + thread_data->data_offset = 10; + thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset((thread_data->data_buffer+thread_data->data_offset), 1, thread_data->data_length); + recvlen = 100; + ret = this->handle_client_recv(boost::this_thread::get_id(), recvbuffer, recvlen); + BOOST_CHECK_EQUAL(thread_data->current_message_rest_size,110u); + BOOST_CHECK_EQUAL(ret, REALSERVER_CONNECT); + BOOST_CHECK_EQUAL(thread_data->last_status, REALSERVER_CONNECT); + session_thread_data_map.clear(); + } + cout << "[125]--------------------------------------------- " << endl; + //unit_test[125] データ状態がHTTP_HEADER sorry状態の場合 status = SORRYSERVER_CONNECT + { + thread_data_ptr thread_data(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data; + thread_data->end_flag = END_FLAG_OFF; + thread_data->sorry_flag = SORRY_FLAG_ON; + thread_data->data_state = HTTP_HEADER; + recvbuffer.assign('0'); + memset(recvbuffer.c_array(), 0, MAX_BUFFER_SIZE); + memcpy(recvbuffer.c_array(), "1234567890", 10); + thread_data->data_buffer_size = MAX_BUFFER_SIZE; + thread_data->data_length = 10; + thread_data->data_offset = 10; + thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset((thread_data->data_buffer+thread_data->data_offset), 1, thread_data->data_length); + recvlen = 100; + ret = this->handle_client_recv(boost::this_thread::get_id(), recvbuffer, recvlen); + BOOST_CHECK_EQUAL(ret, SORRYSERVER_CONNECT); + BOOST_CHECK_EQUAL(thread_data->last_status, SORRYSERVER_CONNECT); + session_thread_data_map.clear(); + } + + cout << "[126]--------------------------------------------- " << endl; + //unit_test[126] データ状態がHTTP_HEADER sorry状態以外の場合 status = REALSERVER_CONNECT + { + thread_data_ptr thread_data(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data; + thread_data->end_flag = END_FLAG_OFF; + thread_data->sorry_flag = SORRY_FLAG_OFF; + thread_data->data_state = HTTP_HEADER; + recvbuffer.assign('0'); + memset(recvbuffer.c_array(), 0, MAX_BUFFER_SIZE); + memcpy(recvbuffer.c_array(), "1234567890", 10); + thread_data->data_buffer_size = MAX_BUFFER_SIZE; + thread_data->data_length = 10; + thread_data->data_offset = 10; + thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset((thread_data->data_buffer+thread_data->data_offset), 1, thread_data->data_length); + recvlen = 100; + ret = this->handle_client_recv(boost::this_thread::get_id(), recvbuffer, recvlen); + BOOST_CHECK_EQUAL(ret, REALSERVER_CONNECT); + BOOST_CHECK_EQUAL(thread_data->last_status, REALSERVER_CONNECT); + session_thread_data_map.clear(); + } + + cout << "[127]--------------------------------------------- " << endl; + //unit_test[127] データ状態がHTTP_BODY sorry状態の場合 status = SORRYSERVER_CONNECT + { + thread_data_ptr thread_data(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data; + thread_data->end_flag = END_FLAG_OFF; + thread_data->sorry_flag = SORRY_FLAG_ON; + thread_data->data_state = HTTP_BODY; + recvbuffer.assign('0'); + memset(recvbuffer.c_array(), 0, MAX_BUFFER_SIZE); + memcpy(recvbuffer.c_array(), "1234567890", 10); + thread_data->data_buffer_size = MAX_BUFFER_SIZE; + thread_data->data_length = 10; + thread_data->data_offset = 10; + thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset((thread_data->data_buffer+thread_data->data_offset), 1, thread_data->data_length); + recvlen = 100; + ret = this->handle_client_recv(boost::this_thread::get_id(), recvbuffer, recvlen); + BOOST_CHECK_EQUAL(ret, SORRYSERVER_CONNECT); + BOOST_CHECK_EQUAL(thread_data->last_status, SORRYSERVER_CONNECT); + session_thread_data_map.clear(); + } + + cout << "[128]--------------------------------------------- " << endl; + //unit_test[128] データ状態がHTTP_BODY sorry状態以外の場合 status = REALSERVER_CONNECT + { + thread_data_ptr thread_data(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data; + thread_data->end_flag = END_FLAG_OFF; + thread_data->sorry_flag = SORRY_FLAG_OFF; + thread_data->data_state = HTTP_BODY; + recvbuffer.assign('0'); + memset(recvbuffer.c_array(), 0, MAX_BUFFER_SIZE); + memcpy(recvbuffer.c_array(), "1234567890", 10); + thread_data->data_buffer_size = MAX_BUFFER_SIZE; + thread_data->data_length = 10; + thread_data->data_offset = 10; + thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset((thread_data->data_buffer+thread_data->data_offset), 1, thread_data->data_length); + recvlen = 100; + ret = this->handle_client_recv(boost::this_thread::get_id(), recvbuffer, recvlen); + BOOST_CHECK_EQUAL(ret, REALSERVER_CONNECT); + BOOST_CHECK_EQUAL(thread_data->last_status, REALSERVER_CONNECT); + session_thread_data_map.clear(); + } + } + + //handle_client_recv_test_thread + void handle_client_recv_test_thread() + { + boost::array recvbuffer; + size_t recvlen = 0; + EVENT_TAG ret; + + cout << "[129]--------------------------------------------- " << endl; + //unit_test[129] データ状態がHTTP_BODY sorry状態以外の場合 status = REALSERVER_CONNECT + { + thread_data_ptr thread_data(new session_thread_data_ip); + { + boost::mutex::scoped_lock sclock(session_thread_data_map_mutex); + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data; + thread_data->end_flag = END_FLAG_OFF; + thread_data->sorry_flag = SORRY_FLAG_OFF; + thread_data->data_state = HTTP_BODY; + recvbuffer.assign('0'); + memset(recvbuffer.c_array(), 0, MAX_BUFFER_SIZE); + memcpy(recvbuffer.c_array(), "1234567890", 10); + thread_data->data_buffer_size = MAX_BUFFER_SIZE; + thread_data->data_length = 10; + thread_data->data_offset = 10; + thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset((thread_data->data_buffer+thread_data->data_offset), 1, thread_data->data_length); + recvlen = 100; + } + ret = this->handle_client_recv(boost::this_thread::get_id(), recvbuffer, recvlen); + { + boost::mutex::scoped_lock sclock(session_thread_data_map_mutex); + BOOST_CHECK_EQUAL(ret, REALSERVER_CONNECT); + BOOST_CHECK_EQUAL(thread_data->last_status, REALSERVER_CONNECT); + session_thread_data_map.erase(boost::this_thread::get_id()); + } + } + } + + //handle_realserver_select(tcp) + void handle_realserver_select_tcp_test() + { + EVENT_TAG ret; + std::string ip_id; + boost::asio::ip::tcp::endpoint rs_endpoint; + boost::asio::ip::tcp::endpoint tmp_endpoint; + boost::asio::ip::tcp::endpoint + ep1(boost::asio::ip::address::from_string("192.168.120.249"), + 12345); + boost::asio::ip::tcp::endpoint ep2(boost::asio::ip::address::from_string("192.168.120.250"), + 12345); + + boost::function ingetloglevel = stb_getloglevel; + boost::function inputLogFatal = stb_putLogFatal; + boost::function inputLogError = stb_putLogError; + boost::function inputLogWarn = stb_putLogWarn; + boost::function inputLogInfo = stb_putLogInfo; + boost::function inputLogDebug = stb_putLogDebug; + int ip_replication_area_size = 10; + char* ip_replication_area_begain = new char[10]; + + boost::asio::ip::tcp::endpoint virtual_service_endpoint; + ip_session_table_entry ip_session_entry_data; + + realserverlist_type rs_list; + rs_list_begin = boost::bind(&get_rs_list_begin, &rs_list); + rs_list_end = boost::bind(&get_rs_list_end, &rs_list); + rs_list_next = boost::bind(&get_rs_list_next, _1); + rs_list_lock = &rslist_lock; + rs_list_unlock = &rslist_unlock; + + + cout << "[130]--------------------------------------------- " << endl; + //unit_test[130] 異常系 functionがなし場合遷移先ステータスにFINALIZEを設定する + //register function + { + tcp_schedule_func_type func_err1 = NULL; + this->register_schedule(func_err1); + boost::asio::ip::tcp::endpoint ep_err1; + + ret = this->handle_realserver_select(boost::this_thread::get_id(), ep_err1); + + //遷移先ステータスを設定する status = FINALIZE + BOOST_CHECK_EQUAL(ret, FINALIZE); + } + + cout << "[131]--------------------------------------------- " << endl; + //unit_test[131] 異常系 session_thread_data_map中にThreadID対応のデータがない + { + this->session_thread_data_map.clear(); + //register function + tcp_schedule_func_type func_cerr2 = &schedule_tcp_determinate; + this->register_schedule(func_cerr2); + this->session_thread_data_map[boost::this_thread::get_id()].reset(); + boost::asio::ip::tcp::endpoint ep_err2; + ret = this->handle_realserver_select(boost::this_thread::get_id(), ep_err2); + + //遷移先ステータスを設定する status = FINALIZE + BOOST_CHECK_EQUAL(ret, FINALIZE); + } + + cout << "[132]--------------------------------------------- " << endl; + //unit_test[132] 異常系 session_thread_data_map中にThreadIDなし場合のテスト + { + + boost::asio::ip::tcp::endpoint ep_err2; + this->session_thread_data_map.clear(); + ret = this->handle_realserver_select(boost::this_thread::get_id(), ep_err2); + + //遷移先ステータスを設定する status = FINALIZE + BOOST_CHECK_EQUAL(ret, FINALIZE); + } + + cout << "[133]--------------------------------------------- " << endl; + //unit_test[133] realserver_connect_failed_count=0の場合 + //unit_test[133] get_endpoint_from_session_data後endpoint = 未決定 + //unit_test[133] schedule_moduleにて振り分け先realserverを未決定 + //unit_test[133] status = CLIENT_DISCONNECT + { + this->session_thread_data_map.clear(); + thread_data_ptr data_ptr(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data_ptr; + tcp_schedule_func_type func_err = &schedule_tcp_nodeterminate; + this->register_schedule(func_err); + data_ptr->realserver_connect_failed_count = 0; + data_ptr->client_endpoint = ep1; + data_ptr->ip_hash = l7vs_ip_service_calc_hash(data_ptr->client_endpoint); + + this->replication_data_processor = new ip_replication_data_processor(ip_replication_area_begain, + ip_replication_area_size, virtual_service_endpoint, ingetloglevel, inputLogFatal, inputLogError, + inputLogWarn, inputLogInfo, inputLogDebug); + this->ip_data_processor = new ip_session_data_processor_stub( + 3600, this->replication_data_processor, ingetloglevel, + inputLogFatal, inputLogError, inputLogWarn, inputLogInfo, + inputLogDebug); + (dynamic_cast(this->ip_data_processor))->write_session_data_stub(data_ptr->ip_hash, ip_session_entry_data); + ret = this->handle_realserver_select(boost::this_thread::get_id(), + rs_endpoint); + + BOOST_CHECK_EQUAL(ret, CLIENT_DISCONNECT); + BOOST_CHECK_EQUAL(data_ptr->last_status, CLIENT_DISCONNECT); + this->session_thread_data_map.clear(); + delete this->replication_data_processor; + delete this->ip_data_processor; + this->replication_data_processor = NULL; + this->ip_data_processor = NULL; + } + + cout << "[134]--------------------------------------------- " << endl; + //unit_test[134] realserver_connect_failed_count=0の場合 + //unit_test[134] get_endpoint_from_session_data後endpoint = 未決定 + //unit_test[134] schedule_moduleにて振り分け先realserverを決定 + //unit_test[134] データ状態がHTTP_STARTの場合 + //unit_test[134] status = CLIENT_RECV + { + this->session_thread_data_map.clear(); + thread_data_ptr data_ptr(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data_ptr; + tcp_schedule_func_type func = &schedule_tcp_determinate; + this->register_schedule(func); + data_ptr->realserver_connect_failed_count = 0; + data_ptr->data_state = HTTP_START; + data_ptr->client_endpoint = ep1; + data_ptr->ip_hash = l7vs_ip_service_calc_hash(data_ptr->client_endpoint); + + this->replication_data_processor = new ip_replication_data_processor(ip_replication_area_begain, + ip_replication_area_size, virtual_service_endpoint, ingetloglevel, inputLogFatal, inputLogError, + inputLogWarn, inputLogInfo, inputLogDebug); + this->ip_data_processor = new ip_session_data_processor_stub( + 3600, this->replication_data_processor, ingetloglevel, + inputLogFatal, inputLogError, inputLogWarn, inputLogInfo, + inputLogDebug); + (dynamic_cast(this->ip_data_processor))->write_session_data_stub(data_ptr->ip_hash, ip_session_entry_data); + ret = this->handle_realserver_select(boost::this_thread::get_id(), + rs_endpoint); + ip_session_table_entry entry = (dynamic_cast(this->ip_data_processor))->get_session_data_stub(data_ptr->ip_hash); + + BOOST_CHECK_EQUAL(entry.rs_endpoint, rs_endpoint); + BOOST_CHECK_EQUAL(entry.last_time, 0); + BOOST_CHECK_EQUAL(ret, CLIENT_RECV); + BOOST_CHECK_EQUAL(data_ptr->last_status, CLIENT_RECV); + this->session_thread_data_map.clear(); + delete this->replication_data_processor; + delete this->ip_data_processor; + this->replication_data_processor = NULL; + this->ip_data_processor = NULL; + + } + + cout << "[135]--------------------------------------------- " << endl; + //unit_test[135] realserver_connect_failed_count=0の場合 + //unit_test[135] get_endpoint_from_session_data後endpoint = 未決定 + //unit_test[135] schedule_moduleにて振り分け先realserverを決定 + //unit_test[135] データ状態がHTTP_HEADERの場合 + //unit_test[135] status =REALSERVER_CONNECT + { + this->session_thread_data_map.clear(); + thread_data_ptr data_ptr(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data_ptr; + tcp_schedule_func_type func = &schedule_tcp_determinate; + this->register_schedule(func); + data_ptr->realserver_connect_failed_count = 0; + data_ptr->data_state = HTTP_HEADER; + data_ptr->client_endpoint = ep1; + data_ptr->ip_hash = l7vs_ip_service_calc_hash(data_ptr->client_endpoint); + this->replication_data_processor = new ip_replication_data_processor(ip_replication_area_begain, + ip_replication_area_size, virtual_service_endpoint, ingetloglevel, inputLogFatal, inputLogError, + inputLogWarn, inputLogInfo, inputLogDebug); + this->ip_data_processor = new ip_session_data_processor_stub( + 3600, this->replication_data_processor, ingetloglevel, + inputLogFatal, inputLogError, inputLogWarn, inputLogInfo, + inputLogDebug); + (dynamic_cast(this->ip_data_processor))->write_session_data_stub(data_ptr->ip_hash, ip_session_entry_data); + ret = this->handle_realserver_select(boost::this_thread::get_id(), + rs_endpoint); + ip_session_table_entry entry = (dynamic_cast(this->ip_data_processor))->get_session_data_stub(data_ptr->ip_hash); + BOOST_CHECK_EQUAL(entry.rs_endpoint, rs_endpoint); + BOOST_CHECK_EQUAL(entry.last_time, 0); + BOOST_CHECK_EQUAL(ret, REALSERVER_CONNECT); + BOOST_CHECK_EQUAL(data_ptr->last_status, REALSERVER_CONNECT); + this->session_thread_data_map.clear(); + delete this->replication_data_processor; + delete this->ip_data_processor; + this->replication_data_processor = NULL; + this->ip_data_processor = NULL; + + } + + cout << "[136]--------------------------------------------- " << endl; + //unit_test[136] realserver_connect_failed_count=0の場合 + //unit_test[136] get_endpoint_from_session_data後endpoint = 未決定 + //unit_test[136] schedule_moduleにて振り分け先realserverを決定 + //unit_test[136] データ状態がHTTP_BODYの場合 + //unit_test[136] status =REALSERVER_CONNECT + { + this->session_thread_data_map.clear(); + thread_data_ptr data_ptr(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data_ptr; + tcp_schedule_func_type func = &schedule_tcp_determinate; + this->register_schedule(func); + data_ptr->realserver_connect_failed_count = 0; + data_ptr->data_state = HTTP_BODY; + data_ptr->client_endpoint = ep1; + data_ptr->ip_hash = l7vs_ip_service_calc_hash(data_ptr->client_endpoint); + this->replication_data_processor = new ip_replication_data_processor(ip_replication_area_begain, + ip_replication_area_size, virtual_service_endpoint, ingetloglevel, inputLogFatal, inputLogError, + inputLogWarn, inputLogInfo, inputLogDebug); + this->ip_data_processor = new ip_session_data_processor_stub( + 3600, this->replication_data_processor, ingetloglevel, + inputLogFatal, inputLogError, inputLogWarn, inputLogInfo, + inputLogDebug); + (dynamic_cast(this->ip_data_processor))->write_session_data_stub(data_ptr->ip_hash, ip_session_entry_data); + ret = this->handle_realserver_select(boost::this_thread::get_id(), + rs_endpoint); + ip_session_table_entry entry = (dynamic_cast(this->ip_data_processor))->get_session_data_stub(data_ptr->ip_hash); + BOOST_CHECK_EQUAL(entry.rs_endpoint, rs_endpoint); + BOOST_CHECK_EQUAL(entry.last_time, 0); + BOOST_CHECK_EQUAL(ret, REALSERVER_CONNECT); + BOOST_CHECK_EQUAL(data_ptr->last_status, REALSERVER_CONNECT); + this->session_thread_data_map.clear(); + delete this->replication_data_processor; + delete this->ip_data_processor; + this->replication_data_processor = NULL; + this->ip_data_processor = NULL; + + } + + cout << "[137]--------------------------------------------- " << endl; + //unit_test[137] realserver_connect_failed_count=0の場合 + //unit_test[137] get_endpoint_from_session_data後endpoint = 未決定 + //unit_test[137] schedule_moduleにて振り分け先realserverを決定 + //unit_test[137] データ状態がUNKNOWNの場合 + //unit_test[137] status =REALSERVER_CONNECT + { + this->session_thread_data_map.clear(); + thread_data_ptr data_ptr(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data_ptr; + tcp_schedule_func_type func = &schedule_tcp_determinate; + this->register_schedule(func); + data_ptr->realserver_connect_failed_count = 0; + data_ptr->data_state = UNKNOWN; + data_ptr->client_endpoint = ep1; + data_ptr->ip_hash = l7vs_ip_service_calc_hash(data_ptr->client_endpoint); + this->replication_data_processor = new ip_replication_data_processor(ip_replication_area_begain, + ip_replication_area_size, virtual_service_endpoint, ingetloglevel, inputLogFatal, inputLogError, + inputLogWarn, inputLogInfo, inputLogDebug); + this->ip_data_processor = new ip_session_data_processor_stub( + 3600, this->replication_data_processor, ingetloglevel, + inputLogFatal, inputLogError, inputLogWarn, inputLogInfo, + inputLogDebug); + (dynamic_cast(this->ip_data_processor))->write_session_data_stub(data_ptr->ip_hash, ip_session_entry_data); + ret = this->handle_realserver_select(boost::this_thread::get_id(), + rs_endpoint); + ip_session_table_entry entry = (dynamic_cast(this->ip_data_processor))->get_session_data_stub(data_ptr->ip_hash); + BOOST_CHECK_EQUAL(entry.rs_endpoint, rs_endpoint); + BOOST_CHECK_EQUAL(entry.last_time, 0); + BOOST_CHECK_EQUAL(ret, REALSERVER_CONNECT); + BOOST_CHECK_EQUAL(data_ptr->last_status, REALSERVER_CONNECT); + this->session_thread_data_map.clear(); + delete this->replication_data_processor; + delete this->ip_data_processor; + this->replication_data_processor = NULL; + this->ip_data_processor = NULL; + } + + cout << "[138]--------------------------------------------- " << endl; + //unit_test[138] realserver_connect_failed_count=0の場合 + //unit_test[138] get_endpoint_from_session_data後endpoint = 決定 + //unit_test[138] rsリストを検索し、realserver endpointの存在チェックしrealserver endpoint が存在する場合 + //unit_test[138] データ状態がHTTP_STARTの場合 + //unit_test[138] status = CLIENT_RECV + { + this->session_thread_data_map.clear(); + thread_data_ptr data_ptr(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data_ptr; + tcp_schedule_func_type func = bind(&schedule_tcp_determinate_config_result, _1, _2, _3, _4, _5, ep2); + this->register_schedule(func); + data_ptr->realserver_connect_failed_count = 0; + data_ptr->client_endpoint = ep1; + data_ptr->ip_hash = l7vs_ip_service_calc_hash(data_ptr->client_endpoint); + data_ptr->data_state = HTTP_START; + this->replication_data_processor = new ip_replication_data_processor(ip_replication_area_begain, + ip_replication_area_size, virtual_service_endpoint, ingetloglevel, inputLogFatal, inputLogError, + inputLogWarn, inputLogInfo, inputLogDebug); + this->ip_data_processor = new ip_session_data_processor_stub( + 3600, this->replication_data_processor, ingetloglevel, + inputLogFatal, inputLogError, inputLogWarn, inputLogInfo, + inputLogDebug); + ip_session_entry_data.rs_endpoint = ep2; + ip_session_entry_data.last_time = 0; + (dynamic_cast(this->ip_data_processor))->write_session_data_stub(data_ptr->ip_hash, ip_session_entry_data); + realserver server; + server.tcp_endpoint = ep2; + rs_list.clear(); + rs_list.push_back(server); + + ret = this->handle_realserver_select(boost::this_thread::get_id(), + rs_endpoint); + ip_session_table_entry entry = (dynamic_cast(this->ip_data_processor))->get_session_data_stub(data_ptr->ip_hash); + BOOST_CHECK_EQUAL(entry.rs_endpoint, rs_endpoint); + BOOST_CHECK_EQUAL(entry.last_time, 0); + BOOST_CHECK_EQUAL(ret, CLIENT_RECV); + BOOST_CHECK_EQUAL(data_ptr->last_status, CLIENT_RECV); + this->session_thread_data_map.clear(); + delete this->replication_data_processor; + delete this->ip_data_processor; + this->replication_data_processor = NULL; + this->ip_data_processor = NULL; + } + + cout << "[139]--------------------------------------------- " << endl; + //unit_test[139] realserver_connect_failed_count=0の場合 + //unit_test[139] get_endpoint_from_session_data後endpoint = 決定 + //unit_test[139] rsリストを検索し、realserver endpointの存在チェックしrealserver endpoint が存在する場合 + //unit_test[139] データ状態がHTTP_HEADERの場合 + //unit_test[139] status = REALSERVER_CONNECT + { + this->session_thread_data_map.clear(); + thread_data_ptr data_ptr(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data_ptr; + tcp_schedule_func_type func = bind(&schedule_tcp_determinate_config_result, _1, _2, _3, _4, _5, ep2); + this->register_schedule(func); + data_ptr->realserver_connect_failed_count = 0; + data_ptr->client_endpoint = ep1; + data_ptr->ip_hash = l7vs_ip_service_calc_hash(data_ptr->client_endpoint); + data_ptr->data_state = HTTP_HEADER; + this->replication_data_processor = new ip_replication_data_processor(ip_replication_area_begain, + ip_replication_area_size, virtual_service_endpoint, ingetloglevel, inputLogFatal, inputLogError, + inputLogWarn, inputLogInfo, inputLogDebug); + this->ip_data_processor = new ip_session_data_processor_stub( + 3600, this->replication_data_processor, ingetloglevel, + inputLogFatal, inputLogError, inputLogWarn, inputLogInfo, + inputLogDebug); + ip_session_entry_data.rs_endpoint = ep2; + ip_session_entry_data.last_time = 0; + (dynamic_cast(this->ip_data_processor))->write_session_data_stub(data_ptr->ip_hash, ip_session_entry_data); + realserver server; + server.tcp_endpoint = ep2; + rs_list.clear(); + rs_list.push_back(server); + ret = this->handle_realserver_select(boost::this_thread::get_id(), + rs_endpoint); + ip_session_table_entry entry = (dynamic_cast(this->ip_data_processor))->get_session_data_stub(data_ptr->ip_hash); + BOOST_CHECK_EQUAL(entry.rs_endpoint, rs_endpoint); + BOOST_CHECK_EQUAL(entry.last_time, 0); + BOOST_CHECK_EQUAL(ret, REALSERVER_CONNECT); + BOOST_CHECK_EQUAL(data_ptr->last_status, REALSERVER_CONNECT); + this->session_thread_data_map.clear(); + delete this->replication_data_processor; + delete this->ip_data_processor; + this->replication_data_processor = NULL; + this->ip_data_processor = NULL; + } + + cout << "[140]--------------------------------------------- " << endl; + //unit_test[140] realserver_connect_failed_count=0の場合 + //unit_test[140] get_endpoint_from_session_data後endpoint = 決定 + //unit_test[140] rsリストを検索し、realserver endpointの存在チェックしrealserver endpoint が存在する場合 + //unit_test[140] データ状態がHTTP_BODYの場合 + //unit_test[140] status = REALSERVER_CONNECT + { + this->session_thread_data_map.clear(); + thread_data_ptr data_ptr(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data_ptr; + tcp_schedule_func_type func = bind(&schedule_tcp_determinate_config_result, _1, _2, _3, _4, _5, ep2); + this->register_schedule(func); + data_ptr->realserver_connect_failed_count = 0; + data_ptr->client_endpoint = ep1; + data_ptr->ip_hash = l7vs_ip_service_calc_hash(data_ptr->client_endpoint); + data_ptr->data_state = HTTP_BODY; + this->replication_data_processor = new ip_replication_data_processor(ip_replication_area_begain, + ip_replication_area_size, virtual_service_endpoint, ingetloglevel, inputLogFatal, inputLogError, + inputLogWarn, inputLogInfo, inputLogDebug); + this->ip_data_processor = new ip_session_data_processor_stub( + 3600, this->replication_data_processor, ingetloglevel, + inputLogFatal, inputLogError, inputLogWarn, inputLogInfo, + inputLogDebug); + ip_session_entry_data.rs_endpoint = ep2; + ip_session_entry_data.last_time = 0; + (dynamic_cast(this->ip_data_processor))->write_session_data_stub(data_ptr->ip_hash, ip_session_entry_data); + realserver server; + server.tcp_endpoint = ep2; + rs_list.clear(); + rs_list.push_back(server); + ret = this->handle_realserver_select(boost::this_thread::get_id(), + rs_endpoint); + ip_session_table_entry entry = (dynamic_cast(this->ip_data_processor))->get_session_data_stub(data_ptr->ip_hash); + BOOST_CHECK_EQUAL(entry.rs_endpoint, rs_endpoint); + BOOST_CHECK_EQUAL(entry.last_time, 0); + BOOST_CHECK_EQUAL(ret, REALSERVER_CONNECT); + BOOST_CHECK_EQUAL(data_ptr->last_status, REALSERVER_CONNECT); + this->session_thread_data_map.clear(); + delete this->replication_data_processor; + delete this->ip_data_processor; + this->replication_data_processor = NULL; + this->ip_data_processor = NULL; + } + cout << "[141]--------------------------------------------- " << endl; + //unit_test[141] realserver_connect_failed_count=0の場合 + //unit_test[141] get_endpoint_from_session_data後endpoint = 決定 + //unit_test[141] rsリストを検索し、realserver endpointの存在チェックしrealserver endpoint が存在する場合 + //unit_test[141] データ状態がUNKNOWNの場合 + //unit_test[141] status = REALSERVER_CONNECT + { + this->session_thread_data_map.clear(); + thread_data_ptr data_ptr(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data_ptr; + tcp_schedule_func_type func = bind(&schedule_tcp_determinate_config_result, _1, _2, _3, _4, _5, ep2); + this->register_schedule(func); + data_ptr->realserver_connect_failed_count = 0; + data_ptr->client_endpoint = ep1; + data_ptr->ip_hash = l7vs_ip_service_calc_hash(data_ptr->client_endpoint); + data_ptr->data_state = UNKNOWN; + this->replication_data_processor = new ip_replication_data_processor(ip_replication_area_begain, + ip_replication_area_size, virtual_service_endpoint, ingetloglevel, inputLogFatal, inputLogError, + inputLogWarn, inputLogInfo, inputLogDebug); + this->ip_data_processor = new ip_session_data_processor_stub( + 3600, this->replication_data_processor, ingetloglevel, + inputLogFatal, inputLogError, inputLogWarn, inputLogInfo, + inputLogDebug); + ip_session_entry_data.rs_endpoint = ep2; + ip_session_entry_data.last_time = 0; + (dynamic_cast(this->ip_data_processor))->write_session_data_stub(data_ptr->ip_hash, ip_session_entry_data); + realserver server; + server.tcp_endpoint = ep2; + rs_list.clear(); + rs_list.push_back(server); + ret = this->handle_realserver_select(boost::this_thread::get_id(), + rs_endpoint); + BOOST_CHECK_EQUAL(ret, REALSERVER_CONNECT); + BOOST_CHECK_EQUAL(data_ptr->last_status, REALSERVER_CONNECT); + this->session_thread_data_map.clear(); + delete this->replication_data_processor; + delete this->ip_data_processor; + this->replication_data_processor = NULL; + this->ip_data_processor = NULL; + } + + cout << "[142]--------------------------------------------- " << endl; + //unit_test[142] realserver_connect_failed_count=0の場合 + //unit_test[142] get_endpoint_from_session_data後endpoint = 決定 + //unit_test[142] rsリストを検索し、realserver endpointの存在チェックしrealserver endpoint が存在しない場合 + //unit_test[142] no rescheduleモード + //unit_test[142] status = CLIENT_DISCONNECT + { + this->session_thread_data_map.clear(); + thread_data_ptr data_ptr(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data_ptr; + tcp_schedule_func_type func = bind(&schedule_tcp_determinate_config_result, _1, _2, _3, _4, _5, ep2); + this->register_schedule(func); + data_ptr->realserver_connect_failed_count = 0; + data_ptr->client_endpoint = ep1; + data_ptr->ip_hash = l7vs_ip_service_calc_hash(data_ptr->client_endpoint); + this->reschedule = 0; + this->replication_data_processor = new ip_replication_data_processor(ip_replication_area_begain, + ip_replication_area_size, virtual_service_endpoint, ingetloglevel, inputLogFatal, inputLogError, + inputLogWarn, inputLogInfo, inputLogDebug); + this->ip_data_processor = new ip_session_data_processor_stub( + 3600, this->replication_data_processor, ingetloglevel, + inputLogFatal, inputLogError, inputLogWarn, inputLogInfo, + inputLogDebug); + ip_session_entry_data.rs_endpoint = ep2; + ip_session_entry_data.last_time = 0; + (dynamic_cast(this->ip_data_processor))->write_session_data_stub(data_ptr->ip_hash, ip_session_entry_data); + rs_list.clear(); + ret = this->handle_realserver_select(boost::this_thread::get_id(), + rs_endpoint); + BOOST_CHECK_EQUAL(ret, CLIENT_DISCONNECT); + BOOST_CHECK_EQUAL(data_ptr->last_status, CLIENT_DISCONNECT); + this->session_thread_data_map.clear(); + delete this->replication_data_processor; + delete this->ip_data_processor; + this->replication_data_processor = NULL; + this->ip_data_processor = NULL; + } + + cout << "[143]--------------------------------------------- " << endl; + //unit_test[143] realserver_connect_failed_count=0の場合 + //unit_test[143] get_endpoint_from_session_data後endpoint = 決定 + //unit_test[143] rsリストを検索し、realserver endpointの存在チェックしrealserver endpoint が存在しない場合 + //unit_test[143] rescheduleモード + //unit_test[143] schedule_moduleにて振り分け先realserverを未決定する + //unit_test[143] status = CLIENT_DISCONNECT + { + this->session_thread_data_map.clear(); + thread_data_ptr data_ptr(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data_ptr; + tcp_schedule_func_type func = &schedule_tcp_nodeterminate; + this->register_schedule(func); + data_ptr->realserver_connect_failed_count = 0; + data_ptr->client_endpoint = ep1; + data_ptr->ip_hash = l7vs_ip_service_calc_hash(data_ptr->client_endpoint); + this->reschedule = 1; + this->replication_data_processor = new ip_replication_data_processor(ip_replication_area_begain, + ip_replication_area_size, virtual_service_endpoint, ingetloglevel, inputLogFatal, inputLogError, + inputLogWarn, inputLogInfo, inputLogDebug); + this->ip_data_processor = new ip_session_data_processor_stub( + 3600, this->replication_data_processor, ingetloglevel, + inputLogFatal, inputLogError, inputLogWarn, inputLogInfo, + inputLogDebug); + ip_session_entry_data.rs_endpoint = ep2; + ip_session_entry_data.last_time = 0; + (dynamic_cast(this->ip_data_processor))->write_session_data_stub(data_ptr->ip_hash, ip_session_entry_data); + rs_list.clear(); + ret = this->handle_realserver_select(boost::this_thread::get_id(), + rs_endpoint); + BOOST_CHECK_EQUAL(ret, CLIENT_DISCONNECT); + BOOST_CHECK_EQUAL(data_ptr->last_status, CLIENT_DISCONNECT); + this->session_thread_data_map.clear(); + delete this->replication_data_processor; + delete this->ip_data_processor; + this->replication_data_processor = NULL; + this->ip_data_processor = NULL; + } + + cout << "[144]--------------------------------------------- " << endl; + //unit_test[144] realserver_connect_failed_count=0の場合 + //unit_test[144] get_endpoint_from_session_data後endpoint = 決定 + //unit_test[144] rsリストを検索し、realserver endpointの存在チェックしrealserver endpoint が存在しない場合 + //unit_test[144] rescheduleモード + //unit_test[144] schedule_moduleにて振り分け先realserverを決定する + //unit_test[144] データ状態がHTTP_STARTの場合 + //unit_test[144] status = CLIENT_RECV + { + this->session_thread_data_map.clear(); + thread_data_ptr data_ptr(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data_ptr; + tcp_schedule_func_type func = &schedule_tcp_determinate; + this->register_schedule(func); + data_ptr->realserver_connect_failed_count = 0; + data_ptr->client_endpoint = ep1; + data_ptr->ip_hash = l7vs_ip_service_calc_hash(data_ptr->client_endpoint); + data_ptr->data_state = HTTP_START; + this->reschedule = 1; + this->replication_data_processor = new ip_replication_data_processor(ip_replication_area_begain, + ip_replication_area_size, virtual_service_endpoint, ingetloglevel, inputLogFatal, inputLogError, + inputLogWarn, inputLogInfo, inputLogDebug); + this->ip_data_processor = new ip_session_data_processor_stub( + 3600, this->replication_data_processor, ingetloglevel, + inputLogFatal, inputLogError, inputLogWarn, inputLogInfo, + inputLogDebug); + ip_session_entry_data.rs_endpoint = ep2; + ip_session_entry_data.last_time = 0; + (dynamic_cast(this->ip_data_processor))->write_session_data_stub(data_ptr->ip_hash, ip_session_entry_data); + rs_list.clear(); + ret = this->handle_realserver_select(boost::this_thread::get_id(), + rs_endpoint); + ip_session_table_entry entry = (dynamic_cast(this->ip_data_processor))->get_session_data_stub(data_ptr->ip_hash); + BOOST_CHECK_EQUAL(entry.rs_endpoint, rs_endpoint); + BOOST_CHECK_EQUAL(entry.last_time, 0); + BOOST_CHECK_EQUAL(ret, CLIENT_RECV); + BOOST_CHECK_EQUAL(data_ptr->last_status, CLIENT_RECV); + this->session_thread_data_map.clear(); + delete this->replication_data_processor; + delete this->ip_data_processor; + this->replication_data_processor = NULL; + this->ip_data_processor = NULL; + } + + cout << "[145]--------------------------------------------- " << endl; + //unit_test[145] realserver_connect_failed_count=0の場合 + //unit_test[145] get_endpoint_from_session_data後endpoint = 決定 + //unit_test[145] rsリストを検索し、realserver endpointの存在チェックしrealserver endpoint が存在しない場合 + //unit_test[145] rescheduleモード + //unit_test[145] schedule_moduleにて振り分け先realserverを決定する + //unit_test[145] データ状態がHTTP_HEADERの場合 + //unit_test[145] status = REALSERVER_CONNECT + { + this->session_thread_data_map.clear(); + thread_data_ptr data_ptr(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data_ptr; + tcp_schedule_func_type func = &schedule_tcp_determinate; + this->register_schedule(func); + data_ptr->realserver_connect_failed_count = 0; + data_ptr->client_endpoint = ep1; + data_ptr->ip_hash = l7vs_ip_service_calc_hash(data_ptr->client_endpoint); + data_ptr->data_state = HTTP_HEADER; + this->reschedule = 1; + this->replication_data_processor = new ip_replication_data_processor(ip_replication_area_begain, + ip_replication_area_size, virtual_service_endpoint, ingetloglevel, inputLogFatal, inputLogError, + inputLogWarn, inputLogInfo, inputLogDebug); + this->ip_data_processor = new ip_session_data_processor_stub( + 3600, this->replication_data_processor, ingetloglevel, + inputLogFatal, inputLogError, inputLogWarn, inputLogInfo, + inputLogDebug); + ip_session_entry_data.rs_endpoint = ep2; + ip_session_entry_data.last_time = 0; + (dynamic_cast(this->ip_data_processor))->write_session_data_stub(data_ptr->ip_hash, ip_session_entry_data); + rs_list.clear(); + ret = this->handle_realserver_select(boost::this_thread::get_id(), + rs_endpoint); + ip_session_table_entry entry = (dynamic_cast(this->ip_data_processor))->get_session_data_stub(data_ptr->ip_hash); + BOOST_CHECK_EQUAL(entry.rs_endpoint, rs_endpoint); + BOOST_CHECK_EQUAL(entry.last_time, 0); + BOOST_CHECK_EQUAL(ret, REALSERVER_CONNECT); + BOOST_CHECK_EQUAL(data_ptr->last_status, REALSERVER_CONNECT); + this->session_thread_data_map.clear(); + delete this->replication_data_processor; + delete this->ip_data_processor; + this->replication_data_processor = NULL; + this->ip_data_processor = NULL; + } + + cout << "[146]--------------------------------------------- " << endl; + //unit_test[146] realserver_connect_failed_count=0の場合 + //unit_test[146] get_endpoint_from_session_data後endpoint = 決定 + //unit_test[146] rsリストを検索し、realserver endpointの存在チェックしrealserver endpoint が存在しない場合 + //unit_test[146] rescheduleモード + //unit_test[146] schedule_moduleにて振り分け先realserverを決定する + //unit_test[146] データ状態がHTTP_BODYの場合 + //unit_test[146] status = REALSERVER_CONNECT + { + this->session_thread_data_map.clear(); + thread_data_ptr data_ptr(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data_ptr; + tcp_schedule_func_type func = &schedule_tcp_determinate; + this->register_schedule(func); + data_ptr->realserver_connect_failed_count = 0; + data_ptr->client_endpoint = ep1; + data_ptr->ip_hash = l7vs_ip_service_calc_hash(data_ptr->client_endpoint); + data_ptr->data_state = HTTP_BODY; + this->reschedule = 1; + this->replication_data_processor = new ip_replication_data_processor(ip_replication_area_begain, + ip_replication_area_size, virtual_service_endpoint, ingetloglevel, inputLogFatal, inputLogError, + inputLogWarn, inputLogInfo, inputLogDebug); + this->ip_data_processor = new ip_session_data_processor_stub( + 3600, this->replication_data_processor, ingetloglevel, + inputLogFatal, inputLogError, inputLogWarn, inputLogInfo, + inputLogDebug); + ip_session_entry_data.rs_endpoint = ep2; + ip_session_entry_data.last_time = 0; + (dynamic_cast(this->ip_data_processor))->write_session_data_stub(data_ptr->ip_hash, ip_session_entry_data); + rs_list.clear(); + ret = this->handle_realserver_select(boost::this_thread::get_id(), + rs_endpoint); + ip_session_table_entry entry = (dynamic_cast(this->ip_data_processor))->get_session_data_stub(data_ptr->ip_hash); + BOOST_CHECK_EQUAL(entry.rs_endpoint, rs_endpoint); + BOOST_CHECK_EQUAL(entry.last_time, 0); + BOOST_CHECK_EQUAL(ret, REALSERVER_CONNECT); + BOOST_CHECK_EQUAL(data_ptr->last_status, REALSERVER_CONNECT); + this->session_thread_data_map.clear(); + delete this->replication_data_processor; + delete this->ip_data_processor; + this->replication_data_processor = NULL; + this->ip_data_processor = NULL; + } + + cout << "[147]--------------------------------------------- " << endl; + //unit_test[147] realserver_connect_failed_count=0の場合 + //unit_test[147] get_endpoint_from_session_data後endpoint = 決定 + //unit_test[147] rsリストを検索し、realserver endpointの存在チェックしrealserver endpoint が存在しない場合 + //unit_test[147] rescheduleモード + //unit_test[147] schedule_moduleにて振り分け先realserverを決定する + //unit_test[147] データ状態がUNKNOWNの場合 + //unit_test[147] status = REALSERVER_CONNECT + { + this->session_thread_data_map.clear(); + thread_data_ptr data_ptr(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data_ptr; + tcp_schedule_func_type func = &schedule_tcp_determinate; + this->register_schedule(func); + data_ptr->realserver_connect_failed_count = 0; + data_ptr->client_endpoint = ep1; + data_ptr->ip_hash = l7vs_ip_service_calc_hash(data_ptr->client_endpoint); + data_ptr->data_state = UNKNOWN; + this->reschedule = 1; + this->replication_data_processor = new ip_replication_data_processor(ip_replication_area_begain, + ip_replication_area_size, virtual_service_endpoint, ingetloglevel, inputLogFatal, inputLogError, + inputLogWarn, inputLogInfo, inputLogDebug); + this->ip_data_processor = new ip_session_data_processor_stub( + 3600, this->replication_data_processor, ingetloglevel, + inputLogFatal, inputLogError, inputLogWarn, inputLogInfo, + inputLogDebug); + ip_session_entry_data.rs_endpoint = ep2; + ip_session_entry_data.last_time = 0; + (dynamic_cast(this->ip_data_processor))->write_session_data_stub(data_ptr->ip_hash, ip_session_entry_data); + rs_list.clear(); + ret = this->handle_realserver_select(boost::this_thread::get_id(), + rs_endpoint); + ip_session_table_entry entry = (dynamic_cast(this->ip_data_processor))->get_session_data_stub(data_ptr->ip_hash); + BOOST_CHECK_EQUAL(entry.rs_endpoint, rs_endpoint); + BOOST_CHECK_EQUAL(entry.last_time, 0); + BOOST_CHECK_EQUAL(ret, REALSERVER_CONNECT); + BOOST_CHECK_EQUAL(data_ptr->last_status, REALSERVER_CONNECT); + this->session_thread_data_map.clear(); + delete this->replication_data_processor; + delete this->ip_data_processor; + this->replication_data_processor = NULL; + this->ip_data_processor = NULL; + } + + + cout << "[148]--------------------------------------------- " << endl; + //unit_test[148] realserver_connect_failed_count=-1の場合 + //unit_test[148] get_endpoint_from_session_data後endpoint = 未決定 + //unit_test[148] schedule_moduleにて振り分け先realserverを未決定 + //unit_test[148] status = CLIENT_DISCONNECT + { + this->session_thread_data_map.clear(); + thread_data_ptr data_ptr(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data_ptr; + tcp_schedule_func_type func_err = &schedule_tcp_nodeterminate; + this->register_schedule(func_err); + data_ptr->realserver_connect_failed_count = -1; + data_ptr->client_endpoint = ep1; + data_ptr->ip_hash = l7vs_ip_service_calc_hash(data_ptr->client_endpoint); + + this->replication_data_processor = new ip_replication_data_processor(ip_replication_area_begain, + ip_replication_area_size, virtual_service_endpoint, ingetloglevel, inputLogFatal, inputLogError, + inputLogWarn, inputLogInfo, inputLogDebug); + this->ip_data_processor = new ip_session_data_processor_stub( + 3600, this->replication_data_processor, ingetloglevel, + inputLogFatal, inputLogError, inputLogWarn, inputLogInfo, + inputLogDebug); + (dynamic_cast(this->ip_data_processor))->write_session_data_stub(data_ptr->ip_hash, ip_session_entry_data); + ret = this->handle_realserver_select(boost::this_thread::get_id(), + rs_endpoint); + BOOST_CHECK_EQUAL(ret, CLIENT_DISCONNECT); + BOOST_CHECK_EQUAL(data_ptr->last_status, CLIENT_DISCONNECT); + this->session_thread_data_map.clear(); + delete this->replication_data_processor; + delete this->ip_data_processor; + this->replication_data_processor = NULL; + this->ip_data_processor = NULL; + } + + cout << "[149]--------------------------------------------- " << endl; + //unit_test[149] realserver_connect_failed_count=-1の場合 + //unit_test[149] get_endpoint_from_session_data後endpoint = 未決定 + //unit_test[149] schedule_moduleにて振り分け先realserverを決定 + //unit_test[149] データ状態がHTTP_STARTの場合 + //unit_test[149] status = CLIENT_RECV + { + this->session_thread_data_map.clear(); + thread_data_ptr data_ptr(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data_ptr; + tcp_schedule_func_type func = &schedule_tcp_determinate; + this->register_schedule(func); + data_ptr->realserver_connect_failed_count = -1; + data_ptr->data_state = HTTP_START; + data_ptr->client_endpoint = ep1; + data_ptr->ip_hash = l7vs_ip_service_calc_hash(data_ptr->client_endpoint); + + this->replication_data_processor = new ip_replication_data_processor(ip_replication_area_begain, + ip_replication_area_size, virtual_service_endpoint, ingetloglevel, inputLogFatal, inputLogError, + inputLogWarn, inputLogInfo, inputLogDebug); + this->ip_data_processor = new ip_session_data_processor_stub( + 3600, this->replication_data_processor, ingetloglevel, + inputLogFatal, inputLogError, inputLogWarn, inputLogInfo, + inputLogDebug); + (dynamic_cast(this->ip_data_processor))->write_session_data_stub(data_ptr->ip_hash, ip_session_entry_data); + ret = this->handle_realserver_select(boost::this_thread::get_id(), + rs_endpoint); + ip_session_table_entry entry = (dynamic_cast(this->ip_data_processor))->get_session_data_stub(data_ptr->ip_hash); + BOOST_CHECK_EQUAL(entry.rs_endpoint, rs_endpoint); + BOOST_CHECK_EQUAL(entry.last_time, 0); + BOOST_CHECK_EQUAL(ret, CLIENT_RECV); + BOOST_CHECK_EQUAL(data_ptr->last_status, CLIENT_RECV); + this->session_thread_data_map.clear(); + delete this->replication_data_processor; + delete this->ip_data_processor; + this->replication_data_processor = NULL; + this->ip_data_processor = NULL; + } + + cout << "[150]--------------------------------------------- " << endl; + //unit_test[150] realserver_connect_failed_count=-1の場合 + //unit_test[150] get_endpoint_from_session_data後endpoint = 未決定 + //unit_test[150] schedule_moduleにて振り分け先realserverを決定 + //unit_test[150] データ状態がHTTP_HEADERの場合 + //unit_test[150] status =REALSERVER_CONNECT + { + this->session_thread_data_map.clear(); + thread_data_ptr data_ptr(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data_ptr; + tcp_schedule_func_type func = &schedule_tcp_determinate; + this->register_schedule(func); + data_ptr->realserver_connect_failed_count = -1; + data_ptr->data_state = HTTP_HEADER; + data_ptr->client_endpoint = ep1; + data_ptr->ip_hash = l7vs_ip_service_calc_hash(data_ptr->client_endpoint); + this->replication_data_processor = new ip_replication_data_processor(ip_replication_area_begain, + ip_replication_area_size, virtual_service_endpoint, ingetloglevel, inputLogFatal, inputLogError, + inputLogWarn, inputLogInfo, inputLogDebug); + this->ip_data_processor = new ip_session_data_processor_stub( + 3600, this->replication_data_processor, ingetloglevel, + inputLogFatal, inputLogError, inputLogWarn, inputLogInfo, + inputLogDebug); + (dynamic_cast(this->ip_data_processor))->write_session_data_stub(data_ptr->ip_hash, ip_session_entry_data); + ret = this->handle_realserver_select(boost::this_thread::get_id(), + rs_endpoint); + ip_session_table_entry entry = (dynamic_cast(this->ip_data_processor))->get_session_data_stub(data_ptr->ip_hash); + BOOST_CHECK_EQUAL(entry.rs_endpoint, rs_endpoint); + BOOST_CHECK_EQUAL(entry.last_time, 0); + BOOST_CHECK_EQUAL(ret, REALSERVER_CONNECT); + BOOST_CHECK_EQUAL(data_ptr->last_status, REALSERVER_CONNECT); + this->session_thread_data_map.clear(); + delete this->replication_data_processor; + delete this->ip_data_processor; + this->replication_data_processor = NULL; + this->ip_data_processor = NULL; + } + + cout << "[151]--------------------------------------------- " << endl; + //unit_test[151] realserver_connect_failed_count=-1の場合 + //unit_test[151] get_endpoint_from_session_data後endpoint = 未決定 + //unit_test[151] schedule_moduleにて振り分け先realserverを決定 + //unit_test[151] データ状態がHTTP_BODYの場合 + //unit_test[151] status =REALSERVER_CONNECT + { + this->session_thread_data_map.clear(); + thread_data_ptr data_ptr(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data_ptr; + tcp_schedule_func_type func = &schedule_tcp_determinate; + this->register_schedule(func); + data_ptr->realserver_connect_failed_count = -1; + data_ptr->data_state = HTTP_BODY; + data_ptr->client_endpoint = ep1; + data_ptr->ip_hash = l7vs_ip_service_calc_hash(data_ptr->client_endpoint); + // install_stb_replication_func(); + this->replication_data_processor = new ip_replication_data_processor(ip_replication_area_begain, + ip_replication_area_size, virtual_service_endpoint, ingetloglevel, inputLogFatal, inputLogError, + inputLogWarn, inputLogInfo, inputLogDebug); + this->ip_data_processor = new ip_session_data_processor_stub( + 3600, this->replication_data_processor, ingetloglevel, + inputLogFatal, inputLogError, inputLogWarn, inputLogInfo, + inputLogDebug); + (dynamic_cast(this->ip_data_processor))->write_session_data_stub(data_ptr->ip_hash, ip_session_entry_data); + ret = this->handle_realserver_select(boost::this_thread::get_id(), + rs_endpoint); + ip_session_table_entry entry = (dynamic_cast(this->ip_data_processor))->get_session_data_stub(data_ptr->ip_hash); + BOOST_CHECK_EQUAL(entry.rs_endpoint, rs_endpoint); + BOOST_CHECK_EQUAL(entry.last_time, 0); + BOOST_CHECK_EQUAL(ret, REALSERVER_CONNECT); + BOOST_CHECK_EQUAL(data_ptr->last_status, REALSERVER_CONNECT); + this->session_thread_data_map.clear(); + delete this->replication_data_processor; + delete this->ip_data_processor; + this->replication_data_processor = NULL; + this->ip_data_processor = NULL; + } + + cout << "[152]--------------------------------------------- " << endl; + //unit_test[152] realserver_connect_failed_count=-1の場合 + //unit_test[152] get_endpoint_from_session_data後endpoint = 未決定 + //unit_test[152] schedule_moduleにて振り分け先realserverを決定 + //unit_test[152] データ状態がUNKNOWNの場合 + //unit_test[152] status =REALSERVER_CONNECT + { + this->session_thread_data_map.clear(); + thread_data_ptr data_ptr(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data_ptr; + tcp_schedule_func_type func = &schedule_tcp_determinate; + this->register_schedule(func); + data_ptr->realserver_connect_failed_count = -1; + data_ptr->data_state = UNKNOWN; + data_ptr->client_endpoint = ep1; + data_ptr->ip_hash = l7vs_ip_service_calc_hash(data_ptr->client_endpoint); + this->replication_data_processor = new ip_replication_data_processor(ip_replication_area_begain, + ip_replication_area_size, virtual_service_endpoint, ingetloglevel, inputLogFatal, inputLogError, + inputLogWarn, inputLogInfo, inputLogDebug); + this->ip_data_processor = new ip_session_data_processor_stub( + 3600, this->replication_data_processor, ingetloglevel, + inputLogFatal, inputLogError, inputLogWarn, inputLogInfo, + inputLogDebug); + (dynamic_cast(this->ip_data_processor))->write_session_data_stub(data_ptr->ip_hash, ip_session_entry_data); + ret = this->handle_realserver_select(boost::this_thread::get_id(), + rs_endpoint); + ip_session_table_entry entry = (dynamic_cast(this->ip_data_processor))->get_session_data_stub(data_ptr->ip_hash); + BOOST_CHECK_EQUAL(entry.rs_endpoint, rs_endpoint); + BOOST_CHECK_EQUAL(entry.last_time, 0); + BOOST_CHECK_EQUAL(ret, REALSERVER_CONNECT); + BOOST_CHECK_EQUAL(data_ptr->last_status, REALSERVER_CONNECT); + this->session_thread_data_map.clear(); + delete this->replication_data_processor; + delete this->ip_data_processor; + this->replication_data_processor = NULL; + this->ip_data_processor = NULL; + } + + cout << "[153]--------------------------------------------- " << endl; + //unit_test[153] realserver_connect_failed_count=-1の場合 + //unit_test[153] get_endpoint_from_session_data後endpoint = 決定 + //unit_test[153] rsリストを検索し、realserver endpointの存在チェックしrealserver endpoint が存在する場合 + //unit_test[153] データ状態がHTTP_STARTの場合 + //unit_test[153] status = CLIENT_RECV + { + this->session_thread_data_map.clear(); + thread_data_ptr data_ptr(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data_ptr; + tcp_schedule_func_type func = bind(&schedule_tcp_determinate_config_result, _1, _2, _3, _4, _5, ep2); + this->register_schedule(func); + data_ptr->realserver_connect_failed_count = -1; + data_ptr->client_endpoint = ep1; + data_ptr->ip_hash = l7vs_ip_service_calc_hash(data_ptr->client_endpoint); + data_ptr->data_state = HTTP_START; + this->replication_data_processor = new ip_replication_data_processor(ip_replication_area_begain, + ip_replication_area_size, virtual_service_endpoint, ingetloglevel, inputLogFatal, inputLogError, + inputLogWarn, inputLogInfo, inputLogDebug); + this->ip_data_processor = new ip_session_data_processor_stub( + 3600, this->replication_data_processor, ingetloglevel, + inputLogFatal, inputLogError, inputLogWarn, inputLogInfo, + inputLogDebug); + ip_session_entry_data.rs_endpoint = ep2; + ip_session_entry_data.last_time = 0; + (dynamic_cast(this->ip_data_processor))->write_session_data_stub(data_ptr->ip_hash, ip_session_entry_data); + realserver server; + server.tcp_endpoint = ep2; + rs_list.clear(); + rs_list.push_back(server); + ret = this->handle_realserver_select(boost::this_thread::get_id(), + rs_endpoint); + ip_session_table_entry entry = (dynamic_cast(this->ip_data_processor))->get_session_data_stub(data_ptr->ip_hash); + BOOST_CHECK_EQUAL(entry.rs_endpoint, rs_endpoint); + BOOST_CHECK_EQUAL(entry.last_time, 0); + BOOST_CHECK_EQUAL(ret, CLIENT_RECV); + BOOST_CHECK_EQUAL(data_ptr->last_status, CLIENT_RECV); + this->session_thread_data_map.clear(); + delete this->replication_data_processor; + delete this->ip_data_processor; + this->replication_data_processor = NULL; + this->ip_data_processor = NULL; + } + + cout << "[154]--------------------------------------------- " << endl; + //unit_test[154] realserver_connect_failed_count=-1の場合 + //unit_test[154] get_endpoint_from_session_data後endpoint = 決定 + //unit_test[154] rsリストを検索し、realserver endpointの存在チェックしrealserver endpoint が存在する場合 + //unit_test[154] データ状態がHTTP_HEADERの場合 + //unit_test[154] status = REALSERVER_CONNECT + { + this->session_thread_data_map.clear(); + thread_data_ptr data_ptr(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data_ptr; + tcp_schedule_func_type func = bind(&schedule_tcp_determinate_config_result, _1, _2, _3, _4, _5, ep2); + this->register_schedule(func); + data_ptr->realserver_connect_failed_count = -1; + data_ptr->client_endpoint = ep1; + data_ptr->ip_hash = l7vs_ip_service_calc_hash(data_ptr->client_endpoint); + data_ptr->data_state = HTTP_HEADER; + this->replication_data_processor = new ip_replication_data_processor(ip_replication_area_begain, + ip_replication_area_size, virtual_service_endpoint, ingetloglevel, inputLogFatal, inputLogError, + inputLogWarn, inputLogInfo, inputLogDebug); + this->ip_data_processor = new ip_session_data_processor_stub( + 3600, this->replication_data_processor, ingetloglevel, + inputLogFatal, inputLogError, inputLogWarn, inputLogInfo, + inputLogDebug); + ip_session_entry_data.rs_endpoint = ep2; + ip_session_entry_data.last_time = 0; + (dynamic_cast(this->ip_data_processor))->write_session_data_stub(data_ptr->ip_hash, ip_session_entry_data); + realserver server; + server.tcp_endpoint = ep2; + rs_list.clear(); + rs_list.push_back(server); + ret = this->handle_realserver_select(boost::this_thread::get_id(), + rs_endpoint); + ip_session_table_entry entry = (dynamic_cast(this->ip_data_processor))->get_session_data_stub(data_ptr->ip_hash); + BOOST_CHECK_EQUAL(entry.rs_endpoint, rs_endpoint); + BOOST_CHECK_EQUAL(entry.last_time, 0); + BOOST_CHECK_EQUAL(ret, REALSERVER_CONNECT); + BOOST_CHECK_EQUAL(data_ptr->last_status, REALSERVER_CONNECT); + this->session_thread_data_map.clear(); + delete this->replication_data_processor; + delete this->ip_data_processor; + this->replication_data_processor = NULL; + this->ip_data_processor = NULL; + } + + cout << "[155]--------------------------------------------- " << endl; + //unit_test[155] realserver_connect_failed_count=-1の場合 + //unit_test[155] get_endpoint_from_session_data後endpoint = 決定 + //unit_test[155] rsリストを検索し、realserver endpointの存在チェックしrealserver endpoint が存在する場合 + //unit_test[155] データ状態がHTTP_BODYの場合 + //unit_test[155] status = REALSERVER_CONNECT + { + this->session_thread_data_map.clear(); + thread_data_ptr data_ptr(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data_ptr; + tcp_schedule_func_type func = bind(&schedule_tcp_determinate_config_result, _1, _2, _3, _4, _5, ep2); + this->register_schedule(func); + data_ptr->realserver_connect_failed_count = -1; + data_ptr->client_endpoint = ep1; + data_ptr->ip_hash = l7vs_ip_service_calc_hash(data_ptr->client_endpoint); + data_ptr->data_state = HTTP_BODY; + this->replication_data_processor = new ip_replication_data_processor(ip_replication_area_begain, + ip_replication_area_size, virtual_service_endpoint, ingetloglevel, inputLogFatal, inputLogError, + inputLogWarn, inputLogInfo, inputLogDebug); + this->ip_data_processor = new ip_session_data_processor_stub( + 3600, this->replication_data_processor, ingetloglevel, + inputLogFatal, inputLogError, inputLogWarn, inputLogInfo, + inputLogDebug); + ip_session_entry_data.rs_endpoint = ep2; + ip_session_entry_data.last_time = 0; + (dynamic_cast(this->ip_data_processor))->write_session_data_stub(data_ptr->ip_hash, ip_session_entry_data); + realserver server; + server.tcp_endpoint = ep2; + rs_list.clear(); + rs_list.push_back(server); + ret = this->handle_realserver_select(boost::this_thread::get_id(), + rs_endpoint); + ip_session_table_entry entry = (dynamic_cast(this->ip_data_processor))->get_session_data_stub(data_ptr->ip_hash); + BOOST_CHECK_EQUAL(entry.rs_endpoint, rs_endpoint); + BOOST_CHECK_EQUAL(entry.last_time, 0); + BOOST_CHECK_EQUAL(ret, REALSERVER_CONNECT); + BOOST_CHECK_EQUAL(data_ptr->last_status, REALSERVER_CONNECT); + this->session_thread_data_map.clear(); + delete this->replication_data_processor; + delete this->ip_data_processor; + this->replication_data_processor = NULL; + this->ip_data_processor = NULL; + } + cout << "[156]--------------------------------------------- " << endl; + //unit_test[156] realserver_connect_failed_count=-1の場合 + //unit_test[156] get_endpoint_from_session_data後endpoint = 決定 + //unit_test[156] rsリストを検索し、realserver endpointの存在チェックしrealserver endpoint が存在する場合 + //unit_test[156] データ状態がUNKNOWNの場合 + //unit_test[156] status = REALSERVER_CONNECT + { + this->session_thread_data_map.clear(); + thread_data_ptr data_ptr(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data_ptr; + tcp_schedule_func_type func = bind(&schedule_tcp_determinate_config_result, _1, _2, _3, _4, _5, ep2); + this->register_schedule(func); + data_ptr->realserver_connect_failed_count = -1; + data_ptr->client_endpoint = ep1; + data_ptr->ip_hash = l7vs_ip_service_calc_hash(data_ptr->client_endpoint); + data_ptr->data_state = UNKNOWN; + this->replication_data_processor = new ip_replication_data_processor(ip_replication_area_begain, + ip_replication_area_size, virtual_service_endpoint, ingetloglevel, inputLogFatal, inputLogError, + inputLogWarn, inputLogInfo, inputLogDebug); + this->ip_data_processor = new ip_session_data_processor_stub( + 3600, this->replication_data_processor, ingetloglevel, + inputLogFatal, inputLogError, inputLogWarn, inputLogInfo, + inputLogDebug); + ip_session_entry_data.rs_endpoint = ep2; + ip_session_entry_data.last_time = 0; + (dynamic_cast(this->ip_data_processor))->write_session_data_stub(data_ptr->ip_hash, ip_session_entry_data); + realserver server; + server.tcp_endpoint = ep2; + rs_list.clear(); + rs_list.push_back(server); + ret = this->handle_realserver_select(boost::this_thread::get_id(), + rs_endpoint); + ip_session_table_entry entry = (dynamic_cast(this->ip_data_processor))->get_session_data_stub(data_ptr->ip_hash); + BOOST_CHECK_EQUAL(entry.rs_endpoint, rs_endpoint); + BOOST_CHECK_EQUAL(entry.last_time, 0); + BOOST_CHECK_EQUAL(ret, REALSERVER_CONNECT); + BOOST_CHECK_EQUAL(data_ptr->last_status, REALSERVER_CONNECT); + this->session_thread_data_map.clear(); + delete this->replication_data_processor; + delete this->ip_data_processor; + this->replication_data_processor = NULL; + this->ip_data_processor = NULL; + } + + cout << "[157]--------------------------------------------- " << endl; + //unit_test[157] realserver_connect_failed_count=-1の場合 + //unit_test[157] get_endpoint_from_session_data後endpoint = 決定 + //unit_test[157] rsリストを検索し、realserver endpointの存在チェックしrealserver endpoint が存在しない場合 + //unit_test[157] no rescheduleモード + //unit_test[157] status = CLIENT_DISCONNECT + { + this->session_thread_data_map.clear(); + thread_data_ptr data_ptr(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data_ptr; + tcp_schedule_func_type func = bind(&schedule_tcp_determinate_config_result, _1, _2, _3, _4, _5, ep2); + this->register_schedule(func); + data_ptr->realserver_connect_failed_count = -1; + data_ptr->client_endpoint = ep1; + data_ptr->ip_hash = l7vs_ip_service_calc_hash(data_ptr->client_endpoint); + this->reschedule = 0; + this->replication_data_processor = new ip_replication_data_processor(ip_replication_area_begain, + ip_replication_area_size, virtual_service_endpoint, ingetloglevel, inputLogFatal, inputLogError, + inputLogWarn, inputLogInfo, inputLogDebug); + this->ip_data_processor = new ip_session_data_processor_stub( + 3600, this->replication_data_processor, ingetloglevel, + inputLogFatal, inputLogError, inputLogWarn, inputLogInfo, + inputLogDebug); + ip_session_entry_data.rs_endpoint = ep2; + ip_session_entry_data.last_time = 0; + (dynamic_cast(this->ip_data_processor))->write_session_data_stub(data_ptr->ip_hash, ip_session_entry_data); + rs_list.clear(); + ret = this->handle_realserver_select(boost::this_thread::get_id(), + rs_endpoint); + BOOST_CHECK_EQUAL(ret, CLIENT_DISCONNECT); + BOOST_CHECK_EQUAL(data_ptr->last_status, CLIENT_DISCONNECT); + this->session_thread_data_map.clear(); + delete this->replication_data_processor; + delete this->ip_data_processor; + this->replication_data_processor = NULL; + this->ip_data_processor = NULL; + } + + cout << "[158]--------------------------------------------- " << endl; + //unit_test[158] realserver_connect_failed_count=-1の場合 + //unit_test[158] get_endpoint_from_session_data後endpoint = 決定 + //unit_test[158] rsリストを検索し、realserver endpointの存在チェックしrealserver endpoint が存在しない場合 + //unit_test[158] rescheduleモード + //unit_test[158] schedule_moduleにて振り分け先realserverを未決定する + //unit_test[158] status = CLIENT_DISCONNECT + { + this->session_thread_data_map.clear(); + thread_data_ptr data_ptr(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data_ptr; + tcp_schedule_func_type func = &schedule_tcp_nodeterminate; + this->register_schedule(func); + data_ptr->realserver_connect_failed_count = -1; + data_ptr->client_endpoint = ep1; + data_ptr->ip_hash = l7vs_ip_service_calc_hash(data_ptr->client_endpoint); + this->reschedule = 1; + this->replication_data_processor = new ip_replication_data_processor(ip_replication_area_begain, + ip_replication_area_size, virtual_service_endpoint, ingetloglevel, inputLogFatal, inputLogError, + inputLogWarn, inputLogInfo, inputLogDebug); + this->ip_data_processor = new ip_session_data_processor_stub( + 3600, this->replication_data_processor, ingetloglevel, + inputLogFatal, inputLogError, inputLogWarn, inputLogInfo, + inputLogDebug); + ip_session_entry_data.rs_endpoint = ep2; + ip_session_entry_data.last_time = 0; + (dynamic_cast(this->ip_data_processor))->write_session_data_stub(data_ptr->ip_hash, ip_session_entry_data); + rs_list.clear(); + ret = this->handle_realserver_select(boost::this_thread::get_id(), + rs_endpoint); + BOOST_CHECK_EQUAL(ret, CLIENT_DISCONNECT); + BOOST_CHECK_EQUAL(data_ptr->last_status, CLIENT_DISCONNECT); + this->session_thread_data_map.clear(); + delete this->replication_data_processor; + delete this->ip_data_processor; + this->replication_data_processor = NULL; + this->ip_data_processor = NULL; + } + + cout << "[159]--------------------------------------------- " << endl; + //unit_test[159] realserver_connect_failed_count=-1の場合 + //unit_test[159] get_endpoint_from_session_data後endpoint = 決定 + //unit_test[159] rsリストを検索し、realserver endpointの存在チェックしrealserver endpoint が存在しない場合 + //unit_test[159] rescheduleモード + //unit_test[159] schedule_moduleにて振り分け先realserverを決定する + //unit_test[159] データ状態がHTTP_STARTの場合 + //unit_test[159] status = CLIENT_RECV + { + this->session_thread_data_map.clear(); + thread_data_ptr data_ptr(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data_ptr; + tcp_schedule_func_type func = &schedule_tcp_determinate; + this->register_schedule(func); + data_ptr->realserver_connect_failed_count = -1; + data_ptr->client_endpoint = ep1; + data_ptr->ip_hash = l7vs_ip_service_calc_hash(data_ptr->client_endpoint); + data_ptr->data_state = HTTP_START; + this->reschedule = 1; + this->replication_data_processor = new ip_replication_data_processor(ip_replication_area_begain, + ip_replication_area_size, virtual_service_endpoint, ingetloglevel, inputLogFatal, inputLogError, + inputLogWarn, inputLogInfo, inputLogDebug); + this->ip_data_processor = new ip_session_data_processor_stub( + 3600, this->replication_data_processor, ingetloglevel, + inputLogFatal, inputLogError, inputLogWarn, inputLogInfo, + inputLogDebug); + ip_session_entry_data.rs_endpoint = ep2; + ip_session_entry_data.last_time = 0; + (dynamic_cast(this->ip_data_processor))->write_session_data_stub(data_ptr->ip_hash, ip_session_entry_data); + rs_list.clear(); + ret = this->handle_realserver_select(boost::this_thread::get_id(), + rs_endpoint); + ip_session_table_entry entry = (dynamic_cast(this->ip_data_processor))->get_session_data_stub(data_ptr->ip_hash); + BOOST_CHECK_EQUAL(entry.rs_endpoint, rs_endpoint); + BOOST_CHECK_EQUAL(entry.last_time, 0); + BOOST_CHECK_EQUAL(ret, CLIENT_RECV); + BOOST_CHECK_EQUAL(data_ptr->last_status, CLIENT_RECV); + this->session_thread_data_map.clear(); + delete this->replication_data_processor; + delete this->ip_data_processor; + this->replication_data_processor = NULL; + this->ip_data_processor = NULL; + } + + cout << "[160]--------------------------------------------- " << endl; + //unit_test[160] realserver_connect_failed_count=-1の場合 + //unit_test[160] get_endpoint_from_session_data後endpoint = 決定 + //unit_test[160] rsリストを検索し、realserver endpointの存在チェックしrealserver endpoint が存在しない場合 + //unit_test[160] rescheduleモード + //unit_test[160] schedule_moduleにて振り分け先realserverを決定する + //unit_test[160] データ状態がHTTP_HEADERの場合 + //unit_test[160] status = REALSERVER_CONNECT + { + this->session_thread_data_map.clear(); + thread_data_ptr data_ptr(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data_ptr; + tcp_schedule_func_type func = &schedule_tcp_determinate; + this->register_schedule(func); + data_ptr->realserver_connect_failed_count = -1; + data_ptr->client_endpoint = ep1; + data_ptr->ip_hash = l7vs_ip_service_calc_hash(data_ptr->client_endpoint); + data_ptr->data_state = HTTP_HEADER; + this->reschedule = 1; + this->replication_data_processor = new ip_replication_data_processor(ip_replication_area_begain, + ip_replication_area_size, virtual_service_endpoint, ingetloglevel, inputLogFatal, inputLogError, + inputLogWarn, inputLogInfo, inputLogDebug); + this->ip_data_processor = new ip_session_data_processor_stub( + 3600, this->replication_data_processor, ingetloglevel, + inputLogFatal, inputLogError, inputLogWarn, inputLogInfo, + inputLogDebug); + ip_session_entry_data.rs_endpoint = ep2; + ip_session_entry_data.last_time = 0; + (dynamic_cast(this->ip_data_processor))->write_session_data_stub(data_ptr->ip_hash, ip_session_entry_data); + rs_list.clear(); + ret = this->handle_realserver_select(boost::this_thread::get_id(), + rs_endpoint); + ip_session_table_entry entry = (dynamic_cast(this->ip_data_processor))->get_session_data_stub(data_ptr->ip_hash); + BOOST_CHECK_EQUAL(entry.rs_endpoint, rs_endpoint); + BOOST_CHECK_EQUAL(entry.last_time, 0); + BOOST_CHECK_EQUAL(ret, REALSERVER_CONNECT); + BOOST_CHECK_EQUAL(data_ptr->last_status, REALSERVER_CONNECT); + this->session_thread_data_map.clear(); + delete this->replication_data_processor; + delete this->ip_data_processor; + this->replication_data_processor = NULL; + this->ip_data_processor = NULL; + } + + cout << "[161]--------------------------------------------- " << endl; + //unit_test[161] realserver_connect_failed_count=-1の場合 + //unit_test[161] get_endpoint_from_session_data後endpoint = 決定 + //unit_test[161] rsリストを検索し、realserver endpointの存在チェックしrealserver endpoint が存在しない場合 + //unit_test[161] rescheduleモード + //unit_test[161] schedule_moduleにて振り分け先realserverを決定する + //unit_test[161] データ状態がHTTP_BODYの場合 + //unit_test[161] status = REALSERVER_CONNECT + { + this->session_thread_data_map.clear(); + thread_data_ptr data_ptr(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data_ptr; + tcp_schedule_func_type func = &schedule_tcp_determinate; + this->register_schedule(func); + data_ptr->realserver_connect_failed_count = -1; + data_ptr->client_endpoint = ep1; + data_ptr->ip_hash = l7vs_ip_service_calc_hash(data_ptr->client_endpoint); + data_ptr->data_state = HTTP_BODY; + this->reschedule = 1; + this->replication_data_processor = new ip_replication_data_processor(ip_replication_area_begain, + ip_replication_area_size, virtual_service_endpoint, ingetloglevel, inputLogFatal, inputLogError, + inputLogWarn, inputLogInfo, inputLogDebug); + this->ip_data_processor = new ip_session_data_processor_stub( + 3600, this->replication_data_processor, ingetloglevel, + inputLogFatal, inputLogError, inputLogWarn, inputLogInfo, + inputLogDebug); + ip_session_entry_data.rs_endpoint = ep2; + ip_session_entry_data.last_time = 0; + (dynamic_cast(this->ip_data_processor))->write_session_data_stub(data_ptr->ip_hash, ip_session_entry_data); + rs_list.clear(); + ret = this->handle_realserver_select(boost::this_thread::get_id(), + rs_endpoint); + ip_session_table_entry entry = (dynamic_cast(this->ip_data_processor))->get_session_data_stub(data_ptr->ip_hash); + BOOST_CHECK_EQUAL(entry.rs_endpoint, rs_endpoint); + BOOST_CHECK_EQUAL(entry.last_time, 0); + BOOST_CHECK_EQUAL(ret, REALSERVER_CONNECT); + BOOST_CHECK_EQUAL(data_ptr->last_status, REALSERVER_CONNECT); + this->session_thread_data_map.clear(); + delete this->replication_data_processor; + delete this->ip_data_processor; + this->replication_data_processor = NULL; + this->ip_data_processor = NULL; + } + + cout << "[162]--------------------------------------------- " << endl; + //unit_test[162] realserver_connect_failed_count=-1の場合 + //unit_test[162] get_endpoint_from_session_data後endpoint = 決定 + //unit_test[162] rsリストを検索し、realserver endpointの存在チェックしrealserver endpoint が存在しない場合 + //unit_test[162] rescheduleモード + //unit_test[162] schedule_moduleにて振り分け先realserverを決定する + //unit_test[162] データ状態がUNKNOWNの場合 + //unit_test[162] status = REALSERVER_CONNECT + { + this->session_thread_data_map.clear(); + thread_data_ptr data_ptr(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data_ptr; + tcp_schedule_func_type func = &schedule_tcp_determinate; + this->register_schedule(func); + data_ptr->realserver_connect_failed_count = -1; + data_ptr->client_endpoint = ep1; + data_ptr->ip_hash = l7vs_ip_service_calc_hash(data_ptr->client_endpoint); + data_ptr->data_state = UNKNOWN; + this->reschedule = 1; + this->replication_data_processor = new ip_replication_data_processor(ip_replication_area_begain, + ip_replication_area_size, virtual_service_endpoint, ingetloglevel, inputLogFatal, inputLogError, + inputLogWarn, inputLogInfo, inputLogDebug); + this->ip_data_processor = new ip_session_data_processor_stub( + 3600, this->replication_data_processor, ingetloglevel, + inputLogFatal, inputLogError, inputLogWarn, inputLogInfo, + inputLogDebug); + ip_session_entry_data.rs_endpoint = ep2; + ip_session_entry_data.last_time = 0; + (dynamic_cast(this->ip_data_processor))->write_session_data_stub(data_ptr->ip_hash, ip_session_entry_data); + rs_list.clear(); + ret = this->handle_realserver_select(boost::this_thread::get_id(), + rs_endpoint); + ip_session_table_entry entry = (dynamic_cast(this->ip_data_processor))->get_session_data_stub(data_ptr->ip_hash); + BOOST_CHECK_EQUAL(entry.rs_endpoint, rs_endpoint); + BOOST_CHECK_EQUAL(entry.last_time, 0); + BOOST_CHECK_EQUAL(ret, REALSERVER_CONNECT); + BOOST_CHECK_EQUAL(data_ptr->last_status, REALSERVER_CONNECT); + this->session_thread_data_map.clear(); + delete this->replication_data_processor; + delete this->ip_data_processor; + this->replication_data_processor = NULL; + this->ip_data_processor = NULL; + } + + + + + cout << "[163]--------------------------------------------- " << endl; + //unit_test[163] realserver_connect_failed_count < realserver_connect_failed_max_countの場合 + //unit_test[163] schedule_moduleにて振り分け先realserverを決定する + //unit_test[163] データ状態がHTTP_STARTの場合 + //unit_test[163] status = CLIENT_RECV + { + this->session_thread_data_map.clear(); + thread_data_ptr data_ptr(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data_ptr; + tcp_schedule_func_type func = &schedule_tcp_determinate; + this->register_schedule(func); + data_ptr->realserver_connect_failed_count = REALSERVER_CONNECT_FAILED_COUNT - 1; + data_ptr->data_state = HTTP_START; + this->replication_data_processor = new ip_replication_data_processor(ip_replication_area_begain, + ip_replication_area_size, virtual_service_endpoint, ingetloglevel, inputLogFatal, inputLogError, + inputLogWarn, inputLogInfo, inputLogDebug); + this->ip_data_processor = new ip_session_data_processor_stub( + 3600, this->replication_data_processor, ingetloglevel, + inputLogFatal, inputLogError, inputLogWarn, inputLogInfo, + inputLogDebug); + + ret = this->handle_realserver_select(boost::this_thread::get_id(), + rs_endpoint); + + BOOST_CHECK_EQUAL(ret, CLIENT_RECV); + BOOST_CHECK_EQUAL((rs_endpoint != tmp_endpoint), true); + BOOST_CHECK_EQUAL(data_ptr->last_status, CLIENT_RECV); + this->session_thread_data_map.clear(); + delete this->replication_data_processor; + delete this->ip_data_processor; + this->replication_data_processor = NULL; + this->ip_data_processor = NULL; + } + + cout << "[164]--------------------------------------------- " << endl; + //unit_test[164] realserver_connect_failed_count < realserver_connect_failed_max_countの場合 + //unit_test[164] schedule_moduleにて振り分け先realserverを決定する + //unit_test[164] データ状態がHTTP_HEADERの場合 + //unit_test[164] status = REALSERVER_CONNECT + { + this->session_thread_data_map.clear(); + thread_data_ptr data_ptr(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data_ptr; + tcp_schedule_func_type func = &schedule_tcp_determinate; + this->register_schedule(func); + data_ptr->realserver_connect_failed_count = REALSERVER_CONNECT_FAILED_COUNT - 1; + data_ptr->data_state = HTTP_HEADER; + this->replication_data_processor = new ip_replication_data_processor(ip_replication_area_begain, + ip_replication_area_size, virtual_service_endpoint, ingetloglevel, inputLogFatal, inputLogError, + inputLogWarn, inputLogInfo, inputLogDebug); + this->ip_data_processor = new ip_session_data_processor_stub( + 3600, this->replication_data_processor, ingetloglevel, + inputLogFatal, inputLogError, inputLogWarn, inputLogInfo, + inputLogDebug); + + ret = this->handle_realserver_select(boost::this_thread::get_id(), + rs_endpoint); + + BOOST_CHECK_EQUAL(ret, REALSERVER_CONNECT); + BOOST_CHECK_EQUAL((rs_endpoint != tmp_endpoint), true); + BOOST_CHECK_EQUAL(data_ptr->last_status, REALSERVER_CONNECT); + this->session_thread_data_map.clear(); + delete this->replication_data_processor; + delete this->ip_data_processor; + this->replication_data_processor = NULL; + this->ip_data_processor = NULL; + } + + cout << "[165]--------------------------------------------- " << endl; + //unit_test[165] realserver_connect_failed_count < realserver_connect_failed_max_countの場合 + //unit_test[165] schedule_moduleにて振り分け先realserverを決定する + //unit_test[165] データ状態がHTTP_BODYの場合 + //unit_test[165] status = REALSERVER_CONNECT + { + this->session_thread_data_map.clear(); + thread_data_ptr data_ptr(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data_ptr; + tcp_schedule_func_type func = &schedule_tcp_determinate; + this->register_schedule(func); + data_ptr->realserver_connect_failed_count = REALSERVER_CONNECT_FAILED_COUNT - 1; + data_ptr->data_state = HTTP_BODY; + this->replication_data_processor = new ip_replication_data_processor(ip_replication_area_begain, + ip_replication_area_size, virtual_service_endpoint, ingetloglevel, inputLogFatal, inputLogError, + inputLogWarn, inputLogInfo, inputLogDebug); + this->ip_data_processor = new ip_session_data_processor_stub( + 3600, this->replication_data_processor, ingetloglevel, + inputLogFatal, inputLogError, inputLogWarn, inputLogInfo, + inputLogDebug); + + ret = this->handle_realserver_select(boost::this_thread::get_id(), + rs_endpoint); + + BOOST_CHECK_EQUAL(ret, REALSERVER_CONNECT); + BOOST_CHECK_EQUAL((rs_endpoint != tmp_endpoint), true); + BOOST_CHECK_EQUAL(data_ptr->last_status, REALSERVER_CONNECT); + this->session_thread_data_map.clear(); + delete this->replication_data_processor; + delete this->ip_data_processor; + this->replication_data_processor = NULL; + this->ip_data_processor = NULL; + } + + + cout << "[166]--------------------------------------------- " << endl; + //unit_test[166] realserver_connect_failed_count < realserver_connect_failed_max_countの場合 + //unit_test[166] schedule_moduleにて振り分け先realserverを決定する + //unit_test[166] データ状態がHTTP_UNKNOWNの場合 + //unit_test[166] status = REALSERVER_CONNECT + { + this->session_thread_data_map.clear(); + thread_data_ptr data_ptr(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data_ptr; + tcp_schedule_func_type func = &schedule_tcp_determinate; + this->register_schedule(func); + data_ptr->realserver_connect_failed_count = REALSERVER_CONNECT_FAILED_COUNT - 1; + data_ptr->data_state = UNKNOWN; + this->replication_data_processor = new ip_replication_data_processor(ip_replication_area_begain, + ip_replication_area_size, virtual_service_endpoint, ingetloglevel, inputLogFatal, inputLogError, + inputLogWarn, inputLogInfo, inputLogDebug); + this->ip_data_processor = new ip_session_data_processor_stub( + 3600, this->replication_data_processor, ingetloglevel, + inputLogFatal, inputLogError, inputLogWarn, inputLogInfo, + inputLogDebug); + + ret = this->handle_realserver_select(boost::this_thread::get_id(), + rs_endpoint); + + BOOST_CHECK_EQUAL(ret, REALSERVER_CONNECT); + BOOST_CHECK_EQUAL((rs_endpoint != tmp_endpoint), true); + BOOST_CHECK_EQUAL(data_ptr->last_status, REALSERVER_CONNECT); + this->session_thread_data_map.clear(); + delete this->replication_data_processor; + delete this->ip_data_processor; + this->replication_data_processor = NULL; + this->ip_data_processor = NULL; + } + + cout << "[167]--------------------------------------------- " << endl; + //unit_test[167] realserver_connect_failed_count < realserver_connect_failed_max_countの場合 + //unit_test[167] schedule_moduleにて振り分け先realserverを未決定 + //unit_test[167] status = CLIENT_DISCONNECT + { + this->session_thread_data_map.clear(); + thread_data_ptr data_ptr(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data_ptr; + tcp_schedule_func_type func = &schedule_tcp_nodeterminate; + this->register_schedule(func); + data_ptr->realserver_connect_failed_count = REALSERVER_CONNECT_FAILED_COUNT - 1; + + ret = this->handle_realserver_select(boost::this_thread::get_id(), + rs_endpoint); + + BOOST_CHECK_EQUAL(ret, CLIENT_DISCONNECT); + BOOST_CHECK_EQUAL((rs_endpoint == tmp_endpoint), true); + BOOST_CHECK_EQUAL(data_ptr->last_status, CLIENT_DISCONNECT); + this->session_thread_data_map.clear(); + } + + + + cout << "[168]--------------------------------------------- " << endl; + //unit_test[168] realserver_connect_failed_count == realserver_connect_failed_max_countの場合 + //unit_test[168] status = CLIENT_DISCONNECT + { + this->session_thread_data_map.clear(); + thread_data_ptr data_ptr(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data_ptr; + data_ptr->realserver_connect_failed_count = REALSERVER_CONNECT_FAILED_COUNT; + + ret = this->handle_realserver_select(boost::this_thread::get_id(), + rs_endpoint); + + BOOST_CHECK_EQUAL(ret, CLIENT_DISCONNECT); + BOOST_CHECK_EQUAL((rs_endpoint == tmp_endpoint), true); + BOOST_CHECK_EQUAL(data_ptr->last_status, CLIENT_DISCONNECT); + this->session_thread_data_map.clear(); + + } + + cout << "[169]--------------------------------------------- " << endl; + //unit_test[169] realserver_connect_failed_count = realserver_connect_failed_max_count+1の場合 + //unit_test[169] status = CLIENT_DISCONNECT + { + this->session_thread_data_map.clear(); + thread_data_ptr data_ptr(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data_ptr; + data_ptr->realserver_connect_failed_count = REALSERVER_CONNECT_FAILED_COUNT +1; + + ret = this->handle_realserver_select(boost::this_thread::get_id(), + rs_endpoint); + + BOOST_CHECK_EQUAL(ret, CLIENT_DISCONNECT); + BOOST_CHECK_EQUAL((rs_endpoint == tmp_endpoint), true); + BOOST_CHECK_EQUAL(data_ptr->last_status, CLIENT_DISCONNECT); + this->session_thread_data_map.clear(); + + } + + + delete [] ip_replication_area_begain; + } + + //handle_realserver_select(tcp)_thread + void handle_realserver_select_tcp_test_thread() + { + EVENT_TAG ret; + std::string ip_id; + boost::asio::ip::tcp::endpoint rs_endpoint; + boost::asio::ip::tcp::endpoint tmp_endpoint; + boost::asio::ip::tcp::endpoint + ep1(boost::asio::ip::address::from_string("192.168.120.249"), + 12345); + boost::asio::ip::tcp::endpoint ep2(boost::asio::ip::address::from_string("192.168.120.250"), + 12345); + + boost::function ingetloglevel = stb_getloglevel; + boost::function inputLogFatal = stb_putLogFatal; + boost::function inputLogError = stb_putLogError; + boost::function inputLogWarn = stb_putLogWarn; + boost::function inputLogInfo = stb_putLogInfo; + boost::function inputLogDebug = stb_putLogDebug; + char* ip_replication_area_begain = new char[10]; + + boost::asio::ip::tcp::endpoint virtual_service_endpoint; + ip_session_table_entry ip_session_entry_data; + + realserverlist_type rs_list; + rs_list_begin = boost::bind(&get_rs_list_begin, &rs_list); + rs_list_end = boost::bind(&get_rs_list_end, &rs_list); + rs_list_next = boost::bind(&get_rs_list_next, _1); + rs_list_lock = &rslist_lock; + rs_list_unlock = &rslist_unlock; + + cout << "[170]--------------------------------------------- " << endl; + //unit_test[170] realserver_connect_failed_count = realserver_connect_failed_max_count+1の場合 + //unit_test[170] status = CLIENT_DISCONNECT + { + thread_data_ptr data_ptr(new session_thread_data_ip); + { + boost::mutex::scoped_lock sclock(session_thread_data_map_mutex); + this->session_thread_data_map[boost::this_thread::get_id()] = data_ptr; + data_ptr->realserver_connect_failed_count = REALSERVER_CONNECT_FAILED_COUNT +1; + } + ret = this->handle_realserver_select(boost::this_thread::get_id(), + rs_endpoint); + { + boost::mutex::scoped_lock sclock(session_thread_data_map_mutex); + BOOST_CHECK_EQUAL(ret, CLIENT_DISCONNECT); + BOOST_CHECK_EQUAL((rs_endpoint == tmp_endpoint), true); + BOOST_CHECK_EQUAL(data_ptr->last_status, CLIENT_DISCONNECT); + this->session_thread_data_map.erase(boost::this_thread::get_id()); + } + } + + delete [] ip_replication_area_begain; + } + + //handle_realserver_select(udp) + void handle_realserver_select_udp_test() + { + cout << "[171]--------------------------------------------- " << endl; + //unit_test[171] handle_realserver_select_udp_test 戻り値が「STOP」に設定する。 + boost::asio::ip::udp::endpoint ep; + boost::array sbf; + std::size_t d; + + EVENT_TAG ret = this->handle_realserver_select(boost::this_thread::get_id(), ep, sbf, d); + + BOOST_CHECK_EQUAL(ret, STOP); + } + + //handle_realserver_connect + void handle_realserver_connect_test() + { + size_t send_buffer_len = 0; + boost::array send_buffer; + EVENT_TAG ret; + int cmp_ret = 0; + std::pair buffer_element; + + cout << "[172]--------------------------------------------- " << endl; + //unit_test[172] session_thread_dataがNULLの場合 status = FINALIZE + thread_data_ptr session_data; + this->session_thread_data_map[boost::this_thread::get_id()] = session_data; + ret = handle_realserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + BOOST_CHECK_EQUAL(ret, FINALIZE); + + cout << "[173]--------------------------------------------- " << endl; + //unit_test[173] thread_id対応のデータなしの場合 status = FINALIZE + this->session_thread_data_map.clear(); + ret = handle_realserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + BOOST_CHECK_EQUAL(ret, FINALIZE); + + cout << "[174]--------------------------------------------- " << endl; + //unit_test[174] 送信データリストが空の場合 + //unit_test[174] データ状態がHTTP_HEADER + //unit_test[174] 送信元設定指示設定フラグをONの場合 + //unit_test[174] データ状態にHTTP_BODYを設定する + //unit_test[174] status = REALSERVER_SEND + //unit_test[174] 送信バッファにデータをコピーし、X-Forworded-For文字列を添加する + //unit_test[174] realserver_connect_failed_count =0 + { + thread_data_ptr thread_data(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data; + thread_data->client_endpoint = string_to_endpoint ("10.10.10.10:8888"); + thread_data->data_state = HTTP_HEADER; + this->forwarded_for = FORWARDED_FOR_ON; + thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset(thread_data->data_buffer, 0, MAX_BUFFER_SIZE); + char *http_header_ptr = "POST / HTTP/1.0\r\nContent-Length: 65493\r\n\r\n"; + size_t http_header_len = strlen(http_header_ptr); + memcpy(thread_data->data_buffer, http_header_ptr, http_header_len); + thread_data->data_length = http_header_len; + thread_data->data_offset = 0u; + thread_data->current_message_rest_size = http_header_len + 65493u; + thread_data->data_buffer_size = MAX_BUFFER_SIZE; + memset(send_buffer.c_array(), 0, MAX_BUFFER_SIZE); + ret = handle_realserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + char * send_buffer_context = "POST / HTTP/1.0\r\nX-Forwarded-For: 10.10.10.10\r\nContent-Length: 65493\r\n\r\n"; + cmp_ret = memcmp(send_buffer.c_array(), send_buffer_context, strlen(send_buffer_context)); + BOOST_CHECK_EQUAL(cmp_ret, 0);// 送信バッファにデータをコピーし、X-Forworded-For文字列を添加する + BOOST_CHECK_EQUAL(ret, REALSERVER_SEND);// 遷移先ステータスを設定する + BOOST_CHECK_EQUAL(thread_data->last_status, REALSERVER_SEND);// 遷移ステータスを保存する + BOOST_CHECK_EQUAL(thread_data->data_state, HTTP_BODY);// データ状態にHTTP_BODYを設定する + BOOST_CHECK_EQUAL(thread_data->realserver_connect_failed_count, 0); + BOOST_CHECK_EQUAL(send_buffer_len, strlen(send_buffer_context)); + BOOST_CHECK_EQUAL(thread_data->buffer_sequence.empty(), true); + this->session_thread_data_map.clear(); + } + + cout << "[175]--------------------------------------------- " << endl; + //unit_test[175] 送信データリストが空の場合 + //unit_test[175] データ状態がHTTP_HEADER + //unit_test[175] 送信元設定指示設定フラグをOFFの場合 + //unit_test[175] データ状態にHTTP_BODYを設定する + //unit_test[175] status = REALSERVER_SEND + //unit_test[175] 送信バッファにデータをコピーし + //unit_test[175] realserver_connect_failed_count =0 + + { + thread_data_ptr thread_data(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data; + thread_data->data_state = HTTP_HEADER; + this->forwarded_for = FORWARDED_FOR_OFF; + send_buffer.assign('0'); + thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset(thread_data->data_buffer, 0, MAX_BUFFER_SIZE); + char *http_header_ptr = "POST / HTTP/1.0\r\nContent-Length: 65493\r\n\r\n"; + size_t http_header_len = strlen(http_header_ptr); + memcpy(thread_data->data_buffer, http_header_ptr, http_header_len); + thread_data->data_length = http_header_len; + thread_data->data_offset = 0u; + thread_data->current_message_rest_size = http_header_len + 65493u; + thread_data->data_buffer_size = MAX_BUFFER_SIZE; + memset(send_buffer.c_array(), 0, MAX_BUFFER_SIZE); + + ret = handle_realserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_SEND);// 遷移先ステータスを設定する + BOOST_CHECK_EQUAL(thread_data->last_status, REALSERVER_SEND);// 遷移ステータスを保存する + BOOST_CHECK_EQUAL(thread_data->data_state, HTTP_BODY);// データ状態にHTTP_BODYを設定する + BOOST_CHECK_EQUAL(thread_data->realserver_connect_failed_count, 0); + BOOST_CHECK_EQUAL(send_buffer_len, http_header_len);// 送信データサイズに送信可能サイズを設定する + cmp_ret = memcmp(send_buffer.c_array(),thread_data->data_buffer,http_header_len); + BOOST_CHECK_EQUAL(cmp_ret, 0);// 送信バッファにデータを送信可能サイズ分コピーする + BOOST_CHECK_EQUAL(thread_data->current_message_rest_size, 65493u);// 未送信データサイズに送信可能サイズを減算する + BOOST_CHECK_EQUAL(thread_data->data_length, 0u); + BOOST_CHECK_EQUAL(thread_data->data_offset, http_header_len);// データ開始位置に送信可能サイズを加算する + this->session_thread_data_map.clear(); + delete[] thread_data->data_buffer; + } + + cout << "[176]--------------------------------------------- " << endl; + //unit_test[176] 送信データリストが空の場合 + //unit_test[176] データ状態がHTTP_BODY + //unit_test[176] status = REALSERVER_SEND + //unit_test[176] 送信バッファにデータをコピーし + //unit_test[176] realserver_connect_failed_count =0 + { + thread_data_ptr thread_data(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data; + thread_data->data_state = HTTP_HEADER; + this->forwarded_for = FORWARDED_FOR_OFF; + send_buffer.assign('0'); + thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset(thread_data->data_buffer, 0, MAX_BUFFER_SIZE); + char* http_header_ptr = "1234567890"; + size_t http_header_len = strlen(http_header_ptr); + memcpy(thread_data->data_buffer, http_header_ptr, http_header_len); + thread_data->data_length = http_header_len; + thread_data->data_offset = 0u; + thread_data->current_message_rest_size = 100; + thread_data->data_buffer_size = MAX_BUFFER_SIZE; + memset(send_buffer.c_array(), 0, MAX_BUFFER_SIZE); + + ret = handle_realserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_SEND);// 遷移先ステータスを設定する + BOOST_CHECK_EQUAL(thread_data->last_status, REALSERVER_SEND);// 遷移ステータスを保存する + BOOST_CHECK_EQUAL(send_buffer_len, http_header_len); + BOOST_CHECK_EQUAL(thread_data->realserver_connect_failed_count, 0); + cmp_ret = memcmp(send_buffer.c_array(),http_header_ptr,http_header_len); + BOOST_CHECK_EQUAL(cmp_ret, 0);// 送信バッファにデータを送信可能サイズ分コピーする + BOOST_CHECK_EQUAL(thread_data->current_message_rest_size, 90u);// 未送信データサイズに送信可能サイズを減算する + BOOST_CHECK_EQUAL(thread_data->data_length, 0u); + BOOST_CHECK_EQUAL(thread_data->data_offset, http_header_len);// データ開始位置に送信可能サイズを加算する + this->session_thread_data_map.clear(); + delete[] thread_data->data_buffer; + + } + + + cout << "[177]--------------------------------------------- " << endl; + //unit_test[177] 送信データリストが空の場合 + //unit_test[177] データ状態がUNKNOWN + //unit_test[177] status = REALSERVER_SEND + //unit_test[177] 送信バッファにデータをコピーし + //unit_test[177] realserver_connect_failed_count =0 + { + + thread_data_ptr thread_data(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data; + thread_data->data_state = UNKNOWN; + send_buffer.assign('0'); + send_buffer_len = 0; + thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + + memset(thread_data->data_buffer, 0, MAX_BUFFER_SIZE); + char* http_header_ptr = "AAA / HTTP/1.0\r\nContent-Length: 15\r\n\r\n"; + size_t http_header_len = strlen(http_header_ptr); + memcpy(thread_data->data_buffer, http_header_ptr, http_header_len); + thread_data->data_length = http_header_len; + thread_data->data_offset = 0; + thread_data->current_message_rest_size = http_header_len; + thread_data->data_buffer_size = MAX_BUFFER_SIZE; + memset(send_buffer.c_array(), 0, MAX_BUFFER_SIZE); + + ret = handle_realserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_SEND);// 遷移先ステータスを設定する + BOOST_CHECK_EQUAL(thread_data->last_status, REALSERVER_SEND);// 遷移ステータスを保存する + BOOST_CHECK_EQUAL(send_buffer_len, http_header_len);// 送信データサイズに送信可能サイズを設定する + BOOST_CHECK_EQUAL(thread_data->realserver_connect_failed_count, 0); + cmp_ret = memcmp(send_buffer.c_array(),thread_data->data_buffer + 0u, http_header_len); + BOOST_CHECK_EQUAL(cmp_ret, 0);// 送信バッファにデータを送信可能サイズ分コピーする + BOOST_CHECK_EQUAL(thread_data->current_message_rest_size, 0u);// 未送信データサイズに送信可能サイズを減算する + BOOST_CHECK_EQUAL(thread_data->data_length, 0u); + BOOST_CHECK_EQUAL(thread_data->data_offset, http_header_len);// データ開始位置に送信可能サイズを加算する + this->session_thread_data_map.clear(); + delete[] thread_data->data_buffer; + } + + cout << "[178]--------------------------------------------- " << endl; + //unit_test[178] 送信データリストが空ではないの場合(size = 1, forwarded_for = 0) + //unit_test[178] status = REALSERVER_SEND + //unit_test[178] 送信バッファにデータをコピーし + //unit_test[178] realserver_connect_failed_count =0 + { + + thread_data_ptr thread_data(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data; + send_buffer.assign('0'); + send_buffer_len = 0; + thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset(thread_data->data_buffer, 0, MAX_BUFFER_SIZE); + char* http_header_ptr = "Get / HTTP/1.0\r\nContent-Length: 15\r\n\r\n"; + size_t http_header_len = strlen(http_header_ptr); + memcpy(thread_data->data_buffer, http_header_ptr, http_header_len); + thread_data->data_length = http_header_len - 6; //ship "Get / " + thread_data->data_offset = 6;//"Get / " is already sent + thread_data->current_message_rest_size = http_header_len - 6 + 15; + thread_data->data_buffer_size = MAX_BUFFER_SIZE; + this->forwarded_for = FORWARDED_FOR_OFF; + buffer_element = std::make_pair(thread_data->data_buffer + 6, thread_data->data_length); + thread_data->buffer_sequence.push_back(buffer_element); + + ret = handle_realserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_SEND);// 遷移先ステータスを設定する + BOOST_CHECK_EQUAL(thread_data->last_status, REALSERVER_SEND);// 遷移ステータスを保存する + BOOST_CHECK_EQUAL(send_buffer_len, http_header_len - 6);// 送信データサイズに送信可能サイズを設定する + BOOST_CHECK_EQUAL(thread_data->realserver_connect_failed_count, 0); + cmp_ret = memcmp(send_buffer.c_array(),thread_data->data_buffer + 6u, send_buffer_len); + BOOST_CHECK_EQUAL(cmp_ret, 0);// 送信バッファにデータを送信可能サイズ分コピーする + BOOST_CHECK_EQUAL(thread_data->current_message_rest_size, 15u);// 未送信データサイズに送信可能サイズを減算する + BOOST_CHECK_EQUAL(thread_data->data_length, 0u); + BOOST_CHECK_EQUAL(thread_data->data_offset, http_header_len);// データ開始位置に送信可能サイズを加算する + BOOST_CHECK_EQUAL(thread_data->buffer_sequence.empty(), true); + this->session_thread_data_map.clear(); + delete[] thread_data->data_buffer; + } + + cout << "[179]--------------------------------------------- " << endl; + //unit_test[179] 送信データリストが空ではないの場合(size = 2, forwarded_for = 1) + //unit_test[179] status = REALSERVER_SEND + //unit_test[179] 送信バッファにデータをコピーし + //unit_test[179] realserver_connect_failed_count =0 + { + + thread_data_ptr thread_data(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data; + send_buffer.assign('0'); + send_buffer_len = 0; + thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset(thread_data->data_buffer, 0, MAX_BUFFER_SIZE); + char* http_header_ptr = "Get / HTTP/1.0\r\nContent-Length: 15\r\n\r\n"; + size_t http_header_len = strlen(http_header_ptr); + memcpy(thread_data->data_buffer, http_header_ptr, http_header_len); + thread_data->data_length = http_header_len - 16; //ship "Get / HTTP/1.0\r\n" + thread_data->data_offset = 16;//"Get / HTTP/1.0\r\n"is already sent + thread_data->current_message_rest_size = http_header_len - 16 + 15; + thread_data->data_buffer_size = MAX_BUFFER_SIZE; + this->forwarded_for = FORWARDED_FOR_ON; + thread_data->forwarded_for_buffer.assign('0'); + strcpy(thread_data->forwarded_for_buffer.data(), "X-Forwarded-For: 172.16.58.24\r\n"); + + buffer_element = std::make_pair(thread_data->forwarded_for_buffer.data(), 31); + thread_data->buffer_sequence.push_back(buffer_element); + + buffer_element = std::make_pair(thread_data->data_buffer + 16, thread_data->data_length); + thread_data->buffer_sequence.push_back(buffer_element); + + + + ret = handle_realserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + + char * send_buffer_context = "X-Forwarded-For: 172.16.58.24\r\nContent-Length: 15\r\n\r\n"; + BOOST_CHECK_EQUAL(ret, REALSERVER_SEND);// 遷移先ステータスを設定する + BOOST_CHECK_EQUAL(thread_data->last_status, REALSERVER_SEND);// 遷移ステータスを保存する + BOOST_CHECK_EQUAL(send_buffer_len, strlen(send_buffer_context)); + BOOST_CHECK_EQUAL(thread_data->realserver_connect_failed_count, 0); + cmp_ret = memcmp(send_buffer.c_array(),send_buffer_context, send_buffer_len); + BOOST_CHECK_EQUAL(cmp_ret, 0);// 送信バッファにデータを送信可能サイズ分コピーする + BOOST_CHECK_EQUAL(thread_data->current_message_rest_size, 15u);// 未送信データサイズに送信可能サイズを減算する + BOOST_CHECK_EQUAL(thread_data->data_length, 0u); + BOOST_CHECK_EQUAL(thread_data->data_offset, http_header_len);// データ開始位置に送信可能サイズを加算する + BOOST_CHECK_EQUAL(thread_data->buffer_sequence.empty(), true); + this->session_thread_data_map.clear(); + delete[] thread_data->data_buffer; + } + cout << "[180]--------------------------------------------- " << endl; + //unit_test[180] 送信データリストが空ではないの場合(size = 3, forwarded_for = 1) + //unit_test[180] status = REALSERVER_SEND + //unit_test[180] 送信バッファにデータをコピーし + //unit_test[180] realserver_connect_failed_count =0 + { + + thread_data_ptr thread_data(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data; + send_buffer.assign('0'); + send_buffer_len = 0; + thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset(thread_data->data_buffer, 0, MAX_BUFFER_SIZE); + char* http_header_ptr = "Get / HTTP/1.0\r\nContent-Length: 15\r\n\r\n"; + size_t http_header_len = strlen(http_header_ptr); + memcpy(thread_data->data_buffer, http_header_ptr, http_header_len); + thread_data->data_length = http_header_len - 6; //ship "Get / " + thread_data->data_offset = 6;//"Get / "is already sent + thread_data->current_message_rest_size = http_header_len - 6 + 15; + thread_data->data_buffer_size = MAX_BUFFER_SIZE; + this->forwarded_for = FORWARDED_FOR_ON; + buffer_element = std::make_pair(thread_data->data_buffer + 6, 10); + thread_data->buffer_sequence.push_back(buffer_element); + thread_data->forwarded_for_buffer.assign('0'); + strcpy(thread_data->forwarded_for_buffer.data(), "X-Forwarded-For: 172.16.58.24\r\n"); + buffer_element = std::make_pair(thread_data->forwarded_for_buffer.data(), 31); + thread_data->buffer_sequence.push_back(buffer_element); + buffer_element = std::make_pair(thread_data->data_buffer + 16, 22); + thread_data->buffer_sequence.push_back(buffer_element); + + ret = handle_realserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + + char * send_buffer_context = "HTTP/1.0\r\nX-Forwarded-For: 172.16.58.24\r\nContent-Length: 15\r\n\r\n"; + BOOST_CHECK_EQUAL(ret, REALSERVER_SEND);// 遷移先ステータスを設定する + BOOST_CHECK_EQUAL(thread_data->last_status, REALSERVER_SEND);// 遷移ステータスを保存する + BOOST_CHECK_EQUAL(send_buffer_len, strlen(send_buffer_context));// 送信データサイズに送信可能サイズを設定する + BOOST_CHECK_EQUAL(thread_data->realserver_connect_failed_count, 0); + cmp_ret = memcmp(send_buffer.c_array(),send_buffer_context, send_buffer_len); + BOOST_CHECK_EQUAL(cmp_ret, 0);// 送信バッファにデータを送信可能サイズ分コピーする + BOOST_CHECK_EQUAL(thread_data->current_message_rest_size, 15u);// 未送信データサイズに送信可能サイズを減算する + BOOST_CHECK_EQUAL(thread_data->data_length, 0u); + BOOST_CHECK_EQUAL(thread_data->data_offset, http_header_len);// データ開始位置に送信可能サイズを加算する + BOOST_CHECK_EQUAL(thread_data->buffer_sequence.empty(), true); + this->session_thread_data_map.clear(); + delete[] thread_data->data_buffer; + } + + } + + //handle_realserver_connect_test_thread + void handle_realserver_connect_test_thread() + { + size_t send_buffer_len = 0; + boost::array send_buffer; + EVENT_TAG ret; + int cmp_ret = 0; + size_t http_header_len; + std::pair buffer_element; + cout << "[181]--------------------------------------------- " << endl; + //unit_test[181] 送信データリストが空ではないの場合(size = 3, forwarded_for = 1) + //unit_test[181] status = REALSERVER_SEND + //unit_test[181] 送信バッファにデータをコピーし + //unit_test[181] realserver_connect_failed_count =0 + { + + thread_data_ptr thread_data(new session_thread_data_ip); + { + boost::mutex::scoped_lock sclock(session_thread_data_map_mutex); + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data; + send_buffer.assign('0'); + send_buffer_len = 0; + thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset(thread_data->data_buffer, 0, MAX_BUFFER_SIZE); + char* http_header_ptr = "Get / HTTP/1.0\r\nContent-Length: 15\r\n\r\n"; + http_header_len = strlen(http_header_ptr); + memcpy(thread_data->data_buffer, http_header_ptr, http_header_len); + thread_data->data_length = http_header_len - 6; //ship "Get / " + thread_data->data_offset = 6;//"Get / "is already sent + thread_data->current_message_rest_size = http_header_len - 6 + 15; + thread_data->data_buffer_size = MAX_BUFFER_SIZE; + this->forwarded_for = FORWARDED_FOR_ON; + buffer_element = std::make_pair(thread_data->data_buffer + 6, 10); + thread_data->buffer_sequence.push_back(buffer_element); + thread_data->forwarded_for_buffer.assign('0'); + + buffer_element = std::make_pair(thread_data->forwarded_for_buffer.data(), 31); + thread_data->buffer_sequence.push_back(buffer_element); + + strcpy(thread_data->forwarded_for_buffer.data(), "X-Forwarded-For: 172.16.58.24\r\n"); + buffer_element = std::make_pair(thread_data->data_buffer + 16, 22); + thread_data->buffer_sequence.push_back(buffer_element); + } + + ret = handle_realserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + { + boost::mutex::scoped_lock sclock(session_thread_data_map_mutex); + char * send_buffer_context = "HTTP/1.0\r\nX-Forwarded-For: 172.16.58.24\r\nContent-Length: 15\r\n\r\n"; + BOOST_CHECK_EQUAL(ret, REALSERVER_SEND);// 遷移先ステータスを設定する + BOOST_CHECK_EQUAL(thread_data->last_status, REALSERVER_SEND);// 遷移ステータスを保存する + BOOST_CHECK_EQUAL(send_buffer_len, strlen(send_buffer_context));// 送信データサイズに送信可能サイズを設定する + BOOST_CHECK_EQUAL(thread_data->realserver_connect_failed_count, 0); + cmp_ret = memcmp(send_buffer.c_array(),send_buffer_context, send_buffer_len); + BOOST_CHECK_EQUAL(cmp_ret, 0);// 送信バッファにデータを送信可能サイズ分コピーする + BOOST_CHECK_EQUAL(thread_data->current_message_rest_size, 15u);// 未送信データサイズに送信可能サイズを減算する + BOOST_CHECK_EQUAL(thread_data->data_length, 0u); + BOOST_CHECK_EQUAL(thread_data->data_offset, http_header_len);// データ開始位置に送信可能サイズを加算する + BOOST_CHECK_EQUAL(thread_data->buffer_sequence.empty(), true); + this->session_thread_data_map.erase(boost::this_thread::get_id()); + delete[] thread_data->data_buffer; + } + } + } + + //handle_realserver_connection_fail + void handle_realserver_connection_fail_test() + { + EVENT_TAG ret; + boost::asio::ip::tcp::endpoint ep_err1; + + cout << "[182]--------------------------------------------- " << endl; + //unit_test[182] 異常系 session_thread_data_map中にThreadID対応のデータがない + { + this->session_thread_data_map.clear(); + + this->session_thread_data_map[boost::this_thread::get_id()].reset(); + ret = this->handle_realserver_connection_fail(boost::this_thread::get_id(), ep_err1); + + //遷移先ステータスを設定する status = FINALIZE + BOOST_CHECK_EQUAL(ret, FINALIZE); + } + + cout << "[183]--------------------------------------------- " << endl; + //unit_test[183] 異常系 session_thread_data_map中にThreadIDなし場合のテスト + { + this->session_thread_data_map.clear(); + + ret = this->handle_realserver_connection_fail(boost::this_thread::get_id(), ep_err1); + + //遷移先ステータスを設定する status = FINALIZE + BOOST_CHECK_EQUAL(ret, FINALIZE); + } + + cout << "[184]--------------------------------------------- " << endl; + //unit_test[184] rescheduleモード realserver_connect_failed_count で1を加算する 遷移先ステータスをREALSERVER_SELECT設定する + { + boost::asio::ip::tcp::endpoint ep; + + thread_data_ptr data(new session_thread_data_ip); + data->thread_id = boost::this_thread::get_id(); + data->realserver_connect_failed_count = 1; + this->reschedule = 1; + this->session_thread_data_map[boost::this_thread::get_id()] = data; + + ret = this->handle_realserver_connection_fail(boost::this_thread::get_id(), ep); + + //遷移先ステータスを設定する + //status = REALSERVER_SELECT + BOOST_CHECK_EQUAL(ret, REALSERVER_SELECT); + BOOST_CHECK_EQUAL(data->last_status, REALSERVER_SELECT); + BOOST_CHECK_EQUAL(data->realserver_connect_failed_count, 2); + } + + cout << "[185]--------------------------------------------- " << endl; + //unit_test[185] no rescheduleモード 遷移先ステータスをCLIENT_DISCONNECT設定する + { + boost::asio::ip::tcp::endpoint ep; + + thread_data_ptr data(new session_thread_data_ip); + data->thread_id = boost::this_thread::get_id(); + data->realserver_connect_failed_count = 1; + this->reschedule = 0; + this->session_thread_data_map[boost::this_thread::get_id()] = data; + + ret = this->handle_realserver_connection_fail(boost::this_thread::get_id(), ep); + + //遷移先ステータスを設定する + //CLIENT_DISCONNECT + BOOST_CHECK_EQUAL(ret, CLIENT_DISCONNECT); + BOOST_CHECK_EQUAL(data->last_status, CLIENT_DISCONNECT); + } + + } + + //handle_realserver_connection_fail_thread + void handle_realserver_connection_fail_test_thread() + { + EVENT_TAG ret; + boost::asio::ip::tcp::endpoint ep_err1; + + cout << "[186]--------------------------------------------- " << endl; + //unit_test[186] no rescheduleモード 遷移先ステータスをCLIENT_DISCONNECT設定する + { + boost::asio::ip::tcp::endpoint ep; + + thread_data_ptr data(new session_thread_data_ip); + { + boost::mutex::scoped_lock sclock(session_thread_data_map_mutex); + data->thread_id = boost::this_thread::get_id(); + data->realserver_connect_failed_count = 1; + this->reschedule = 0; + this->session_thread_data_map[boost::this_thread::get_id()] = data; + } + ret = this->handle_realserver_connection_fail(boost::this_thread::get_id(), ep); + { + //遷移先ステータスを設定する + //CLIENT_DISCONNECT + boost::mutex::scoped_lock sclock(session_thread_data_map_mutex); + BOOST_CHECK_EQUAL(ret, CLIENT_DISCONNECT); + BOOST_CHECK_EQUAL(data->last_status, CLIENT_DISCONNECT); + this->session_thread_data_map.erase(boost::this_thread::get_id()); + } + } + } + + //handle_realserver_send + void handle_realserver_send_test() + { + char* data_buffer = new char[MAX_BUFFER_SIZE]; + EVENT_TAG ret; + + char* buffer = NULL; + cout << "[187]--------------------------------------------- " << endl; + //unit_test[187] 異常系 session_thread_data_map中にThreadID対応のデータがない + { + thread_data_ptr thread_data; + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data; + ret = this->handle_realserver_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(ret, FINALIZE);//遷移先ステータスを設定する status = FINALIZE + } + + cout << "[188]--------------------------------------------- " << endl; + //unit_test[188] 異常系 session_thread_data_map中にThreadIDなし場合のテスト + { + this->session_thread_data_map.clear(); + ret = this->handle_realserver_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(ret, FINALIZE);//遷移先ステータスを設定する status = FINALIZE + } + + cout << "[189]--------------------------------------------- " << endl; + //unit_test[189] 未送信データサイズ > 0 データサイズ > 0の場合 status = REALSERVER_CONNECT + { + thread_data_ptr data(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data; + data->current_message_rest_size = 1; + data->data_length = 1; + ret = this->handle_realserver_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(ret, REALSERVER_CONNECT);//遷移先ステータスを設定する + BOOST_CHECK_EQUAL(data->last_status, REALSERVER_CONNECT);//遷移ステータスを保存する + this->session_thread_data_map.clear(); + } + + cout << "[190]--------------------------------------------- " << endl; + //unit_test[190] 未送信データサイズ > 0データサイズが0の場合 データ開始位置が0を設定する status = CLIENT_RECV + { + thread_data_ptr data(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data; + data->current_message_rest_size = 1; + data->data_length = 0; + data->data_offset = 5; + ret = this->handle_realserver_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(ret, CLIENT_RECV);//遷移先ステータスを設定する + BOOST_CHECK_EQUAL(data->last_status, CLIENT_RECV);//遷移ステータスを保存する + BOOST_CHECK_EQUAL(data->data_offset, 0u);// データ開始位置が0を設定する + } + + cout << "[191]--------------------------------------------- " << endl; + //unit_test[191] 未送信データサイズが0 データサイズが0の場合 且つ データ状態がHTTP_BODYの場合 + //unit_test[191] データ状態にHTTP_STARTを設定する status = CLIENT_RECV データ開始位置が0を設定する + { + thread_data_ptr data(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data; + + data->current_message_rest_size = 0; + data->data_length = 0; + data->data_offset = 5; + data->data_state = HTTP_BODY; + ret = this->handle_realserver_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(ret, CLIENT_RECV); + BOOST_CHECK_EQUAL(data->data_state, HTTP_START); + BOOST_CHECK_EQUAL(data->last_status, CLIENT_RECV); + BOOST_CHECK_EQUAL(data->data_offset, 0u); + } + + cout << "[192]--------------------------------------------- " << endl; + //unit_test[192] 未送信データサイズが0 データサイズ > 0の場合 データ状態がHTTP_BODYの場合 + //unit_test[192] 検索結果が該当なしの場合 + //unit_test[192] データ状態がHTTP_STARTを設定する status = CLIENT_RECV + { + thread_data_ptr data(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data; + + char* buffer = "GET /index.html HTTP 1.1\r\nHost:172.16.58.234\r\n"; + data->data_buffer = data_buffer; + memset(data->data_buffer, 0, MAX_BUFFER_SIZE); + memcpy(data->data_buffer, buffer, strlen(buffer)); + data->current_message_rest_size = 0; + data->data_offset = 0; + data->data_length = strlen(buffer); + data->data_state = HTTP_BODY; + ret = this->handle_realserver_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(ret, CLIENT_RECV);// 遷移先ステータスを設定する + BOOST_CHECK_EQUAL(data->data_state, HTTP_START);//データ状態がHTTP_STARTを設定する + BOOST_CHECK_EQUAL(data->last_status, CLIENT_RECV);// 遷移ステータスを保存する + } + + cout << "[193]--------------------------------------------- " << endl; + //unit_test[193] 未送信データサイズが0 データサイズ > 0の場合 データ状態がHTTP_BODYの場合 + //unit_test[193] 検索結果が該当あり チェック結果が異常の場合 + //unit_test[193] データ状態にUNKNOWNを設定する 未送信データサイズにデータサイズを設定する status = REALSERVER_CONNECT + { + thread_data_ptr data(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data; + + buffer = "GET /index.html HTTP 5.5\r\nHost:172.16.58.234\r\n\r\n123455668"; + data->data_buffer = data_buffer; + memset(data->data_buffer, 0, MAX_BUFFER_SIZE); + memcpy(data->data_buffer, buffer, strlen(buffer)); + data->data_offset = 0; + data->current_message_rest_size = 0; + data->data_length = strlen(buffer); + data->data_state = HTTP_BODY; + ret = this->handle_realserver_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(ret, REALSERVER_CONNECT); + BOOST_CHECK_EQUAL(data->data_state, UNKNOWN); + BOOST_CHECK_EQUAL(data->current_message_rest_size, data->data_length); + BOOST_CHECK_EQUAL(data->last_status, REALSERVER_CONNECT); + } + + cout << "[194]--------------------------------------------- " << endl; + //unit_test[194] 未送信データサイズが0 データサイズ > 0の場合 データ状態がHTTP_BODYの場合 + //unit_test[194] 検索結果が該当あり チェック結果が異常の場合 + //unit_test[194] データ状態にUNKNOWNを設定する 未送信データサイズにデータサイズを設定する status = REALSERVER_CONNECT + //\r\n\r\n + { + thread_data_ptr data(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data; + + buffer = "GET /index.html HTTP 5.5\r\n\r\n123455668"; + data->data_buffer = data_buffer; + memset(data->data_buffer, 0, MAX_BUFFER_SIZE); + memcpy(data->data_buffer, buffer, strlen(buffer)); + data->data_offset = 0; + data->current_message_rest_size = 0; + data->data_length = strlen(buffer); + data->data_state = HTTP_BODY; + ret = this->handle_realserver_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(ret, REALSERVER_CONNECT); + BOOST_CHECK_EQUAL(data->data_state, UNKNOWN); + BOOST_CHECK_EQUAL(data->current_message_rest_size, data->data_length); + BOOST_CHECK_EQUAL(data->last_status, REALSERVER_CONNECT); + } + + + cout << "[195]--------------------------------------------- " << endl; + //unit_test[195] 未送信データサイズが0 データサイズ > 0の場合 データ状態がHTTP_BODYの場合 + //unit_test[195] 検索結果が該当あり チェック結果が正常の場合 ContentLengthがなし + //unit_test[195] データ状態にHTTP_HEADERを設定する 未送信データサイズにHTTPヘッダサイズを設定する status = REALSERVER_CONNECT + { + thread_data_ptr data(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data; + + buffer = "GET /index.html HTTP/1.1\r\nHost:172.16.58.234\r\n\r\n12345678"; + data->data_buffer = data_buffer; + memset(data->data_buffer, 0, MAX_BUFFER_SIZE); + memcpy(data->data_buffer, buffer, strlen(buffer)); + data->data_state = HTTP_BODY; + data->data_offset = 0; + data->current_message_rest_size = 0; + data->data_length = strlen(buffer); + ret = this->handle_realserver_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(ret, REALSERVER_CONNECT); + BOOST_CHECK_EQUAL(data->data_state, HTTP_HEADER); + BOOST_CHECK_EQUAL(data->current_message_rest_size, 48u); + BOOST_CHECK_EQUAL(data->last_status, REALSERVER_CONNECT); + } + + cout << "[196]--------------------------------------------- " << endl; + //unit_test[196] 未送信データサイズが0 データサイズ > 0の場合 データ状態がHTTP_BODYの場合 + //unit_test[196] 検索結果が該当あり チェック結果が正常の場合 ContentLengthがなし + //unit_test[196] データ状態にHTTP_HEADERを設定する 未送信データサイズにHTTPヘッダサイズを設定する status = REALSERVER_CONNECT + //\r\n\r\n Only + { + thread_data_ptr data(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data; + + buffer = "GET /index.html HTTP/1.1\r\n\r\n12345678"; + data->data_buffer = data_buffer; + memset(data->data_buffer, 0, MAX_BUFFER_SIZE); + memcpy(data->data_buffer, buffer, strlen(buffer)); + data->data_state = HTTP_BODY; + data->data_offset = 0; + data->current_message_rest_size = 0; + data->data_length = strlen(buffer); + ret = this->handle_realserver_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(ret, REALSERVER_CONNECT); + BOOST_CHECK_EQUAL(data->data_state, HTTP_HEADER); + BOOST_CHECK_EQUAL(data->current_message_rest_size, 28u); + BOOST_CHECK_EQUAL(data->last_status, REALSERVER_CONNECT); + } + + cout << "[197]--------------------------------------------- " << endl; + //unit_test[197] 未送信データサイズが0 データサイズ > 0の場合 データ状態がHTTP_BODYの場合 + //unit_test[197] 検索結果が該当あり チェック結果が正常の場合 ContentLengthがあり + //unit_test[197] データ状態にHTTP_HEADERを設定する 未送信データサイズに「HTTPヘッダサイズ + ContentLength」を設定する status = REALSERVER_CONNECT + { + thread_data_ptr data(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data; + + buffer = "GET /index.html HTTP/1.1\r\nContent-Length: 100\r\nHost:172.16.58.234\r\n\r\n12345678"; + data->data_buffer = data_buffer; + memset(data->data_buffer, 0, MAX_BUFFER_SIZE); + memcpy(data->data_buffer, buffer, strlen(buffer)); + data->current_message_rest_size = 0; + data->data_length = strlen(buffer); + data->data_state = HTTP_BODY; + data->data_offset = 0; + ret = this->handle_realserver_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(ret, REALSERVER_CONNECT); + BOOST_CHECK_EQUAL(data->data_state, HTTP_HEADER); + BOOST_CHECK_EQUAL(data->current_message_rest_size, (69u+100u)); + BOOST_CHECK_EQUAL(data->last_status, REALSERVER_CONNECT); + } + + cout << "[198]--------------------------------------------- " << endl; + //unit_test[198]未送信データサイズが0の場合 + //unit_test[198] データサイズが0の場合 + //unit_test[198] データ状態がHTTP_BODYの場合 + //unit_test[198] データ状態にHTTP_STARTを設定する + //unit_test[198] status = CLIENT_RECV + //unit_test[198] データ開始位置が0を設定する + { + thread_data_ptr data(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data; + + data->current_message_rest_size = 0; + data->data_length = 0; + data->data_offset = 5; + data->data_state = HTTP_BODY; + ret = this->handle_realserver_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(ret, CLIENT_RECV); + BOOST_CHECK_EQUAL(data->data_state, HTTP_START); + BOOST_CHECK_EQUAL(data->last_status, CLIENT_RECV); + BOOST_CHECK_EQUAL(data->data_offset, 0u); + + } + cout << "[199]--------------------------------------------- " << endl; + //unit_test[199] 未送信データサイズが0の場合 + //unit_test[199] データサイズが0の場合 + //unit_test[199] データ状態がHTTP_HEADERの場合 + //unit_test[199] status = CLIENT_RECV + //unit_test[199] データ開始位置が0を設定する + { + thread_data_ptr data(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data; + + data->current_message_rest_size = 0; + data->data_length = 0; + data->data_offset = 5; + data->data_state = HTTP_HEADER; + ret = this->handle_realserver_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(ret, CLIENT_RECV); + BOOST_CHECK_EQUAL(data->data_state, HTTP_HEADER); + BOOST_CHECK_EQUAL(data->last_status, CLIENT_RECV); + BOOST_CHECK_EQUAL(data->data_offset, 0u); + + } + + cout << "[200]--------------------------------------------- " << endl; + //unit_test[200] 未送信データサイズが0の場合 + //unit_test[200] データサイズが0の場合 + //unit_test[200] データ状態がUNKNOWNの場合 + //unit_test[200] status = CLIENT_RECV + //unit_test[200] データ開始位置が0を設定する + { + thread_data_ptr data(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data; + + data->current_message_rest_size = 0; + data->data_length = 0; + data->data_offset = 5; + data->data_state = UNKNOWN; + ret = this->handle_realserver_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(ret, CLIENT_RECV); + BOOST_CHECK_EQUAL(data->data_state, UNKNOWN); + BOOST_CHECK_EQUAL(data->last_status, CLIENT_RECV); + BOOST_CHECK_EQUAL(data->data_offset, 0u); + + } + + + } + + //handle_realserver_send + void handle_realserver_send_test_thread() + { + EVENT_TAG ret; + + cout << "[201]--------------------------------------------- " << endl; + //unit_test[201] 未送信データサイズが0の場合 + //unit_test[201] データサイズが0の場合 + //unit_test[201] データ状態がUNKNOWNの場合 + //unit_test[201] status = CLIENT_RECV + //unit_test[201] データ開始位置が0を設定する + { + thread_data_ptr data(new session_thread_data_ip); + { + boost::mutex::scoped_lock sclock(session_thread_data_map_mutex); + this->session_thread_data_map[boost::this_thread::get_id()] = data; + + data->current_message_rest_size = 0; + data->data_length = 0; + data->data_offset = 5; + data->data_state = UNKNOWN; + } + ret = this->handle_realserver_send(boost::this_thread::get_id()); + { + boost::mutex::scoped_lock sclock(session_thread_data_map_mutex); + BOOST_CHECK_EQUAL(ret, CLIENT_RECV); + BOOST_CHECK_EQUAL(data->data_state, UNKNOWN); + BOOST_CHECK_EQUAL(data->last_status, CLIENT_RECV); + BOOST_CHECK_EQUAL(data->data_offset, 0u); + this->session_thread_data_map.erase(boost::this_thread::get_id()); + } + } + } + + //handle_sorryserver_select + void handle_sorryserver_select_test() + { + boost::asio::ip::tcp::endpoint ep; + EVENT_TAG ret; + cout << "[202]--------------------------------------------- " << endl; + //unit_test[202] データ状態がHTTP_STARTの場合 + { + //up,down thread map + thread_data_ptr dataup(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = dataup; + dataup->thread_id = boost::this_thread::get_id(); + dataup->data_state = HTTP_START; + + ret = this->handle_sorryserver_select(boost::this_thread::get_id(), ep); + + //遷移先ステータス status = CLIENT_RECV + BOOST_CHECK_EQUAL(ret, CLIENT_RECV); + //遷移ステータスを保存する last_status = CLIENT_RECV; + BOOST_CHECK_EQUAL(dataup->last_status, CLIENT_RECV); + } + + cout << "[203]--------------------------------------------- " << endl; + //unit_test[203] データ状態がHTTP_HEADERの場合 + { + thread_data_ptr dataup(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = dataup; + dataup->thread_id = boost::this_thread::get_id(); + dataup->data_state = HTTP_HEADER; + ret = this->handle_sorryserver_select(boost::this_thread::get_id(), ep); + //遷移先ステータス status = SORRYSERVER_CONNECT + BOOST_CHECK_EQUAL(ret, SORRYSERVER_CONNECT); + //遷移ステータスを保存する last_status = SORRYSERVER_CONNECT; + BOOST_CHECK_EQUAL(dataup->last_status, SORRYSERVER_CONNECT); + } + + cout << "[204]--------------------------------------------- " << endl; + //unit_test[204] データ状態がHTTP_BODYの場合 + { + thread_data_ptr dataup(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = dataup; + dataup->thread_id = boost::this_thread::get_id(); + dataup->data_state = HTTP_BODY; + ret = this->handle_sorryserver_select(boost::this_thread::get_id(), ep); + //遷移先ステータス status = SORRYSERVER_CONNECT + BOOST_CHECK_EQUAL(ret, SORRYSERVER_CONNECT); + //遷移ステータスを保存する last_status = SORRYSERVER_CONNECT; + BOOST_CHECK_EQUAL(dataup->last_status, SORRYSERVER_CONNECT); + } + + cout << "[205]--------------------------------------------- " << endl; + //unit_test[205] データ状態がUNKNOWNの場合 + { + thread_data_ptr dataup(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = dataup; + dataup->thread_id = boost::this_thread::get_id(); + dataup->data_state = UNKNOWN; + ret = this->handle_sorryserver_select(boost::this_thread::get_id(), ep); + //遷移先ステータス status = SORRYSERVER_CONNECT + BOOST_CHECK_EQUAL(ret, SORRYSERVER_CONNECT); + //遷移ステータスを保存する last_status = SORRYSERVER_CONNECT; + BOOST_CHECK_EQUAL(dataup->last_status, SORRYSERVER_CONNECT); + } + + + { + cout << "[206]--------------------------------------------- " << endl; + //unit_test[206] session_thread_data_map中に上りスレッド中にThreadID対応のデータがない + this->session_thread_data_map[boost::this_thread::get_id()].reset(); + ret = this->handle_sorryserver_select(boost::this_thread::get_id(), ep); + + //遷移先ステータスを設定する status = FINALIZE + BOOST_CHECK_EQUAL(ret, FINALIZE); + } + + { + cout << "[207]--------------------------------------------- " << endl; + //unit_test[207] session_thread_data_map中に上りスレッドのデータ無し場合のテスト + this->session_thread_data_map.erase(boost::this_thread::get_id()); + ret = this->handle_sorryserver_select(boost::this_thread::get_id(), ep); + + //遷移先ステータスを設定する status = FINALIZE + BOOST_CHECK_EQUAL(ret, FINALIZE); + } + + cout << "[208]--------------------------------------------- " << endl; + //unit_test[208] session_thread_data_map中に上りスレッドと下りスレッドのデータ無し場合のテスト + { + this->session_thread_data_map.clear(); + ret = this->handle_sorryserver_select(boost::this_thread::get_id(), ep); + + //遷移先ステータスを設定する status = FINALIZE + BOOST_CHECK_EQUAL(ret, FINALIZE); + } + } + + + void handle_sorryserver_select_test_thread() + { + boost::asio::ip::tcp::endpoint ep; + EVENT_TAG ret; + cout << "[209]--------------------------------------------- " << endl; + //unit_test[209] データ状態がHTTP_STARTの場合 + { + //up,down thread map + thread_data_ptr dataup(new session_thread_data_ip); + { + boost::mutex::scoped_lock sclock(session_thread_data_map_mutex); + this->session_thread_data_map[boost::this_thread::get_id()] = dataup; + dataup->thread_id = boost::this_thread::get_id(); + dataup->data_state = HTTP_START; + } + ret = this->handle_sorryserver_select(boost::this_thread::get_id(), ep); + { + boost::mutex::scoped_lock sclock(session_thread_data_map_mutex); + //遷移先ステータス status = CLIENT_RECV + BOOST_CHECK_EQUAL(ret, CLIENT_RECV); + //遷移ステータスを保存する last_status = CLIENT_RECV; + BOOST_CHECK_EQUAL(dataup->last_status, CLIENT_RECV); + this->session_thread_data_map.erase(boost::this_thread::get_id()); + } + } + } + + //handle_sorryserver_connect + void handle_sorryserver_connect_test() + { + size_t send_buffer_len = USE_BUFFER_SIZE; + boost::array send_buffer; + EVENT_TAG ret; + int cmp_ret = 0; + + cout << "[210]--------------------------------------------- " << endl; + //unit_test[210] session_thread_dataがNULLの場合 status = FINALIZE + thread_data_ptr session_data; + this->session_thread_data_map[boost::this_thread::get_id()] = session_data; + ret = handle_sorryserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + BOOST_CHECK_EQUAL(ret, FINALIZE); + + cout << "[211]--------------------------------------------- " << endl; + //unit_test[211] thread_id対応のデータなしの場合 status = FINALIZE + this->session_thread_data_map.clear(); + ret = handle_sorryserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + BOOST_CHECK_EQUAL(ret, FINALIZE); + + cout << "[212]--------------------------------------------- " << endl; + //unit_test[212] 送信データリストが空の場合 + //unit_test[212] データ状態がHTTP_HEADER + //unit_test[212] 送信元設定指示設定フラグをONの場合 + //unit_test[212] データ状態にHTTP_BODYを設定する + //unit_test[212] status = SORRYSERVER_SEND + //unit_test[212] uriを置き換える + //unit_test[212] X-Forworded-For文字列を添加する + { + thread_data_ptr thread_data(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data; + thread_data->client_endpoint = string_to_endpoint ("10.10.10.10:8888"); + thread_data->data_state = HTTP_HEADER; + this->forwarded_for = FORWARDED_FOR_ON; + send_buffer.assign('0'); + strcpy(this->sorry_uri.data(), "/sorry.html"); + thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset(thread_data->data_buffer, 0, MAX_BUFFER_SIZE); + char *http_header_ptr = "POST / HTTP/1.0\r\nContent-Length: 65493\r\n\r\n"; + size_t http_header_len = strlen(http_header_ptr); + memcpy(thread_data->data_buffer, http_header_ptr, http_header_len); + thread_data->data_length = http_header_len; + thread_data->data_offset = 0u; + thread_data->current_message_rest_size = http_header_len + 65493u; + thread_data->data_buffer_size = MAX_BUFFER_SIZE; + + ret = handle_sorryserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + + char * send_buffer_context = "POST /sorry.html HTTP/1.0\r\nX-Forwarded-For: 10.10.10.10\r\nContent-Length: 65493\r\n\r\n"; + cmp_ret = memcmp(send_buffer.c_array(), send_buffer_context, strlen(send_buffer_context)); + BOOST_CHECK_EQUAL(cmp_ret, 0);// uriを置き換えし、X-Forworded-For文字列を添加する + BOOST_CHECK_EQUAL(ret, SORRYSERVER_SEND);// 遷移先ステータスを設定する + BOOST_CHECK_EQUAL(thread_data->last_status, SORRYSERVER_SEND);// 遷移ステータスを保存する + BOOST_CHECK_EQUAL(thread_data->data_state, HTTP_BODY);// データ状態にHTTP_BODYを設定する + BOOST_CHECK_EQUAL(send_buffer_len, strlen(send_buffer_context)); + BOOST_CHECK_EQUAL(thread_data->buffer_sequence.empty(), true); + BOOST_CHECK_EQUAL(thread_data->current_message_rest_size, 65493u); + BOOST_CHECK_EQUAL(thread_data->data_length, 0u); + BOOST_CHECK_EQUAL(thread_data->data_offset, http_header_len); + delete [] thread_data->data_buffer; + this->session_thread_data_map.clear(); + } + + cout << "[213]--------------------------------------------- " << endl; + //unit_test[213] 送信データリストが空の場合 + //unit_test[213] データ状態がHTTP_HEADER + //unit_test[213] 送信元設定指示設定フラグをOFFの場合 + //unit_test[213] データ状態にHTTP_BODYを設定する + //unit_test[213] status = SORRYSERVER_SEND + //unit_test[213] uriを置き換える + { + thread_data_ptr thread_data(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data; + thread_data->data_state = HTTP_HEADER; + this->forwarded_for = FORWARDED_FOR_OFF; + send_buffer.assign('0'); + strcpy(this->sorry_uri.data(), "/sorry.html"); + thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset(thread_data->data_buffer, 0, MAX_BUFFER_SIZE); + char *http_header_ptr = "POST / HTTP/1.0\r\nContent-Length: 65493\r\n\r\n"; + size_t http_header_len = strlen(http_header_ptr); + memcpy(thread_data->data_buffer, http_header_ptr, http_header_len); + thread_data->data_length = http_header_len; + thread_data->data_offset = 0u; + thread_data->current_message_rest_size = http_header_len + 65493u; + thread_data->data_buffer_size = MAX_BUFFER_SIZE; + + ret = handle_sorryserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + + char * send_buffer_context = "POST /sorry.html HTTP/1.0\r\nContent-Length: 65493\r\n\r\n"; + cmp_ret = memcmp(send_buffer.c_array(), send_buffer_context, strlen(send_buffer_context)); + BOOST_CHECK_EQUAL(ret, SORRYSERVER_SEND);// 遷移先ステータスを設定する + BOOST_CHECK_EQUAL(thread_data->last_status, SORRYSERVER_SEND);// 遷移ステータスを保存する + BOOST_CHECK_EQUAL(thread_data->data_state, HTTP_BODY);// データ状態にHTTP_BODYを設定する + BOOST_CHECK_EQUAL(send_buffer_len, http_header_len + 10);//sorry_uri's length + BOOST_CHECK_EQUAL(cmp_ret, 0);// 送信バッファにデータを送信可能サイズ分コピーする + BOOST_CHECK_EQUAL(thread_data->current_message_rest_size, 65493u);// 未送信データサイズに送信可能サイズを減算する + BOOST_CHECK_EQUAL(thread_data->data_length, 0u); + BOOST_CHECK_EQUAL(thread_data->data_offset, http_header_len);// データ開始位置に送信可能サイズを加算する + delete[] thread_data->data_buffer; + + this->session_thread_data_map.clear(); + + } + + cout << "[214]--------------------------------------------- " << endl; + //unit_test[214] 送信データリストが空の場合 + //unit_test[214] データ状態がHTTP_BODY + //unit_test[214] status = SORRYSERVER_SEND + //unit_test[214] uriを置き換える + { + thread_data_ptr thread_data(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data; + thread_data->data_state = HTTP_BODY; + send_buffer.assign('0'); + thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset(thread_data->data_buffer, 0, MAX_BUFFER_SIZE); + char* http_header_ptr = "1234567890"; + size_t http_header_len = strlen(http_header_ptr); + memcpy(thread_data->data_buffer + 50u, http_header_ptr, http_header_len); + thread_data->data_length = http_header_len; + thread_data->data_offset = 50u; + thread_data->current_message_rest_size = 100; + thread_data->data_buffer_size = MAX_BUFFER_SIZE; + + ret = handle_sorryserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + + BOOST_CHECK_EQUAL(ret, SORRYSERVER_SEND);// 遷移先ステータスを設定する + BOOST_CHECK_EQUAL(thread_data->last_status, SORRYSERVER_SEND);// 遷移ステータスを保存する + BOOST_CHECK_EQUAL(send_buffer_len, http_header_len); + cmp_ret = memcmp(send_buffer.c_array(),http_header_ptr,http_header_len); + BOOST_CHECK_EQUAL(cmp_ret, 0);// 送信バッファにデータを送信可能サイズ分コピーする + BOOST_CHECK_EQUAL(thread_data->current_message_rest_size, 90u);// 未送信データサイズに送信可能サイズを減算する + BOOST_CHECK_EQUAL(thread_data->data_length, 0u); + BOOST_CHECK_EQUAL(thread_data->data_offset, 50u + http_header_len);// データ開始位置に送信可能サイズを加算する + delete[] thread_data->data_buffer; + this->session_thread_data_map.clear(); + } + + + cout << "[215]--------------------------------------------- " << endl; + //unit_test[215] 送信データリストが空の場合 + //unit_test[215] データ状態がUNKNOWN + //unit_test[215] status = SORRYSERVER_SEND + //unit_test[215] uriを置き換える + { + + thread_data_ptr thread_data(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data; + thread_data->data_state = UNKNOWN; + send_buffer.assign('0'); + thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset(thread_data->data_buffer, 0, MAX_BUFFER_SIZE); + char* http_header_ptr = "1234567890"; + size_t http_header_len = strlen(http_header_ptr); + memcpy(thread_data->data_buffer + 50u, http_header_ptr, http_header_len); + thread_data->data_length = http_header_len; + thread_data->data_offset = 50u; + thread_data->current_message_rest_size = 100; + thread_data->data_buffer_size = MAX_BUFFER_SIZE; + + ret = handle_sorryserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + + BOOST_CHECK_EQUAL(ret, SORRYSERVER_SEND);// 遷移先ステータスを設定する + BOOST_CHECK_EQUAL(thread_data->last_status, SORRYSERVER_SEND);// 遷移ステータスを保存する + BOOST_CHECK_EQUAL(send_buffer_len, http_header_len); + cmp_ret = memcmp(send_buffer.c_array(),http_header_ptr,http_header_len); + BOOST_CHECK_EQUAL(cmp_ret, 0);// 送信バッファにデータを送信可能サイズ分コピーする + BOOST_CHECK_EQUAL(thread_data->current_message_rest_size, 90u);// 未送信データサイズに送信可能サイズを減算する + BOOST_CHECK_EQUAL(thread_data->data_length, 0u); + BOOST_CHECK_EQUAL(thread_data->data_offset, 50u + http_header_len);// データ開始位置に送信可能サイズを加算する + delete[] thread_data->data_buffer; + this->session_thread_data_map.clear(); + } + + cout << "[216]--------------------------------------------- " << endl; + //unit_test[216] 送信データリストが空ではないの場合(size = 1) + //unit_test[216] status = SORRYSERVER_SEND + //unit_test[216] 送信バッファにデータをコピーし + { + + thread_data_ptr thread_data(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data; + send_buffer.assign('0'); + send_buffer_len = 0; + thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset(thread_data->data_buffer, 0, MAX_BUFFER_SIZE); + char* http_header_ptr = "Get / HTTP/1.0\r\nContent-Length: 200\r\n\r\n"; + size_t http_header_len = strlen(http_header_ptr); + memcpy(thread_data->data_buffer, http_header_ptr, http_header_len); + thread_data->data_length = http_header_len - 15; //ship "Get / HTTP/1.0\r\n" + thread_data->data_offset = 15;//"Get / HTTP/1.0\r\n" is already sent + thread_data->current_message_rest_size = http_header_len - 15 + 200; + thread_data->data_buffer_size = MAX_BUFFER_SIZE; + std::pair buffer_element = std::make_pair(thread_data->data_buffer + 15, thread_data->data_length); + thread_data->buffer_sequence.push_back(buffer_element); + + ret = handle_sorryserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + + BOOST_CHECK_EQUAL(ret, SORRYSERVER_SEND);// 遷移先ステータスを設定する + BOOST_CHECK_EQUAL(thread_data->last_status, SORRYSERVER_SEND);// 遷移ステータスを保存する + BOOST_CHECK_EQUAL(send_buffer_len, http_header_len -15); + cmp_ret = memcmp(send_buffer.c_array(),thread_data->data_buffer + 15u, send_buffer_len); + BOOST_CHECK_EQUAL(cmp_ret, 0);// 送信バッファにデータを送信可能サイズ分コピーする + BOOST_CHECK_EQUAL(thread_data->current_message_rest_size, 200u);// 未送信データサイズに送信可能サイズを減算する + BOOST_CHECK_EQUAL(thread_data->data_length, 0u); + BOOST_CHECK_EQUAL(thread_data->data_offset, http_header_len);// データ開始位置に送信可能サイズを加算する + BOOST_CHECK_EQUAL(thread_data->buffer_sequence.empty(), true); + this->session_thread_data_map.clear(); + delete[] thread_data->data_buffer; + } + + cout << "[217]--------------------------------------------- " << endl; + //unit_test[217] 送信データリストが空ではないの場合(size = 2) + //unit_test[217] status = SORRYSERVER_SEND + //unit_test[217] 送信バッファにデータをコピーし + { + thread_data_ptr thread_data(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data; + send_buffer.assign('0'); + send_buffer_len = 0; + thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset(thread_data->data_buffer, 0, MAX_BUFFER_SIZE); + char* http_header_ptr = "Get / HTTP/1.0\r\nContent-Length: 200\r\n\r\n"; + size_t http_header_len = strlen(http_header_ptr); + memcpy(thread_data->data_buffer, http_header_ptr, http_header_len); + thread_data->data_length = http_header_len - 16; //ship "Get / HTTP/1.0\r\n" + thread_data->data_offset = 16;//"Get / HTTP/1.0\r\n"is already sent + thread_data->current_message_rest_size = http_header_len - 16 + 200; + thread_data->data_buffer_size = MAX_BUFFER_SIZE; + this->forwarded_for = FORWARDED_FOR_ON; + thread_data->forwarded_for_buffer.assign('0'); + memcpy(thread_data->forwarded_for_buffer.data(), "X-Forwarded-For: 172.16.58.24\r\n", 31); + std::pair buffer_element = std::make_pair(thread_data->forwarded_for_buffer.data(), 31); + thread_data->buffer_sequence.push_back(buffer_element); + + buffer_element = std::make_pair(thread_data->data_buffer + 16, thread_data->data_length); + thread_data->buffer_sequence.push_back(buffer_element); + + ret = handle_sorryserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + + char * send_buffer_context = "X-Forwarded-For: 172.16.58.24\r\nContent-Length: 200\r\n\r\n"; + BOOST_CHECK_EQUAL(ret, SORRYSERVER_SEND);// 遷移先ステータスを設定する + BOOST_CHECK_EQUAL(thread_data->last_status, SORRYSERVER_SEND);// 遷移ステータスを保存する + BOOST_CHECK_EQUAL(send_buffer_len, strlen(send_buffer_context));// 送信データサイズに送信可能サイズを設定する + cmp_ret = memcmp(send_buffer.c_array(),send_buffer_context, send_buffer_len); + BOOST_CHECK_EQUAL(cmp_ret, 0);// 送信バッファにデータを送信可能サイズ分コピーする + BOOST_CHECK_EQUAL(thread_data->current_message_rest_size, 200u);// 未送信データサイズに送信可能サイズを減算する + BOOST_CHECK_EQUAL(thread_data->data_length, 0u); + BOOST_CHECK_EQUAL(thread_data->data_offset, http_header_len);// データ開始位置に送信可能サイズを加算する + BOOST_CHECK_EQUAL(thread_data->buffer_sequence.empty(), true); + this->session_thread_data_map.clear(); + delete[] thread_data->data_buffer; + } + + cout << "[218]--------------------------------------------- " << endl; + //unit_test[218] 送信データリストが空ではないの場合(size = 3) + //unit_test[218] status = SORRYSERVER_SEND + //unit_test[218] 送信バッファにデータをコピーし + { + thread_data_ptr thread_data(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data; + send_buffer.assign('0'); + send_buffer_len = 0; + thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset(thread_data->data_buffer, 0, MAX_BUFFER_SIZE); + char* http_header_ptr = "Get / HTTP/1.0\r\nContent-Length: 200\r\n\r\n"; + size_t http_header_len = strlen(http_header_ptr); + memcpy(thread_data->data_buffer, http_header_ptr, http_header_len); + thread_data->data_length = http_header_len - 6; //ship "Get / " + thread_data->data_offset = 6;//"Get / "is already sent + thread_data->current_message_rest_size = http_header_len - 6 + 200; + thread_data->data_buffer_size = MAX_BUFFER_SIZE; + + //HTTP/1.0 \r\n + std::pair buffer_element = std::make_pair(thread_data->data_buffer + thread_data->data_offset, 10); + thread_data->buffer_sequence.push_back(buffer_element); + + this->forwarded_for = FORWARDED_FOR_ON; + thread_data->forwarded_for_buffer.assign('0'); + memcpy(thread_data->forwarded_for_buffer.data(), "X-Forwarded-For: 172.16.58.24\r\n", 31); + buffer_element = std::make_pair(thread_data->forwarded_for_buffer.data(), 31); + thread_data->buffer_sequence.push_back(buffer_element); + + buffer_element = std::make_pair(thread_data->data_buffer + 16, 23); + thread_data->buffer_sequence.push_back(buffer_element); + + ret = handle_sorryserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + + char * send_buffer_context = "HTTP/1.0\r\nX-Forwarded-For: 172.16.58.24\r\nContent-Length: 200\r\n\r\n"; + BOOST_CHECK_EQUAL(ret, SORRYSERVER_SEND);// 遷移先ステータスを設定する + BOOST_CHECK_EQUAL(thread_data->last_status, SORRYSERVER_SEND);// 遷移ステータスを保存する + BOOST_CHECK_EQUAL(send_buffer_len, strlen(send_buffer_context));// 送信データサイズに送信可能サイズを設定する + cmp_ret = memcmp(send_buffer.c_array(),send_buffer_context, send_buffer_len); + BOOST_CHECK_EQUAL(cmp_ret, 0);// 送信バッファにデータを送信可能サイズ分コピーする + BOOST_CHECK_EQUAL(thread_data->current_message_rest_size, 200u);// 未送信データサイズに送信可能サイズを減算する + BOOST_CHECK_EQUAL(thread_data->data_length, 0u); + BOOST_CHECK_EQUAL(thread_data->data_offset, http_header_len);// データ開始位置に送信可能サイズを加算する + BOOST_CHECK_EQUAL(thread_data->buffer_sequence.empty(), true); + this->session_thread_data_map.clear(); + delete[] thread_data->data_buffer; + } + + cout << "[219]--------------------------------------------- " << endl; + //unit_test[219] 送信データリストが空ではないの場合(size = 4) + //unit_test[219] status = SORRYSERVER_SEND + //unit_test[219] 送信バッファにデータをコピーし + { + thread_data_ptr thread_data(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data; + send_buffer.assign('0'); + send_buffer_len = 0; + thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset(thread_data->data_buffer, 0, MAX_BUFFER_SIZE); + char* http_header_ptr = "Get / HTTP/1.0\r\nContent-Length: 200\r\n\r\n"; + size_t http_header_len = strlen(http_header_ptr); + memcpy(thread_data->data_buffer, http_header_ptr, http_header_len); + thread_data->data_length = http_header_len - 4; //ship "Get " + thread_data->data_offset = 4;//"Get /"is already sent + thread_data->current_message_rest_size = http_header_len - 4 + 200; + thread_data->data_buffer_size = MAX_BUFFER_SIZE; + + //sorry_uri + this->sorry_uri.assign(0); + strcpy(this->sorry_uri.data(), "/sorry.html"); + std::pair buffer_element = std::make_pair(this->sorry_uri.data(), 11); + thread_data->buffer_sequence.push_back(buffer_element); + + // HTTP/1.0\r\n + buffer_element = std::make_pair(thread_data->data_buffer + 5, 11); + thread_data->buffer_sequence.push_back(buffer_element); + + this->forwarded_for = FORWARDED_FOR_ON; + thread_data->forwarded_for_buffer.assign('0'); + memcpy(thread_data->forwarded_for_buffer.data(), "X-Forwarded-For: 172.16.58.24\r\n", 31); + buffer_element = std::make_pair(thread_data->forwarded_for_buffer.data(), 31); + thread_data->buffer_sequence.push_back(buffer_element); + + buffer_element = std::make_pair(thread_data->data_buffer + 16, 23); + thread_data->buffer_sequence.push_back(buffer_element); + + ret = handle_sorryserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + + char * send_buffer_context = "/sorry.html HTTP/1.0\r\nX-Forwarded-For: 172.16.58.24\r\nContent-Length: 200\r\n\r\n"; + BOOST_CHECK_EQUAL(ret, SORRYSERVER_SEND);// 遷移先ステータスを設定する + BOOST_CHECK_EQUAL(thread_data->last_status, SORRYSERVER_SEND);// 遷移ステータスを保存する + BOOST_CHECK_EQUAL(send_buffer_len, strlen(send_buffer_context));// 送信データサイズに送信可能サイズを設定する + cmp_ret = memcmp(send_buffer.c_array(),send_buffer_context, send_buffer_len); + BOOST_CHECK_EQUAL(cmp_ret, 0);// 送信バッファにデータを送信可能サイズ分コピーする + BOOST_CHECK_EQUAL(thread_data->current_message_rest_size, 200u);// 未送信データサイズに送信可能サイズを減算する + BOOST_CHECK_EQUAL(thread_data->data_length, 0u); + BOOST_CHECK_EQUAL(thread_data->data_offset, http_header_len);// データ開始位置に送信可能サイズを加算する + BOOST_CHECK_EQUAL(thread_data->buffer_sequence.empty(), true); + this->session_thread_data_map.clear(); + delete[] thread_data->data_buffer; + } + + cout << "[220]--------------------------------------------- " << endl; + //unit_test[220] 送信データリストが空ではないの場合(size = 5) + //unit_test[220] status = SORRYSERVER_SEND + //unit_test[220] 送信バッファにデータをコピーし + { + thread_data_ptr thread_data(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data; + send_buffer.assign('0'); + send_buffer_len = 0; + thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset(thread_data->data_buffer, 0, MAX_BUFFER_SIZE); + char* http_header_ptr = "Get / HTTP/1.0\r\nContent-Length: 200\r\n\r\n"; + size_t http_header_len = strlen(http_header_ptr); + memcpy(thread_data->data_buffer, http_header_ptr, http_header_len); + thread_data->data_length = http_header_len - 2; //ship "Ge" + thread_data->data_offset = 2;//"Ge"is already sent + thread_data->current_message_rest_size = http_header_len - 2 + 200; + thread_data->data_buffer_size = MAX_BUFFER_SIZE; + + std::pair buffer_element = std::make_pair(thread_data->data_buffer + thread_data->data_offset, 2); + thread_data->buffer_sequence.push_back(buffer_element); + + //sorry_uri + this->sorry_uri.assign(0); + strcpy(this->sorry_uri.data(), "/sorry.html"); + buffer_element = std::make_pair(this->sorry_uri.data(), 11); + thread_data->buffer_sequence.push_back(buffer_element); + + // HTTP/1.0 \r\n + buffer_element = std::make_pair(thread_data->data_buffer + 5, 11); + thread_data->buffer_sequence.push_back(buffer_element); + + this->forwarded_for = FORWARDED_FOR_ON; + thread_data->forwarded_for_buffer.assign('0'); + memcpy(thread_data->forwarded_for_buffer.data(), "X-Forwarded-For: 172.16.58.24\r\n", 31); + buffer_element = std::make_pair(thread_data->forwarded_for_buffer.data(), 31); + thread_data->buffer_sequence.push_back(buffer_element); + + buffer_element = std::make_pair(thread_data->data_buffer + 16, 23); + thread_data->buffer_sequence.push_back(buffer_element); + + ret = handle_sorryserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + + char * send_buffer_context = "t /sorry.html HTTP/1.0\r\nX-Forwarded-For: 172.16.58.24\r\nContent-Length: 200\r\n\r\n"; + BOOST_CHECK_EQUAL(ret, SORRYSERVER_SEND);// 遷移先ステータスを設定する + BOOST_CHECK_EQUAL(thread_data->last_status, SORRYSERVER_SEND);// 遷移ステータスを保存する + BOOST_CHECK_EQUAL(send_buffer_len, strlen(send_buffer_context));// 送信データサイズに送信可能サイズを設定する + cmp_ret = memcmp(send_buffer.c_array(),send_buffer_context, send_buffer_len); + BOOST_CHECK_EQUAL(cmp_ret, 0);// 送信バッファにデータを送信可能サイズ分コピーする + BOOST_CHECK_EQUAL(thread_data->current_message_rest_size, 200u);// 未送信データサイズに送信可能サイズを減算する + BOOST_CHECK_EQUAL(thread_data->data_length, 0u); + BOOST_CHECK_EQUAL(thread_data->data_offset, http_header_len);// データ開始位置に送信可能サイズを加算する + BOOST_CHECK_EQUAL(thread_data->buffer_sequence.empty(), true); + this->session_thread_data_map.clear(); + delete[] thread_data->data_buffer; + } + + + } + + //handle_sorryserver_connect_test_thread + void handle_sorryserver_connect_test_thread() + { + size_t send_buffer_len = USE_BUFFER_SIZE; + boost::array send_buffer; + EVENT_TAG ret; + int cmp_ret = 0; + size_t http_header_len; + cout << "[221]--------------------------------------------- " << endl; + //unit_test[221] 送信データリストが空ではないの場合(size = 5) + //unit_test[221] status = SORRYSERVER_SEND + //unit_test[221] 送信バッファにデータをコピーし + { + thread_data_ptr thread_data(new session_thread_data_ip); + { + boost::mutex::scoped_lock sclock(session_thread_data_map_mutex); + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data; + send_buffer.assign('0'); + send_buffer_len = 0; + thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset(thread_data->data_buffer, 0, MAX_BUFFER_SIZE); + char* http_header_ptr = "Get / HTTP/1.0\r\nContent-Length: 200\r\n\r\n"; + http_header_len = strlen(http_header_ptr); + memcpy(thread_data->data_buffer, http_header_ptr, http_header_len); + thread_data->data_length = http_header_len - 2; //ship "Ge" + thread_data->data_offset = 2;//"Ge"is already sent + thread_data->current_message_rest_size = http_header_len - 2 + 200; + thread_data->data_buffer_size = MAX_BUFFER_SIZE; + + std::pair buffer_element = std::make_pair(thread_data->data_buffer + thread_data->data_offset, 2); + thread_data->buffer_sequence.push_back(buffer_element); + + //sorry_uri + this->sorry_uri.assign(0); + strcpy(this->sorry_uri.data(), "/sorry.html"); + buffer_element = std::make_pair(this->sorry_uri.data(), 11); + thread_data->buffer_sequence.push_back(buffer_element); + + // HTTP/1.0\r\n + buffer_element = std::make_pair(thread_data->data_buffer + 5, 11); + thread_data->buffer_sequence.push_back(buffer_element); + + this->forwarded_for = FORWARDED_FOR_ON; + thread_data->forwarded_for_buffer.assign('0'); + memcpy(thread_data->forwarded_for_buffer.data(), "X-Forwarded-For: 172.16.58.24\r\n", 31); + buffer_element = std::make_pair(thread_data->forwarded_for_buffer.data(), 31); + thread_data->buffer_sequence.push_back(buffer_element); + + buffer_element = std::make_pair(thread_data->data_buffer + 16, 23); + thread_data->buffer_sequence.push_back(buffer_element); + } + + ret = handle_sorryserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + { + boost::mutex::scoped_lock sclock(session_thread_data_map_mutex); + char * send_buffer_context = "t /sorry.html HTTP/1.0\r\nX-Forwarded-For: 172.16.58.24\r\nContent-Length: 200\r\n\r\n"; + BOOST_CHECK_EQUAL(ret, SORRYSERVER_SEND);// 遷移先ステータスを設定する + BOOST_CHECK_EQUAL(thread_data->last_status, SORRYSERVER_SEND);// 遷移ステータスを保存する + BOOST_CHECK_EQUAL(send_buffer_len, strlen(send_buffer_context));// 送信データサイズに送信可能サイズを設定する + cmp_ret = memcmp(send_buffer.c_array(),send_buffer_context, send_buffer_len); + BOOST_CHECK_EQUAL(cmp_ret, 0);// 送信バッファにデータを送信可能サイズ分コピーする + BOOST_CHECK_EQUAL(thread_data->current_message_rest_size, 200u);// 未送信データサイズに送信可能サイズを減算する + BOOST_CHECK_EQUAL(thread_data->data_length, 0u); + BOOST_CHECK_EQUAL(thread_data->data_offset, http_header_len);// データ開始位置に送信可能サイズを加算する + BOOST_CHECK_EQUAL(thread_data->buffer_sequence.empty(), true); + this->session_thread_data_map.erase(boost::this_thread::get_id()); + delete[] thread_data->data_buffer; + } + } + } + + //handle_sorryserver_connection_fail + void handle_sorryserver_connection_fail_test() + { + EVENT_TAG ret; + + cout << "[222]--------------------------------------------- " << endl; + //unit_test[222] 異常系 session_thread_data_map中にThreadID対応のデータがない + //unit_test[222] 遷移先ステータスを設定する status = FINALIZE + this->session_thread_data_map.clear(); + this->session_thread_data_map[boost::this_thread::get_id()].reset(); + boost::asio::ip::tcp::endpoint ep_err1; + ret = this->handle_sorryserver_connection_fail(boost::this_thread::get_id(), ep_err1); + BOOST_CHECK_EQUAL(ret, FINALIZE); + + cout << "[223]--------------------------------------------- " << endl; + //unit_test[223] 異常系 session_thread_data_map中にThreadIDなし場合のテスト + //unit_test[223] 遷移先ステータスを設定する status = FINALIZE + this->session_thread_data_map.clear(); + ret = this->handle_sorryserver_connection_fail(boost::this_thread::get_id(), ep_err1); + BOOST_CHECK_EQUAL(ret, FINALIZE); + + cout << "[224]--------------------------------------------- " << endl; + //unit_test[224] 終了フラグをON status = CLIENT_DISCONNECT + boost::asio::ip::tcp::endpoint ep; + thread_data_ptr data(new session_thread_data_ip); + data->thread_id = boost::this_thread::get_id(); + this->session_thread_data_map[boost::this_thread::get_id()] = data; + ret = this->handle_sorryserver_connection_fail(boost::this_thread::get_id(), ep); + BOOST_CHECK_EQUAL(ret, CLIENT_DISCONNECT); // 遷移先ステータス status = CLIENT_DISCONNECT + BOOST_CHECK_EQUAL(data->last_status, CLIENT_DISCONNECT);// 遷移ステータスを保存する + } + + //handle_sorryserver_connection_fail + void handle_sorryserver_connection_fail_test_thread() + { + EVENT_TAG ret; + cout << "[225]--------------------------------------------- " << endl; + //unit_test[225] 終了フラグをON status = CLIENT_DISCONNECT + boost::asio::ip::tcp::endpoint ep; + thread_data_ptr data(new session_thread_data_ip); + { + boost::mutex::scoped_lock sclock(session_thread_data_map_mutex); + data->thread_id = boost::this_thread::get_id(); + this->session_thread_data_map[boost::this_thread::get_id()] = data; + } + ret = this->handle_sorryserver_connection_fail(boost::this_thread::get_id(), ep); + { + boost::mutex::scoped_lock sclock(session_thread_data_map_mutex); + BOOST_CHECK_EQUAL(ret, CLIENT_DISCONNECT); // 遷移先ステータス status = CLIENT_DISCONNECT + BOOST_CHECK_EQUAL(data->last_status, CLIENT_DISCONNECT);// 遷移ステータスを保存する + this->session_thread_data_map.erase(boost::this_thread::get_id()); + } + } + + //handle_sorryserver_send + void handle_sorryserver_send_test() + { + char* data_buffer = new char[MAX_BUFFER_SIZE]; + EVENT_TAG ret; + + char* buffer = NULL; + cout << "[226]--------------------------------------------- " << endl; + //unit_test[226] 異常系 session_thread_data_map中にThreadID対応のデータがない + { + thread_data_ptr thread_data; + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data; + ret = this->handle_sorryserver_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(ret, FINALIZE);//遷移先ステータスを設定する status = FINALIZE + } + + cout << "[227]--------------------------------------------- " << endl; + //unit_test[227] 異常系 session_thread_data_map中にThreadIDなし場合のテスト + { + this->session_thread_data_map.clear(); + ret = this->handle_sorryserver_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(ret, FINALIZE);//遷移先ステータスを設定する status = FINALIZE + } + + cout << "[228]--------------------------------------------- " << endl; + //unit_test[228] 未送信データサイズ > 0 データサイズ > 0の場合 status = SORRYSERVER_CONNECT + { + thread_data_ptr data(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data; + data->current_message_rest_size = 1; + data->data_length = 1; + ret = this->handle_sorryserver_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(ret, SORRYSERVER_CONNECT);//遷移先ステータスを設定する + BOOST_CHECK_EQUAL(data->last_status, SORRYSERVER_CONNECT);//遷移ステータスを保存する + this->session_thread_data_map.clear(); + } + + cout << "[229]--------------------------------------------- " << endl; + //unit_test[229] 未送信データサイズ > 0データサイズが0の場合 データ開始位置が0を設定する status = CLIENT_RECV + { + thread_data_ptr data(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data; + data->current_message_rest_size = 1; + data->data_length = 0; + data->data_offset = 5; + ret = this->handle_sorryserver_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(ret, CLIENT_RECV);//遷移先ステータスを設定する + BOOST_CHECK_EQUAL(data->last_status, CLIENT_RECV);//遷移ステータスを保存する + BOOST_CHECK_EQUAL(data->data_offset, 0u);// データ開始位置が0を設定する + } + + cout << "[230]--------------------------------------------- " << endl; + //unit_test[230] 未送信データサイズが0 データサイズが0の場合 + //unit_test[230] データ状態がHTTP_BODYの場合 + //unit_test[230] データ状態にHTTP_STARTを設定する status = CLIENT_RECV データ開始位置が0を設定する + { + thread_data_ptr data(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data; + data->data_state = HTTP_BODY; + data->current_message_rest_size = 0; + data->data_length = 0; + data->data_offset = 5; + ret = this->handle_sorryserver_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(ret, CLIENT_RECV); + BOOST_CHECK_EQUAL(data->data_state, HTTP_START); + BOOST_CHECK_EQUAL(data->last_status, CLIENT_RECV); + BOOST_CHECK_EQUAL(data->data_offset, 0u); + } + + cout << "[231]--------------------------------------------- " << endl; + //unit_test[231] 未送信データサイズが0 データサイズ > 0の場合 + //unit_test[231] データ状態がHTTP_BODYの場合 + //unit_test[231] find_http_header_all検索結果が該当なしの場合 + //unit_test[231] データ状態がHTTP_STARTを設定する status = CLIENT_RECV + { + thread_data_ptr data(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data; + + char* buffer = "GET /index.html HTTP/1.1\r\nHost:172.16.58.234\r\n"; + data->data_buffer = data_buffer; + memset(data->data_buffer, 0, MAX_BUFFER_SIZE); + memcpy(data->data_buffer, buffer, strlen(buffer)); + data->data_state = HTTP_BODY; + data->current_message_rest_size = 0; + data->data_offset = 0; + data->data_state = HTTP_BODY; + data->data_length = strlen(buffer); + ret = this->handle_sorryserver_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(ret, CLIENT_RECV);// 遷移先ステータスを設定する + BOOST_CHECK_EQUAL(data->data_state, HTTP_START);//データ状態がHTTP_STARTを設定する + BOOST_CHECK_EQUAL(data->last_status, CLIENT_RECV);// 遷移ステータスを保存する + } + + cout << "[232]--------------------------------------------- " << endl; + //unit_test[232] 未送信データサイズが0 データサイズ > 0の場合 + //unit_test[232] データ状態がHTTP_BODYの場合 + //unit_test[232] find_http_header_all検索結果が該当あり + //unit_test[232] check_http_method_and_versionチェック結果が異常の場合 + //unit_test[232] データ状態にUNKNOWNを設定する 未送信データサイズにデータサイズを設定する status = SORRYSERVER_CONNECT + { + thread_data_ptr data(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data; + + buffer = "GET /index.html HTTP/5.5\r\nHost:172.16.58.234\r\n\r\n123455668"; + data->data_buffer = data_buffer; + memset(data->data_buffer, 0, MAX_BUFFER_SIZE); + memcpy(data->data_buffer, buffer, strlen(buffer)); + data->data_state = HTTP_BODY; + data->data_offset = 0; + data->current_message_rest_size = 0; + data->data_length = strlen(buffer); + ret = this->handle_sorryserver_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(ret, SORRYSERVER_CONNECT); + BOOST_CHECK_EQUAL(data->data_state, UNKNOWN); + BOOST_CHECK_EQUAL(data->current_message_rest_size, data->data_length); + BOOST_CHECK_EQUAL(data->last_status, SORRYSERVER_CONNECT); + } + + cout << "[233]--------------------------------------------- " << endl; + //unit_test[233] 未送信データサイズが0 データサイズ > 0の場合 + //unit_test[233] データ状態がHTTP_BODYの場合 + //unit_test[233] find_http_header_all検索結果が該当あり + //unit_test[233] check_http_method_and_versionチェック結果が異常の場合 + //unit_test[233] データ状態にUNKNOWNを設定する 未送信データサイズにデータサイズを設定する status = SORRYSERVER_CONNECT + //\r\n\r\n only + { + thread_data_ptr data(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data; + + buffer = "GET /index.html HTTP/5.5\r\n\r\n123455668"; + data->data_buffer = data_buffer; + memset(data->data_buffer, 0, MAX_BUFFER_SIZE); + memcpy(data->data_buffer, buffer, strlen(buffer)); + data->data_state = HTTP_BODY; + data->data_offset = 0; + data->current_message_rest_size = 0; + data->data_length = strlen(buffer); + ret = this->handle_sorryserver_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(ret, SORRYSERVER_CONNECT); + BOOST_CHECK_EQUAL(data->data_state, UNKNOWN); + BOOST_CHECK_EQUAL(data->current_message_rest_size, data->data_length); + BOOST_CHECK_EQUAL(data->last_status, SORRYSERVER_CONNECT); + } + + + cout << "[234]--------------------------------------------- " << endl; + //unit_test[234] 未送信データサイズが0 データサイズ > 0の場合 + //unit_test[234] データ状態がHTTP_BODYの場合 + //unit_test[234] find_http_header_all検索結果が該当あり check_http_method_and_versionチェック結果が正常の場合 ContentLengthがなし + //unit_test[234] データ状態にHTTP_HEADERを設定する 未送信データサイズにHTTPヘッダサイズを設定する status = SORRYSERVER_CONNECT + { + thread_data_ptr data(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data; + + buffer = "GET /index.html HTTP/1.1\r\nHost:172.16.58.234\r\n\r\n12345678"; + data->data_buffer = data_buffer; + memset(data->data_buffer, 0, MAX_BUFFER_SIZE); + memcpy(data->data_buffer, buffer, strlen(buffer)); + data->data_state = HTTP_BODY; + data->data_offset = 0; + data->current_message_rest_size = 0; + data->data_length = strlen(buffer); + ret = this->handle_sorryserver_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(ret, SORRYSERVER_CONNECT); + BOOST_CHECK_EQUAL(data->data_state, HTTP_HEADER); + BOOST_CHECK_EQUAL(data->current_message_rest_size, 48u); + BOOST_CHECK_EQUAL(data->last_status, SORRYSERVER_CONNECT); + } + + cout << "[235]--------------------------------------------- " << endl; + //unit_test[235] 未送信データサイズが0 データサイズ > 0の場合 + //unit_test[235] データ状態がHTTP_BODYの場合 + //unit_test[235] find_http_header_all検索結果が該当あり check_http_method_and_versionチェック結果が正常の場合 ContentLengthがなし + //unit_test[235] データ状態にHTTP_HEADERを設定する 未送信データサイズにHTTPヘッダサイズを設定する status = SORRYSERVER_CONNECT + //\r\n\r\n Only + { + thread_data_ptr data(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data; + + buffer = "GET /index.html HTTP/1.1\r\n\r\n12345678"; + data->data_buffer = data_buffer; + memset(data->data_buffer, 0, MAX_BUFFER_SIZE); + memcpy(data->data_buffer, buffer, strlen(buffer)); + data->data_state = HTTP_BODY; + data->data_offset = 0; + data->current_message_rest_size = 0; + data->data_length = strlen(buffer); + ret = this->handle_sorryserver_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(ret, SORRYSERVER_CONNECT); + BOOST_CHECK_EQUAL(data->data_state, HTTP_HEADER); + BOOST_CHECK_EQUAL(data->current_message_rest_size, 28u); + BOOST_CHECK_EQUAL(data->last_status, SORRYSERVER_CONNECT); + } + + cout << "[236]--------------------------------------------- " << endl; + //unit_test[236] 未送信データサイズが0 データサイズ > 0の場合 + //unit_test[236] find_http_header_all検索結果が該当あり check_http_method_and_versionチェック結果が正常の場合 ContentLengthがあり + //unit_test[236] データ状態にHTTP_HEADERを設定する 未送信データサイズに「HTTPヘッダサイズ + ContentLength」を設定する status = SORRYSERVER_CONNECT + { + thread_data_ptr data(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data; + + buffer = "GET /index.html HTTP/1.1\r\nContent-Length: 100rnHost:172.16.58.234\r\n\r\n12345678"; + data->data_buffer = data_buffer; + memset(data->data_buffer, 0, MAX_BUFFER_SIZE); + memcpy(data->data_buffer, buffer, strlen(buffer)); + data->data_state = HTTP_BODY; + data->data_offset = 0; + data->current_message_rest_size = 0; + data->data_length = strlen(buffer); + ret = this->handle_sorryserver_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(ret, SORRYSERVER_CONNECT); + BOOST_CHECK_EQUAL(data->data_state, HTTP_HEADER); + BOOST_CHECK_EQUAL(data->current_message_rest_size, (69u+100u)); + BOOST_CHECK_EQUAL(data->last_status, SORRYSERVER_CONNECT); + } + + cout << "[237]--------------------------------------------- " << endl; + //unit_test[237] 未送信データサイズが0の場合 + //unit_test[237] データサイズが0の場合 + //unit_test[237] データ状態がHTTP_BODYの場合 + //unit_test[237] データ状態にHTTP_STARTを設定する + //unit_test[237] status = CLIENT_RECV + //unit_test[237] データ開始位置が0を設定する + { + thread_data_ptr data(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data; + + data->current_message_rest_size = 0; + data->data_length = 0; + data->data_offset = 5; + data->data_state = HTTP_BODY; + ret = this->handle_sorryserver_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(ret, CLIENT_RECV); + BOOST_CHECK_EQUAL(data->data_state, HTTP_START); + BOOST_CHECK_EQUAL(data->last_status, CLIENT_RECV); + BOOST_CHECK_EQUAL(data->data_offset, 0u); + + } + cout << "[238]--------------------------------------------- " << endl; + //unit_test[238] 未送信データサイズが0の場合 + //unit_test[238] データサイズが0の場合 + //unit_test[238] データ状態がHTTP_HEADERの場合 + //unit_test[238] status = CLIENT_RECV + //unit_test[238] データ開始位置が0を設定する + { + thread_data_ptr data(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data; + + data->current_message_rest_size = 0; + data->data_length = 0; + data->data_offset = 5; + data->data_state = HTTP_HEADER; + ret = this->handle_sorryserver_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(ret, CLIENT_RECV); + BOOST_CHECK_EQUAL(data->data_state, HTTP_HEADER); + BOOST_CHECK_EQUAL(data->last_status, CLIENT_RECV); + BOOST_CHECK_EQUAL(data->data_offset, 0u); + + } + + cout << "[239]--------------------------------------------- " << endl; + //unit_test[239] 未送信データサイズが0の場合 + //unit_test[239] データサイズが0の場合 + //unit_test[239] データ状態がUNKNOWNの場合 + //unit_test[239] status = CLIENT_RECV + //unit_test[239] データ開始位置が0を設定する + { + thread_data_ptr data(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data; + + data->current_message_rest_size = 0; + data->data_length = 0; + data->data_offset = 5; + data->data_state = UNKNOWN; + ret = this->handle_sorryserver_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(ret, CLIENT_RECV); + BOOST_CHECK_EQUAL(data->data_state, UNKNOWN); + BOOST_CHECK_EQUAL(data->last_status, CLIENT_RECV); + BOOST_CHECK_EQUAL(data->data_offset, 0u); + + } + + + delete [] data_buffer; + } + + //handle_sorryserver_send + void handle_sorryserver_send_test_thread() + { + EVENT_TAG ret; + + cout << "[240]--------------------------------------------- " << endl; + //unit_test[240] 未送信データサイズが0の場合 + //unit_test[240] データサイズが0の場合 + //unit_test[240] データ状態がUNKNOWNの場合 + //unit_test[240] status = CLIENT_RECV + //unit_test[240] データ開始位置が0を設定する + { + thread_data_ptr data(new session_thread_data_ip); + { + boost::mutex::scoped_lock sclock(session_thread_data_map_mutex); + this->session_thread_data_map[boost::this_thread::get_id()] = data; + + data->current_message_rest_size = 0; + data->data_length = 0; + data->data_offset = 5; + data->data_state = UNKNOWN; + } + ret = this->handle_sorryserver_send(boost::this_thread::get_id()); + { + boost::mutex::scoped_lock sclock(session_thread_data_map_mutex); + BOOST_CHECK_EQUAL(ret, CLIENT_RECV); + BOOST_CHECK_EQUAL(data->data_state, UNKNOWN); + BOOST_CHECK_EQUAL(data->last_status, CLIENT_RECV); + BOOST_CHECK_EQUAL(data->data_offset, 0u); + this->session_thread_data_map.erase(boost::this_thread::get_id()); + } + } + } + + //handle_realserver_recv(tcp) + void handle_realserver_recv_tcp_test() + { + { + cout << "[241]--------------------------------------------- " << endl; + //unit_test[241] recvデータサイズ>recvbufferサイズの場合 status = FINALIZE + EVENT_TAG status; + thread_data_ptr down_thread_data(new session_thread_data_ip); + down_thread_data->data_length = 10; + down_thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + boost::array recvbuffer = { { "abcdefghij" } }; + size_t recvlen = MAX_BUFFER_SIZE+1; + this->session_thread_data_map.clear(); + boost::asio::ip::tcp::endpoint ep; + status = this->handle_realserver_recv(boost::this_thread::get_id(),ep,recvbuffer,recvlen); + BOOST_CHECK_EQUAL(status, FINALIZE); + } + { + cout << "[242]--------------------------------------------- " << endl; + //unit_test[242]異常系 session_thread_data_map中にThreadIDなし場合のテスト + EVENT_TAG status; + boost::array recvbuffer = { { "abcdefghij" } }; + size_t recvlen = 10; + this->session_thread_data_map.clear(); + boost::asio::ip::tcp::endpoint ep; + status = this->handle_realserver_recv(boost::this_thread::get_id(),ep,recvbuffer,recvlen); + BOOST_CHECK_EQUAL(status, FINALIZE); + } + { + cout << "[243]--------------------------------------------- " << endl; + //unit_test[243] 異常系 session_thread_data_map中にThreadID対応のデータがない + thread_data_ptr down_thread_data(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + this->session_thread_data_map[boost::this_thread::get_id()].reset(); + EVENT_TAG status; + boost::array recvbuffer = { { "abcdefghij" } }; + size_t recvlen = 10; + boost::asio::ip::tcp::endpoint ep; + status = this->handle_realserver_recv(boost::this_thread::get_id(),ep,recvbuffer,recvlen); + BOOST_CHECK_EQUAL(status, FINALIZE); + } + { + cout << "[244]--------------------------------------------- " << endl; + //unit_test[244] get_data_from_recvbuffer() 追加設定不可能の場合 + //unit_test[244] status = FINALIZE + EVENT_TAG status; + thread_data_ptr down_thread_data(new session_thread_data_ip); + down_thread_data->data_buffer_size = MAX_BUFFER_SIZE; + down_thread_data->data_offset = 10; + down_thread_data->data_length = 10; + down_thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + boost::array recvbuffer = { { "abcdefghij" } }; + size_t recvlen = MAX_IP_MODULE_BUFFER_SIZE; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + boost::asio::ip::tcp::endpoint ep; + status = this->handle_realserver_recv(boost::this_thread::get_id(),ep,recvbuffer,recvlen); + BOOST_CHECK_EQUAL(status, FINALIZE); + this->session_thread_data_map.clear(); + delete[] down_thread_data->data_buffer; + } + { + cout << "[245]--------------------------------------------- " << endl; + //unit_test[245] get_data_from_recvbuffer() 追加設定可能,データ状態がUNKNOWNの場合 + //unit_test[245] 遷移先ステータスを設定するstatus = CLIENT_CONNECTION_CHECK + EVENT_TAG status; + thread_data_ptr down_thread_data(new session_thread_data_ip); + down_thread_data->data_buffer_size = MAX_BUFFER_SIZE; + down_thread_data->current_message_rest_size = 10; + down_thread_data->data_length = 10; + down_thread_data->data_offset = 10; + down_thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memcpy(down_thread_data->data_buffer,"HTTP/1.1 e",10); + down_thread_data->data_state = UNKNOWN; + memset((down_thread_data->data_buffer+down_thread_data->data_offset), 1, down_thread_data->data_length); + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + boost::array recvbuffer = { { "abcdefghij" } }; + size_t recvlen = 10; + boost::asio::ip::tcp::endpoint ep; + status = this->handle_realserver_recv(boost::this_thread::get_id(),ep,recvbuffer,recvlen); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_message_rest_size, 20u); + BOOST_CHECK_EQUAL(status, this->session_thread_data_map[boost::this_thread::get_id()]->last_status); + BOOST_CHECK_EQUAL(status, CLIENT_CONNECTION_CHECK); + this->session_thread_data_map.clear(); + delete[] down_thread_data->data_buffer; + } + { + cout << "[246]--------------------------------------------- " << endl; + //unit_test[246] get_data_from_recvbuffer() 追加設定可能,データ状態がHTTP_HEADERの場合 + //unit_test[246] 遷移先ステータスを設定するstatus = CLIENT_CONNECTION_CHECK + EVENT_TAG status; + thread_data_ptr down_thread_data(new session_thread_data_ip); + down_thread_data->data_buffer_size = MAX_BUFFER_SIZE; + down_thread_data->current_message_rest_size = 10; + down_thread_data->data_length = 10; + down_thread_data->data_offset = 10; + down_thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memcpy(down_thread_data->data_buffer,"HTTP/1.1 e",10); + down_thread_data->data_state = HTTP_HEADER; + memset((down_thread_data->data_buffer+down_thread_data->data_offset), 1, down_thread_data->data_length); + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + boost::array recvbuffer = { { "abcdefghij" } }; + size_t recvlen = 10; + boost::asio::ip::tcp::endpoint ep; + status = this->handle_realserver_recv(boost::this_thread::get_id(),ep,recvbuffer,recvlen); + BOOST_CHECK_EQUAL(status, this->session_thread_data_map[boost::this_thread::get_id()]->last_status); + BOOST_CHECK_EQUAL(status, CLIENT_CONNECTION_CHECK); + this->session_thread_data_map.clear(); + delete[] down_thread_data->data_buffer; + } + { + cout << "[247]--------------------------------------------- " << endl; + //unit_test[247] get_data_from_recvbuffer() 追加設定可能,データ状態がHTTP_BODYの場合 + //unit_test[247] 遷移先ステータスを設定するstatus = CLIENT_CONNECTION_CHECK + EVENT_TAG status; + thread_data_ptr down_thread_data(new session_thread_data_ip); + down_thread_data->data_buffer_size = MAX_BUFFER_SIZE; + down_thread_data->current_message_rest_size = 10; + down_thread_data->data_length = 10; + down_thread_data->data_offset = 10; + down_thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memcpy(down_thread_data->data_buffer,"HTTP/1.1 e",10); + down_thread_data->data_state = HTTP_BODY; + memset((down_thread_data->data_buffer+down_thread_data->data_offset), 1, down_thread_data->data_length); + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + boost::array recvbuffer = { { "abcdefghij" } }; + size_t recvlen = 10; + boost::asio::ip::tcp::endpoint ep; + status = this->handle_realserver_recv(boost::this_thread::get_id(),ep,recvbuffer,recvlen); + BOOST_CHECK_EQUAL(status, this->session_thread_data_map[boost::this_thread::get_id()]->last_status); + BOOST_CHECK_EQUAL(status, CLIENT_CONNECTION_CHECK); + this->session_thread_data_map.clear(); + delete[] down_thread_data->data_buffer; + } + { + cout << "[248]--------------------------------------------- " << endl; + //unit_test[248] get_data_from_recvbuffer()追加設定可能,データ状態がHTTP_START,find_http_header_all()検索結果が該当なし,データサイズ < データバッファMAXサイズ - 受信バッファサイズの場合 + //unit_test[248] 遷移先ステータスを設定するstatus = REALSERVER_RECV + EVENT_TAG status; + thread_data_ptr down_thread_data(new session_thread_data_ip); + down_thread_data->current_message_rest_size = 0; + down_thread_data->data_buffer_size = 50; + down_thread_data->data_length = 10; + down_thread_data->data_offset = 0; + down_thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memcpy(down_thread_data->data_buffer,"abcdefghij",10); + down_thread_data->data_state = HTTP_START; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + boost::array recvbuffer= { { "HTTP/1.1 ert\r\nHIJKLMNrn" } }; + size_t recvlen = 23; + boost::asio::ip::tcp::endpoint ep; + status = this->handle_realserver_recv(boost::this_thread::get_id(),ep,recvbuffer,recvlen); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_length, 33u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_state, HTTP_START); + BOOST_CHECK_EQUAL(status, this->session_thread_data_map[boost::this_thread::get_id()]->last_status); + BOOST_CHECK_EQUAL(status, REALSERVER_RECV); + this->session_thread_data_map.clear(); + delete[] down_thread_data->data_buffer; + } + { + cout << "[249]--------------------------------------------- " << endl; + //unit_test[249] get_data_from_recvbuffer()追加設定可能,データ状態がHTTP_START,find_http_header_all()検索結果が該当なし,データサイズ > データバッファMAXサイズ - 受信バッファサイズ + //unit_test[249] 遷移先ステータスを設定するstatus = CLIENT_CONNECTION_CHECK + EVENT_TAG status; + thread_data_ptr down_thread_data(new session_thread_data_ip); + down_thread_data->data_buffer_size = MAX_IP_MODULE_BUFFER_SIZE; + down_thread_data->current_message_rest_size = 0; + down_thread_data->data_length = MAX_IP_MODULE_BUFFER_SIZE - MAX_BUFFER_SIZE - 10; + down_thread_data->data_offset = 0; + down_thread_data->data_buffer = new char[MAX_IP_MODULE_BUFFER_SIZE]; + down_thread_data->data_state = HTTP_START; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + boost::array recvbuffer= { { "ABCDEFG\r\nHIJKLMN\r\n" } }; + size_t recvlen = 18; + boost::asio::ip::tcp::endpoint ep; + status = this->handle_realserver_recv(boost::this_thread::get_id(),ep,recvbuffer,recvlen); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_length,MAX_IP_MODULE_BUFFER_SIZE- MAX_BUFFER_SIZE +8u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_message_rest_size,MAX_IP_MODULE_BUFFER_SIZE- MAX_BUFFER_SIZE +8u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_state,UNKNOWN); + BOOST_CHECK_EQUAL(status, this->session_thread_data_map[boost::this_thread::get_id()]->last_status); + BOOST_CHECK_EQUAL(status, CLIENT_CONNECTION_CHECK); + this->session_thread_data_map.clear(); + delete[] down_thread_data->data_buffer; + } + { + cout << "[250]--------------------------------------------- " << endl; + //unit_test[250] get_data_from_recvbuffer()追加設定可能,データ状態がHTTP_START,find_http_header_all()検索結果が該当なし,データサイズ = データバッファMAXサイズ - 受信バッファサイズ + //unit_test[250] 遷移先ステータスを設定するstatus = CLIENT_CONNECTION_CHECK + EVENT_TAG status; + thread_data_ptr down_thread_data(new session_thread_data_ip); + down_thread_data->data_buffer_size = MAX_IP_MODULE_BUFFER_SIZE; + down_thread_data->current_message_rest_size = 0; + down_thread_data->data_length = MAX_IP_MODULE_BUFFER_SIZE - MAX_BUFFER_SIZE - 10; + down_thread_data->data_offset = 0; + down_thread_data->data_buffer = new char[MAX_IP_MODULE_BUFFER_SIZE]; + down_thread_data->data_state = HTTP_START; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + boost::array recvbuffer= { { "ABCDEFG\r\nH" } }; + size_t recvlen = 10; + boost::asio::ip::tcp::endpoint ep; + status = this->handle_realserver_recv(boost::this_thread::get_id(),ep,recvbuffer,recvlen); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_length,MAX_IP_MODULE_BUFFER_SIZE- MAX_BUFFER_SIZE ); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_message_rest_size,MAX_IP_MODULE_BUFFER_SIZE- MAX_BUFFER_SIZE ); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_state,UNKNOWN); + BOOST_CHECK_EQUAL(status, this->session_thread_data_map[boost::this_thread::get_id()]->last_status); + BOOST_CHECK_EQUAL(status, CLIENT_CONNECTION_CHECK); + this->session_thread_data_map.clear(); + delete[] down_thread_data->data_buffer; + } + + { + cout << "[251]--------------------------------------------- " << endl; + //unit_test[251] get_data_from_recvbuffer()追加設定可能,データ状態がHTTP_START,find_http_header_all()検索結果が該当ありの場合 + //unit_test[251] check_http_version_and_status_code()チェック結果が異常の場合, + //unit_test[251] status=CLIENT_CONNECTION_CHECK + EVENT_TAG status; + thread_data_ptr down_thread_data(new session_thread_data_ip); + down_thread_data->current_message_rest_size = 0; + down_thread_data->data_buffer_size = 50; + down_thread_data->data_length = 10; + down_thread_data->data_offset = 10; + down_thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memcpy(down_thread_data->data_buffer,"abcdefghij",10); + down_thread_data->data_state = HTTP_START; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + boost::array recvbuffer= { { "HTTP/1.1 ttt\r\nHIJKLMN\r\n\r\n" } }; + size_t recvlen = 25; + boost::asio::ip::tcp::endpoint ep; + status = this->handle_realserver_recv(boost::this_thread::get_id(),ep,recvbuffer,recvlen); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_length, 35u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_offset, 10u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_message_rest_size, 35u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_state, UNKNOWN); + BOOST_CHECK_EQUAL(status, this->session_thread_data_map[boost::this_thread::get_id()]->last_status); + BOOST_CHECK_EQUAL(status, CLIENT_CONNECTION_CHECK); + this->session_thread_data_map.clear(); + delete[] down_thread_data->data_buffer; + } + + { + cout << "[252]--------------------------------------------- " << endl; + //unit_test[252]get_data_from_recvbuffer() 追加設定可能,データ状態がHTTP_START,find_http_header_all()検索結果が該当ありの場合 + //unit_test[252]check_http_version_and_status_code()チェック結果が正常の場合,find_http_header_content_length()検索結果が該当なしの場合, + //unit_test[252] status=CLIENT_CONNECTION_CHECK,データ状態にHTTP_HEADERを設定する + EVENT_TAG status; + thread_data_ptr down_thread_data(new session_thread_data_ip); + down_thread_data->current_message_rest_size = 0; + down_thread_data->data_buffer_size = MAX_BUFFER_SIZE; + down_thread_data->data_length = 0; + down_thread_data->data_offset = 0; + down_thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + //memcpy(down_thread_data->data_buffer,"abcdefghij",10); + down_thread_data->data_state = HTTP_START; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + boost::array recvbuffer= { { "HTTP/1.1 200 OK\r\n" + "Date: Thu, 29 Oct 2009 03:03:48 GMT\r\n" + "Accept-Ranges: bytes\r\n" + "Content-Type: text/css\r\n" + "Last-Modified: Fri, 09 Jan 2009 19:16:12 GMT\r\n" + "X-Powered-By: Servlet/2.4 JSP/2.0\r\n" + "\r\n" } + }; + size_t recvlen = 183; + boost::asio::ip::tcp::endpoint ep; + status = this->handle_realserver_recv(boost::this_thread::get_id(),ep,recvbuffer,recvlen); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_length, 183u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_offset, 0u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_message_rest_size, 183u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_state, HTTP_HEADER); + BOOST_CHECK_EQUAL(status, this->session_thread_data_map[boost::this_thread::get_id()]->last_status); + BOOST_CHECK_EQUAL(status, CLIENT_CONNECTION_CHECK); + this->session_thread_data_map.clear(); + delete[] down_thread_data->data_buffer; + } + { + cout << "[253]--------------------------------------------- " << endl; + //unit_test[253] get_data_from_recvbuffer() 追加設定可能,データ状態がHTTP_START,find_http_header_all()検索結果が該当ありの場合 + //unit_test[253] check_http_version_and_status_code()チェック結果が正常の場合,find_http_header_content_length()検索結果が該当ありの場合, + //unit_test[253] status=CLIENT_CONNECTION_CHECK,データ状態にHTTP_HEADERを設定する + EVENT_TAG status; + thread_data_ptr down_thread_data(new session_thread_data_ip); + down_thread_data->current_message_rest_size = 0; + down_thread_data->data_buffer_size = MAX_BUFFER_SIZE; + down_thread_data->data_length = 0; + down_thread_data->data_offset = 0; + down_thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + //memcpy(down_thread_data->data_buffer,"abcdefghij",10); + down_thread_data->data_state = HTTP_START; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + boost::array recvbuffer= { { "HTTP/1.1 200 OK\r\n" + "Date: Thu, 29 Oct 2009 03:03:48 GMT\r\n" + "Accept-Ranges: bytes\r\n" + "Content-Length: 21887\r\n" + "Content-Type: text/css\r\n" + "Last-Modified: Fri, 09 Jan 2009 19:16:12 GMT\r\n" + "X-Powered-By: Servlet/2.4 JSP/2.0\r\n" + "\r\n" } + }; + size_t recvlen = 206; + boost::asio::ip::tcp::endpoint ep; + status = this->handle_realserver_recv(boost::this_thread::get_id(),ep,recvbuffer,recvlen); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_length, 206u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_offset, 0u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_message_rest_size, 22093u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_state, HTTP_HEADER); + BOOST_CHECK_EQUAL(status, this->session_thread_data_map[boost::this_thread::get_id()]->last_status); + BOOST_CHECK_EQUAL(status, CLIENT_CONNECTION_CHECK); + this->session_thread_data_map.clear(); + delete[] down_thread_data->data_buffer; + } + { + cout << "[254]--------------------------------------------- " << endl; + //unit_test[254] get_data_from_recvbuffer() 追加設定可能,データ状態がHTTP_START,find_http_header_all()検索結果が該当ありの場合 + //unit_test[254] check_http_version_and_status_code()チェック結果が正常の場合,find_http_header_content_length()検索結果が該当ありの場合, + //unit_test[254] status=CLIENT_CONNECTION_CHECK,データ状態にHTTP_HEADERを設定する + EVENT_TAG status; + thread_data_ptr down_thread_data(new session_thread_data_ip); + down_thread_data->current_message_rest_size = 0; + down_thread_data->data_buffer_size = MAX_BUFFER_SIZE; + down_thread_data->data_length = 0; + down_thread_data->data_offset = 0; + down_thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + //memcpy(down_thread_data->data_buffer,"abcdefghij",10); + down_thread_data->data_state = HTTP_START; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + boost::array recvbuffer= { { "HTTP/1.1 200 OK\r\n" + "Date: Thu, 29 Oct 2009 03:03:48 GMT\r\n" + "Accept-Ranges: bytes\r\n" + "Content-Length: 3\r\n" + "Content-Type: text/css\r\n" + "Last-Modified: Fri, 09 Jan 2009 19:16:12 GMT\r\n" + "X-Powered-By: Servlet/2.4 JSP/2.0\r\n" + "\r\n1234567" } + }; + size_t recvlen = strlen(recvbuffer.data()); + boost::asio::ip::tcp::endpoint ep; + status = this->handle_realserver_recv(boost::this_thread::get_id(),ep,recvbuffer,recvlen); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_length, strlen(recvbuffer.data())); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_offset, 0u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_message_rest_size, strlen(recvbuffer.data()) - 7 + 3); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_state, HTTP_HEADER); + BOOST_CHECK_EQUAL(status, this->session_thread_data_map[boost::this_thread::get_id()]->last_status); + BOOST_CHECK_EQUAL(status, CLIENT_CONNECTION_CHECK); + this->session_thread_data_map.clear(); + delete[] down_thread_data->data_buffer; + } + + } + + //handle_realserver_recv_tcp_test_thread + void handle_realserver_recv_tcp_test_thread() + { + { + cout << "[255]--------------------------------------------- " << endl; + //unit_test[255] get_data_from_recvbuffer() 追加設定可能,データ状態がHTTP_START,find_http_header_all()検索結果が該当ありの場合 + //unit_test[255] check_http_version_and_status_code()チェック結果が正常の場合,find_http_header_content_length()検索結果が該当ありの場合, + //unit_test[255] status=CLIENT_CONNECTION_CHECK,データ状態にHTTP_HEADERを設定する + EVENT_TAG status; + thread_data_ptr down_thread_data(new session_thread_data_ip); + { + boost::mutex::scoped_lock sclock(session_thread_data_map_mutex); + down_thread_data->current_message_rest_size = 0; + down_thread_data->data_buffer_size = MAX_BUFFER_SIZE; + down_thread_data->data_length = 0; + down_thread_data->data_offset = 0; + down_thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + //memcpy(down_thread_data->data_buffer,"abcdefghij",10); + down_thread_data->data_state = HTTP_START; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + } + boost::array recvbuffer= { { "HTTP/1.1 200 OK\r\n" + "Date: Thu, 29 Oct 2009 03:03:48 GMT\r\n" + "Accept-Ranges: bytes\r\n" + "Content-Length: 3\r\n" + "Content-Type: text/css\r\n" + "Last-Modified: Fri, 09 Jan 2009 19:16:12 GMT\r\n" + "X-Powered-By: Servlet/2.4 JSP/2.0\r\n" + "\r\n1234567" } + }; + size_t recvlen = strlen(recvbuffer.data()); + boost::asio::ip::tcp::endpoint ep; + status = this->handle_realserver_recv(boost::this_thread::get_id(),ep,recvbuffer,recvlen); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_length, strlen(recvbuffer.data())); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_offset, 0u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_message_rest_size, strlen(recvbuffer.data()) - 7 + 3); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_state, HTTP_HEADER); + BOOST_CHECK_EQUAL(status, this->session_thread_data_map[boost::this_thread::get_id()]->last_status); + BOOST_CHECK_EQUAL(status, CLIENT_CONNECTION_CHECK); + delete[] down_thread_data->data_buffer; + this->session_thread_data_map.erase(boost::this_thread::get_id()); + } + } + + //handle_realserver_recv(udp) + void handle_realserver_recv_udp_test() + { + boost::asio::ip::udp::endpoint rs_endpoint; + boost::array recvbuffer; + size_t recvlen = 0; + + cout << "[256]--------------------------------------------- " << endl; + //unit_test[256] 異常系で必ずSTOPを返す + BOOST_CHECK_EQUAL(this->handle_realserver_recv(boost::this_thread::get_id(), rs_endpoint, recvbuffer, recvlen), STOP); + } + + //handle_sorryserver_recv + void handle_sorryserver_recv_test() + { + { + cout << "[257]--------------------------------------------- " << endl; + //unit_test[257] recvデータサイズ>recvbufferサイズの場合 status = FINALIZE + EVENT_TAG status; + thread_data_ptr down_thread_data(new session_thread_data_ip); + down_thread_data->data_length = 10; + down_thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + boost::array recvbuffer = { { "abcdefghijabcdefghij" } }; + size_t recvlen = 20; + this->session_thread_data_map.clear(); + boost::asio::ip::tcp::endpoint ep; + status = this->handle_sorryserver_recv(boost::this_thread::get_id(),ep,recvbuffer,recvlen); + BOOST_CHECK_EQUAL(status, FINALIZE); + } + { + cout << "[258]--------------------------------------------- " << endl; + //unit_test[258]異常系 session_thread_data_map中にThreadIDなし場合のテスト + EVENT_TAG status; + boost::array recvbuffer = { { "abcdefghij" } }; + size_t recvlen = 10; + this->session_thread_data_map.clear(); + boost::asio::ip::tcp::endpoint ep; + status = this->handle_sorryserver_recv(boost::this_thread::get_id(),ep,recvbuffer,recvlen); + BOOST_CHECK_EQUAL(status, FINALIZE); + } + { + cout << "[259]--------------------------------------------- " << endl; + //unit_test[259] 異常系 session_thread_data_map中にThreadID対応のデータがない + thread_data_ptr down_thread_data(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + this->session_thread_data_map[boost::this_thread::get_id()].reset(); + EVENT_TAG status; + boost::array recvbuffer = { { "abcdefghij" } }; + size_t recvlen = 10; + boost::asio::ip::tcp::endpoint ep; + status = this->handle_sorryserver_recv(boost::this_thread::get_id(),ep,recvbuffer,recvlen); + BOOST_CHECK_EQUAL(status, FINALIZE); + } + { + cout << "[260]--------------------------------------------- " << endl; + //unit_test[260] get_data_from_recvbuffer() 追加設定不可能の場合 + //unit_test[260] status = FINALIZE + EVENT_TAG status; + thread_data_ptr down_thread_data(new session_thread_data_ip); + down_thread_data->data_buffer_size = MAX_BUFFER_SIZE; + down_thread_data->data_offset = 10; + down_thread_data->data_length = 10; + down_thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + boost::array recvbuffer = { { "abcdefghij" } }; + size_t recvlen = MAX_IP_MODULE_BUFFER_SIZE; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + boost::asio::ip::tcp::endpoint ep; + status = this->handle_sorryserver_recv(boost::this_thread::get_id(),ep,recvbuffer,recvlen); + BOOST_CHECK_EQUAL(status, FINALIZE); + this->session_thread_data_map.clear(); + delete[] down_thread_data->data_buffer; + } + { + cout << "[261]--------------------------------------------- " << endl; + //unit_test[261] get_data_from_recvbuffer() 追加設定可能,データ状態がUNKNOWNの場合 + //unit_test[261] 遷移先ステータスを設定するstatus = CLIENT_CONNECTION_CHECK + EVENT_TAG status; + thread_data_ptr down_thread_data(new session_thread_data_ip); + down_thread_data->data_buffer_size = MAX_BUFFER_SIZE; + down_thread_data->data_length = 10; + down_thread_data->data_offset = 10; + down_thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memcpy(down_thread_data->data_buffer,"HTTP/1.1 e",10); + down_thread_data->data_state = UNKNOWN; + memset((down_thread_data->data_buffer+down_thread_data->data_offset), 1, down_thread_data->data_length); + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + boost::array recvbuffer = { { "abcdefghij" } }; + size_t recvlen = 10; + boost::asio::ip::tcp::endpoint ep; + status = this->handle_sorryserver_recv(boost::this_thread::get_id(),ep,recvbuffer,recvlen); + BOOST_CHECK_EQUAL(status, this->session_thread_data_map[boost::this_thread::get_id()]->last_status); + BOOST_CHECK_EQUAL(status, CLIENT_CONNECTION_CHECK); + this->session_thread_data_map.clear(); + delete[] down_thread_data->data_buffer; + } + { + cout << "[262]--------------------------------------------- " << endl; + //unit_test[262] get_data_from_recvbuffer() 追加設定可能,データ状態がHTTP_HEADERの場合 + //unit_test[262] 遷移先ステータスを設定するstatus = CLIENT_CONNECTION_CHECK + EVENT_TAG status; + thread_data_ptr down_thread_data(new session_thread_data_ip); + down_thread_data->data_buffer_size = MAX_BUFFER_SIZE; + down_thread_data->data_length = 10; + down_thread_data->data_offset = 10; + down_thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memcpy(down_thread_data->data_buffer,"HTTP/1.1 e",10); + down_thread_data->data_state = HTTP_HEADER; + memset((down_thread_data->data_buffer+down_thread_data->data_offset), 1, down_thread_data->data_length); + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + boost::array recvbuffer = { { "abcdefghij" } }; + size_t recvlen = 10; + boost::asio::ip::tcp::endpoint ep; + status = this->handle_sorryserver_recv(boost::this_thread::get_id(),ep,recvbuffer,recvlen); + BOOST_CHECK_EQUAL(status, this->session_thread_data_map[boost::this_thread::get_id()]->last_status); + BOOST_CHECK_EQUAL(status, CLIENT_CONNECTION_CHECK); + this->session_thread_data_map.clear(); + delete[] down_thread_data->data_buffer; + } + { + cout << "[263]--------------------------------------------- " << endl; + //unit_test[263] get_data_from_recvbuffer() 追加設定可能,データ状態がHTTP_BODYの場合 + //unit_test[263] 遷移先ステータスを設定するstatus = CLIENT_CONNECTION_CHECK + EVENT_TAG status; + thread_data_ptr down_thread_data(new session_thread_data_ip); + down_thread_data->data_buffer_size = MAX_BUFFER_SIZE; + down_thread_data->data_length = 10; + down_thread_data->data_offset = 10; + down_thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memcpy(down_thread_data->data_buffer,"HTTP/1.1 e",10); + down_thread_data->data_state = HTTP_BODY; + memset((down_thread_data->data_buffer+down_thread_data->data_offset), 1, down_thread_data->data_length); + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + boost::array recvbuffer = { { "abcdefghij" } }; + size_t recvlen = 10; + boost::asio::ip::tcp::endpoint ep; + status = this->handle_sorryserver_recv(boost::this_thread::get_id(),ep,recvbuffer,recvlen); + BOOST_CHECK_EQUAL(status, this->session_thread_data_map[boost::this_thread::get_id()]->last_status); + BOOST_CHECK_EQUAL(status, CLIENT_CONNECTION_CHECK); + this->session_thread_data_map.clear(); + delete[] down_thread_data->data_buffer; + } + { + cout << "[264]--------------------------------------------- " << endl; + //unit_test[264] get_data_from_recvbuffer() 追加設定可能の場合,データ状態がHTTP_STARTの場合,find_http_header_all()検索結果が該当なし,データサイズ < データバッファMAXサイズ - 受信バッファサイズ + //unit_test[264] status=SORRYSERVER_RECV + EVENT_TAG status; + thread_data_ptr down_thread_data(new session_thread_data_ip); + down_thread_data->current_message_rest_size = 0; + down_thread_data->data_buffer_size = 50; + down_thread_data->data_length = 10; + down_thread_data->data_offset = 0; + down_thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memcpy(down_thread_data->data_buffer,"abcdefghij",10); + down_thread_data->data_state = HTTP_START; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + boost::array recvbuffer= { { "HTTP/1.1 ert\r\nHIJKLMNrn" } }; + size_t recvlen = 23; + boost::asio::ip::tcp::endpoint ep; + status = this->handle_sorryserver_recv(boost::this_thread::get_id(),ep,recvbuffer,recvlen); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_length, 33u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_state, HTTP_START); + BOOST_CHECK_EQUAL(status, this->session_thread_data_map[boost::this_thread::get_id()]->last_status); + BOOST_CHECK_EQUAL(status, SORRYSERVER_RECV); + this->session_thread_data_map.clear(); + delete[] down_thread_data->data_buffer; + } + { + cout << "[265]--------------------------------------------- " << endl; + //unit_test[265] get_data_from_recvbuffer()追加設定可能,データ状態がHTTP_START,find_http_header_all()検索結果が該当なし,データサイズ > データバッファMAXサイズ - 受信バッファサイズ + //unit_test[265] 遷移先ステータスを設定するstatus = CLIENT_CONNECTION_CHECK + EVENT_TAG status; + thread_data_ptr down_thread_data(new session_thread_data_ip); + down_thread_data->data_buffer_size = MAX_IP_MODULE_BUFFER_SIZE; + down_thread_data->data_length = MAX_IP_MODULE_BUFFER_SIZE-MAX_BUFFER_SIZE-10; + down_thread_data->data_offset = 0; + down_thread_data->data_buffer = new char[MAX_IP_MODULE_BUFFER_SIZE]; + down_thread_data->data_state = HTTP_START; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + boost::array recvbuffer= { { "ABCDEFG\r\nHIJKLMNrn" } }; + size_t recvlen = 18; + boost::asio::ip::tcp::endpoint ep; + status = this->handle_sorryserver_recv(boost::this_thread::get_id(),ep,recvbuffer,recvlen); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_length,MAX_IP_MODULE_BUFFER_SIZE - MAX_BUFFER_SIZE + 8u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_message_rest_size,MAX_IP_MODULE_BUFFER_SIZE - MAX_BUFFER_SIZE + 8u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_state,UNKNOWN); + BOOST_CHECK_EQUAL(status, this->session_thread_data_map[boost::this_thread::get_id()]->last_status); + BOOST_CHECK_EQUAL(status, CLIENT_CONNECTION_CHECK); + this->session_thread_data_map.clear(); + delete[] down_thread_data->data_buffer; + } + { + cout << "[266]--------------------------------------------- " << endl; + //unit_test[266] get_data_from_recvbuffer()追加設定可能,データ状態がHTTP_START,find_http_header_all()検索結果が該当なし,データサイズ = データバッファMAXサイズ - 受信バッファサイズ + //unit_test[266] 遷移先ステータスを設定するstatus = CLIENT_CONNECTION_CHECK + EVENT_TAG status; + thread_data_ptr down_thread_data(new session_thread_data_ip); + down_thread_data->data_buffer_size = MAX_IP_MODULE_BUFFER_SIZE; + down_thread_data->data_length = MAX_IP_MODULE_BUFFER_SIZE-MAX_BUFFER_SIZE-18; + down_thread_data->data_offset = 0; + down_thread_data->data_buffer = new char[MAX_IP_MODULE_BUFFER_SIZE]; + down_thread_data->data_state = HTTP_START; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + boost::array recvbuffer= { { "ABCDEFG\r\nHIJKLMNrn" } }; + size_t recvlen = 18; + boost::asio::ip::tcp::endpoint ep; + status = this->handle_sorryserver_recv(boost::this_thread::get_id(),ep,recvbuffer,recvlen); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_length,MAX_IP_MODULE_BUFFER_SIZE-MAX_BUFFER_SIZE); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_message_rest_size,MAX_IP_MODULE_BUFFER_SIZE-MAX_BUFFER_SIZE); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_state,UNKNOWN); + BOOST_CHECK_EQUAL(status, this->session_thread_data_map[boost::this_thread::get_id()]->last_status); + BOOST_CHECK_EQUAL(status, CLIENT_CONNECTION_CHECK); + this->session_thread_data_map.clear(); + delete[] down_thread_data->data_buffer; + } + + { + cout << "[267]--------------------------------------------- " << endl; + //unit_test[267] get_data_from_recvbuffer()追加設定可能,データ状態がHTTP_START,find_http_header_all()検索結果が該当ありの場合 + //unit_test[267] check_http_version_and_status_code()チェック結果が異常の場合, + //unit_test[267] status=CLIENT_CONNECTION_CHECK + EVENT_TAG status; + thread_data_ptr down_thread_data(new session_thread_data_ip); + down_thread_data->current_message_rest_size = 0; + down_thread_data->data_buffer_size = 50; + down_thread_data->data_length = 10; + down_thread_data->data_offset = 10; + down_thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memcpy(down_thread_data->data_buffer,"abcdefghij",10); + down_thread_data->data_state = HTTP_START; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + boost::array recvbuffer= { { "HTTP/1.1 ttt\r\nHIJKLMN\r\n\r\n" } }; + size_t recvlen = 25; + boost::asio::ip::tcp::endpoint ep; + status = this->handle_sorryserver_recv(boost::this_thread::get_id(),ep,recvbuffer,recvlen); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_length, 35u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_offset, 10u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_message_rest_size, 35u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_state, UNKNOWN); + BOOST_CHECK_EQUAL(status, this->session_thread_data_map[boost::this_thread::get_id()]->last_status); + BOOST_CHECK_EQUAL(status, CLIENT_CONNECTION_CHECK); + this->session_thread_data_map.clear(); + delete[] down_thread_data->data_buffer; + } + { + cout << "[268]--------------------------------------------- " << endl; + //unit_test[268]get_data_from_recvbuffer() 追加設定可能,データ状態がHTTP_START,find_http_header_all()検索結果が該当ありの場合 + //unit_test[268]check_http_version_and_status_code()チェック結果が正常の場合,find_http_header_content_length()検索結果が該当なしの場合, + //unit_test[268] status=CLIENT_CONNECTION_CHECK,データ状態にHTTP_HEADERを設定する + EVENT_TAG status; + thread_data_ptr down_thread_data(new session_thread_data_ip); + down_thread_data->current_message_rest_size = 0; + down_thread_data->data_buffer_size = MAX_BUFFER_SIZE; + down_thread_data->data_length = 0; + down_thread_data->data_offset = 0; + down_thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + //memcpy(down_thread_data->data_buffer,"abcdefghij",10); + down_thread_data->data_state = HTTP_START; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + boost::array recvbuffer= { { "HTTP/1.1 200 OK\r\n" + "Date: Thu, 29 Oct 2009 03:03:48 GMT\r\n" + "Accept-Ranges: bytes\r\n" + "Content-Type: text/css\r\n" + "Last-Modified: Fri, 09 Jan 2009 19:16:12 GMT\r\n" + "X-Powered-By: Servlet/2.4 JSP/2.0\r\n" + "\r\n" } + }; + size_t recvlen = 183; + boost::asio::ip::tcp::endpoint ep; + status = this->handle_sorryserver_recv(boost::this_thread::get_id(),ep,recvbuffer,recvlen); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_length, 183u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_offset, 0u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_message_rest_size, 183u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_state, HTTP_HEADER); + BOOST_CHECK_EQUAL(status, this->session_thread_data_map[boost::this_thread::get_id()]->last_status); + BOOST_CHECK_EQUAL(status, CLIENT_CONNECTION_CHECK); + this->session_thread_data_map.clear(); + delete[] down_thread_data->data_buffer; + } + { + cout << "[269]--------------------------------------------- " << endl; + //unit_test[269] get_data_from_recvbuffer() 追加設定可能,データ状態がHTTP_START,find_http_header_all()検索結果が該当ありの場合 + //unit_test[269] check_http_version_and_status_code()チェック結果が正常の場合,find_http_header_content_length()検索結果が該当ありの場合, + //unit_test[269] status=CLIENT_CONNECTION_CHECK,データ状態にHTTP_HEADERを設定する + EVENT_TAG status; + thread_data_ptr down_thread_data(new session_thread_data_ip); + down_thread_data->current_message_rest_size = 0; + down_thread_data->data_buffer_size = MAX_BUFFER_SIZE; + down_thread_data->data_length = 0; + down_thread_data->data_offset = 0; + down_thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + //memcpy(down_thread_data->data_buffer,"abcdefghij",10); + down_thread_data->data_state = HTTP_START; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + boost::array recvbuffer= { { "HTTP/1.1 200 OK\r\n" + "Date: Thu, 29 Oct 2009 03:03:48 GMT\r\n" + "Accept-Ranges: bytes\r\n" + "Content-Length: 21887\r\n" + "Content-Type: text/css\r\n" + "Last-Modified: Fri, 09 Jan 2009 19:16:12 GMT\r\n" + "X-Powered-By: Servlet/2.4 JSP/2.0\r\n" + "\r\n" } + }; + size_t recvlen = 206; + boost::asio::ip::tcp::endpoint ep; + status = this->handle_sorryserver_recv(boost::this_thread::get_id(),ep,recvbuffer,recvlen); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_length, 206u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_offset, 0u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_message_rest_size, 22093u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_state, HTTP_HEADER); + BOOST_CHECK_EQUAL(status, this->session_thread_data_map[boost::this_thread::get_id()]->last_status); + BOOST_CHECK_EQUAL(status, CLIENT_CONNECTION_CHECK); + this->session_thread_data_map.clear(); + delete[] down_thread_data->data_buffer; + } + { + cout << "[270]--------------------------------------------- " << endl; + //unit_test[270] get_data_from_recvbuffer() 追加設定可能,データ状態がHTTP_START,find_http_header_all()検索結果が該当ありの場合 + //unit_test[270] check_http_version_and_status_code()チェック結果が正常の場合,find_http_header_content_length()検索結果が該当ありの場合, + //unit_test[270] status=CLIENT_CONNECTION_CHECK,データ状態にHTTP_HEADERを設定する + EVENT_TAG status; + thread_data_ptr down_thread_data(new session_thread_data_ip); + down_thread_data->current_message_rest_size = 0; + down_thread_data->data_buffer_size = MAX_BUFFER_SIZE; + down_thread_data->data_length = 0; + down_thread_data->data_offset = 0; + down_thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + //memcpy(down_thread_data->data_buffer,"abcdefghij",10); + down_thread_data->data_state = HTTP_START; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + boost::array recvbuffer= { { "HTTP/1.1 200 OK\r\n" + "Date: Thu, 29 Oct 2009 03:03:48 GMT\r\n" + "Accept-Ranges: bytes\r\n" + "Content-Length: 3\r\n" + "Content-Type: text/css\r\n" + "Last-Modified: Fri, 09 Jan 2009 19:16:12 GMT\r\n" + "X-Powered-By: Servlet/2.4 JSP/2.0\r\n" + "\r\n1234567" } + }; + size_t recvlen = strlen(recvbuffer.data()); + boost::asio::ip::tcp::endpoint ep; + status = this->handle_sorryserver_recv(boost::this_thread::get_id(),ep,recvbuffer,recvlen); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_length, recvlen); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_offset, 0u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_message_rest_size, strlen(recvbuffer.data())-7+3); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_state, HTTP_HEADER); + BOOST_CHECK_EQUAL(status, this->session_thread_data_map[boost::this_thread::get_id()]->last_status); + BOOST_CHECK_EQUAL(status, CLIENT_CONNECTION_CHECK); + this->session_thread_data_map.clear(); + delete[] down_thread_data->data_buffer; + } + + } + + //handle_sorryserver_recv_test_thread + void handle_sorryserver_recv_test_thread() + { + { + cout << "[271]--------------------------------------------- " << endl; + //unit_test[271] get_data_from_recvbuffer() 追加設定可能,データ状態がHTTP_START,find_http_header_all()検索結果が該当ありの場合 + //unit_test[271] check_http_version_and_status_code()チェック結果が正常の場合,find_http_header_content_length()検索結果が該当ありの場合, + //unit_test[271] status=CLIENT_CONNECTION_CHECK,データ状態にHTTP_HEADERを設定する + EVENT_TAG status; + thread_data_ptr down_thread_data(new session_thread_data_ip); + { + boost::mutex::scoped_lock sclock(session_thread_data_map_mutex); + down_thread_data->current_message_rest_size = 0; + down_thread_data->data_buffer_size = MAX_BUFFER_SIZE; + down_thread_data->data_length = 0; + down_thread_data->data_offset = 0; + down_thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + //memcpy(down_thread_data->data_buffer,"abcdefghij",10); + down_thread_data->data_state = HTTP_START; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + } + boost::array recvbuffer= { { "HTTP/1.1 200 OK\r\n" + "Date: Thu, 29 Oct 2009 03:03:48 GMT\r\n" + "Accept-Ranges: bytes\r\n" + "Content-Length: 3\r\n" + "Content-Type: text/css\r\n" + "Last-Modified: Fri, 09 Jan 2009 19:16:12 GMT\r\n" + "X-Powered-By: Servlet/2.4 JSP/2.0\r\n" + "\r\n1234567" } + }; + size_t recvlen = strlen(recvbuffer.data()); + boost::asio::ip::tcp::endpoint ep; + status = this->handle_sorryserver_recv(boost::this_thread::get_id(),ep,recvbuffer,recvlen); + { + boost::mutex::scoped_lock sclock(session_thread_data_map_mutex); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_length, recvlen); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_offset, 0u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_message_rest_size, strlen(recvbuffer.data())-7+3); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_state, HTTP_HEADER); + BOOST_CHECK_EQUAL(status, this->session_thread_data_map[boost::this_thread::get_id()]->last_status); + BOOST_CHECK_EQUAL(status, CLIENT_CONNECTION_CHECK); + delete[] down_thread_data->data_buffer; + } + } + } + + //handle_response_send_inform + void handle_response_send_inform_test() + { + cout << "[272]--------------------------------------------- " << endl; + //unit_test[272] 正常系で必ずSTOPを返す + boost::asio::ip::tcp::endpoint ep; + BOOST_CHECK_EQUAL(this->handle_response_send_inform(boost::this_thread::get_id()), STOP); + } + + //handle_client_connection_check + void handle_client_connection_check_test() + { + boost::array sendbuffer; + size_t datalen = 0; + size_t datalen_t = 0; + EVENT_TAG status; + char* ip_replication_area_begain = new char[100]; + int ip_replication_area_size = 100; + std::string session_id; + boost::asio::ip::tcp::endpoint virtual_service_endpoint; + getloglevel_func_type ingetloglevel = stb_getloglevel; + logger_func_type inputLogFatal = stb_putLogFatal; + logger_func_type inputLogError = stb_putLogError; + logger_func_type inputLogWarn = stb_putLogWarn; + logger_func_type inputLogInfo = stb_putLogInfo; + logger_func_type inputLogDebug = stb_putLogDebug; + boost::asio::ip::tcp::endpoint rs_endpoint(boost::asio::ip::address::from_string("172.16.58.239"), 12345); + + cout << "[273]--------------------------------------------- " << endl; + //unit_test[273] 異常系 session_thread_data_mapにスレッドIDが存在しない場合(map空) + //unit_test[273] 戻り値がFINALIZEで設定する。 + { + + status = this->handle_client_connection_check(boost::this_thread::get_id(), + sendbuffer, datalen); + BOOST_CHECK_EQUAL(status, FINALIZE); + this->session_thread_data_map.clear(); + } + + cout << "[274]--------------------------------------------- " << endl; + //unit_test[274] 異常系 session_thread_data_mapにスレッドIDが存在しない場合(map空ではない) + //unit_test[274] 戻り値がFINALIZEで設定する。 + { + boost::thread dumy_thread(up_thread_func); + thread_data_ptr down_thread_data(new session_thread_data_ip); + this->session_thread_data_map[dumy_thread.get_id()] = down_thread_data; + + status = this->handle_client_connection_check(boost::this_thread::get_id(), + sendbuffer, datalen); + BOOST_CHECK_EQUAL(status, FINALIZE); + this->session_thread_data_map.clear(); + } + + cout << "[275]--------------------------------------------- " << endl; + //unit_test[275] 異常系 session_thread_data_map中にスレッドID対応のデータがない + //unit_test[275] 戻り値がFINALIZEで設定する。 + { + + thread_data_ptr down_thread_data; + boost::thread thread_down(&down_thread_func); + + this->session_thread_data_map[thread_down.get_id()] = down_thread_data; + status = this->handle_client_connection_check(boost::this_thread::get_id(), + sendbuffer, datalen); + BOOST_CHECK_EQUAL(status, FINALIZE); + this->session_thread_data_map.clear(); + } + cout << "[276]--------------------------------------------- " << endl; + //unit_test[276] データ状態がUNKNOWNの場合 + //unit_test[276] 未送信データサイズを0になるの場合 + //unit_test[276] session_tableのlast_timeをnow_timeで更新する + //unit_test[276] 遷移先ステータスを設定するstatus = CLIENT_SEND + + { + boost::asio::ip::tcp::endpoint + ep1(boost::asio::ip::address::from_string("192.168.120.249"), + 12345); + boost::asio::ip::tcp::endpoint init_endpoint; + + thread_data_ptr down_thread_data(new session_thread_data_ip); + down_thread_data->data_buffer_size = MAX_BUFFER_SIZE; + down_thread_data->current_message_rest_size = 5u; + down_thread_data->data_state = UNKNOWN; + down_thread_data->data_length = 10u; + down_thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + down_thread_data->data_offset = 10u; + down_thread_data->client_endpoint = ep1; + down_thread_data->ip_hash = l7vs_ip_service_calc_hash(ep1); + + memset(down_thread_data->data_buffer + down_thread_data->data_offset, 1, down_thread_data->data_length); + + this->replication_data_processor = new ip_replication_data_processor_stub(ip_replication_area_begain, + ip_replication_area_size, virtual_service_endpoint, ingetloglevel, inputLogFatal, inputLogError, + inputLogWarn, inputLogInfo, inputLogDebug); + this->ip_data_processor = new ip_session_data_processor_stub( + 3600, this->replication_data_processor, ingetloglevel, + inputLogFatal, inputLogError, inputLogWarn, inputLogInfo, + inputLogDebug); + + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + datalen_t = std::min(std::min(sendbuffer.size(), down_thread_data->current_message_rest_size), + down_thread_data->data_length + ); + sendbuffer.assign('0'); + datalen = 0; + + ip_session_table_entry entry_input; + entry_input.last_time = 0; + (dynamic_cast(ip_data_processor)) + ->write_session_data_stub(down_thread_data->ip_hash, entry_input); + + status = this->handle_client_connection_check(boost::this_thread::get_id(), + sendbuffer, datalen); + + BOOST_CHECK_EQUAL(status, CLIENT_SEND); + BOOST_CHECK_EQUAL(datalen, datalen_t); + int cmp_ret = memcmp(sendbuffer.data(), + down_thread_data->data_buffer + down_thread_data->data_offset - datalen_t, datalen_t); + BOOST_CHECK_EQUAL(cmp_ret, 0); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_message_rest_size, 0u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_offset, 15u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_length, 5u); + + ip_session_table_entry entry = (dynamic_cast(ip_data_processor)) + ->get_session_data_stub(down_thread_data->ip_hash); + BOOST_CHECK_EQUAL(entry.rs_endpoint, init_endpoint); + BOOST_CHECK(entry.last_time != 0); + + delete down_thread_data->data_buffer; + delete this->ip_data_processor; + delete this->replication_data_processor; + this->ip_data_processor = NULL; + this->replication_data_processor = NULL; + this->session_thread_data_map.clear(); + } + + cout << "[277]--------------------------------------------- " << endl; + //unit_test[277] データ状態がUNKNOWNの場合 + //unit_test[277] 未送信データサイズを0になってない場合 + //unit_test[277] 遷移先ステータスを設定するstatus = CLIENT_SEND + + { + boost::asio::ip::tcp::endpoint + ep1(boost::asio::ip::address::from_string("192.168.120.249"), + 12345); + boost::asio::ip::tcp::endpoint init_endpoint; + + thread_data_ptr down_thread_data(new session_thread_data_ip); + down_thread_data->data_buffer_size = MAX_BUFFER_SIZE; + down_thread_data->current_message_rest_size = 15u; + down_thread_data->data_state = UNKNOWN; + down_thread_data->data_length = 10u; + down_thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + down_thread_data->data_offset = 10u; + down_thread_data->client_endpoint = ep1; + down_thread_data->ip_hash = l7vs_ip_service_calc_hash(ep1); + + memset(down_thread_data->data_buffer + down_thread_data->data_offset, 1, down_thread_data->data_length); + + this->replication_data_processor = new ip_replication_data_processor_stub(ip_replication_area_begain, + ip_replication_area_size, virtual_service_endpoint, ingetloglevel, inputLogFatal, inputLogError, + inputLogWarn, inputLogInfo, inputLogDebug); + this->ip_data_processor = new ip_session_data_processor_stub( + 3600, this->replication_data_processor, ingetloglevel, + inputLogFatal, inputLogError, inputLogWarn, inputLogInfo, + inputLogDebug); + + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + datalen_t = std::min(std::min(sendbuffer.size(), down_thread_data->current_message_rest_size), + down_thread_data->data_length + ); + sendbuffer.assign('0'); + datalen = 0; + + status = this->handle_client_connection_check(boost::this_thread::get_id(), + sendbuffer, datalen); + + BOOST_CHECK_EQUAL(status, CLIENT_SEND); + BOOST_CHECK_EQUAL(datalen, datalen_t); + int cmp_ret = memcmp(sendbuffer.data(), + down_thread_data->data_buffer + down_thread_data->data_offset - datalen_t, datalen_t); + BOOST_CHECK_EQUAL(cmp_ret, 0); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_message_rest_size, 5u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_offset, 20u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_length, 0u); + + delete down_thread_data->data_buffer; + delete this->ip_data_processor; + delete this->replication_data_processor; + this->ip_data_processor = NULL; + this->replication_data_processor = NULL; + this->session_thread_data_map.clear(); + } + cout << "[278]--------------------------------------------- " << endl; + //unit_test[278] データ状態がHTTP_STARTの場合 + //unit_test[278] 未送信データサイズを0になるの場合 + //unit_test[278] session_tableのlast_timeをnow_timeで更新する + //unit_test[278] 遷移先ステータスを設定するstatus = CLIENT_SEND + + { + boost::asio::ip::tcp::endpoint + ep1(boost::asio::ip::address::from_string("192.168.120.249"), + 12345); + boost::asio::ip::tcp::endpoint init_endpoint; + + thread_data_ptr down_thread_data(new session_thread_data_ip); + down_thread_data->data_buffer_size = MAX_BUFFER_SIZE; + down_thread_data->current_message_rest_size = 5u; + down_thread_data->data_state = UNKNOWN; + down_thread_data->data_length = 10u; + down_thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + down_thread_data->data_offset = 10u; + down_thread_data->client_endpoint = ep1; + down_thread_data->ip_hash = l7vs_ip_service_calc_hash(ep1); + + memset(down_thread_data->data_buffer + down_thread_data->data_offset, 1, down_thread_data->data_length); + + this->replication_data_processor = new ip_replication_data_processor_stub(ip_replication_area_begain, + ip_replication_area_size, virtual_service_endpoint, ingetloglevel, inputLogFatal, inputLogError, + inputLogWarn, inputLogInfo, inputLogDebug); + this->ip_data_processor = new ip_session_data_processor_stub( + 3600, this->replication_data_processor, ingetloglevel, + inputLogFatal, inputLogError, inputLogWarn, inputLogInfo, + inputLogDebug); + + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + datalen_t = std::min(std::min(sendbuffer.size(), down_thread_data->current_message_rest_size), + down_thread_data->data_length + ); + sendbuffer.assign('0'); + datalen = 0; + + ip_session_table_entry entry_input; + entry_input.last_time = 0; + (dynamic_cast(ip_data_processor)) + ->write_session_data_stub(down_thread_data->ip_hash, entry_input); + status = this->handle_client_connection_check(boost::this_thread::get_id(), + sendbuffer, datalen); + + BOOST_CHECK_EQUAL(status, CLIENT_SEND); + BOOST_CHECK_EQUAL(datalen, datalen_t); + int cmp_ret = memcmp(sendbuffer.data(), + down_thread_data->data_buffer + down_thread_data->data_offset - datalen_t, datalen_t); + BOOST_CHECK_EQUAL(cmp_ret, 0); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_message_rest_size, 0u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_offset, 15u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_length, 5u); + + ip_session_table_entry entry_out = (dynamic_cast(ip_data_processor)) + ->get_session_data_stub(down_thread_data->ip_hash); + BOOST_CHECK_EQUAL(entry_out.rs_endpoint, init_endpoint); + BOOST_CHECK(entry_out.last_time != 0); + + delete down_thread_data->data_buffer; + delete this->ip_data_processor; + delete this->replication_data_processor; + this->ip_data_processor = NULL; + this->replication_data_processor = NULL; + this->session_thread_data_map.clear(); + } + cout << "[279]--------------------------------------------- " << endl; + //unit_test[279] データ状態がHTTP_STARTの場合 + //unit_test[279] 未送信データサイズを0になってない場合 + //unit_test[279] 遷移先ステータスを設定するstatus = CLIENT_SEND + + { + boost::asio::ip::tcp::endpoint + ep1(boost::asio::ip::address::from_string("192.168.120.249"), + 12345); + boost::asio::ip::tcp::endpoint init_endpoint; + + thread_data_ptr down_thread_data(new session_thread_data_ip); + down_thread_data->data_buffer_size = MAX_BUFFER_SIZE; + down_thread_data->current_message_rest_size = 15u; + down_thread_data->data_state = HTTP_START; + down_thread_data->data_length = 10u; + down_thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + down_thread_data->data_offset = 10u; + down_thread_data->client_endpoint = ep1; + down_thread_data->ip_hash = l7vs_ip_service_calc_hash(ep1); + + memset(down_thread_data->data_buffer + down_thread_data->data_offset, 1, down_thread_data->data_length); + + this->replication_data_processor = new ip_replication_data_processor_stub(ip_replication_area_begain, + ip_replication_area_size, virtual_service_endpoint, ingetloglevel, inputLogFatal, inputLogError, + inputLogWarn, inputLogInfo, inputLogDebug); + this->ip_data_processor = new ip_session_data_processor_stub( + 3600, this->replication_data_processor, ingetloglevel, + inputLogFatal, inputLogError, inputLogWarn, inputLogInfo, + inputLogDebug); + + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + datalen_t = std::min(std::min(sendbuffer.size(), down_thread_data->current_message_rest_size), + down_thread_data->data_length + ); + + sendbuffer.assign('0'); + datalen = 0; + + status = this->handle_client_connection_check(boost::this_thread::get_id(), + sendbuffer, datalen); + + BOOST_CHECK_EQUAL(status, CLIENT_SEND); + BOOST_CHECK_EQUAL(datalen, datalen_t); + int cmp_ret = memcmp(sendbuffer.data(), + down_thread_data->data_buffer + down_thread_data->data_offset - datalen_t, datalen_t); + BOOST_CHECK_EQUAL(cmp_ret, 0); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_message_rest_size, 5u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_offset, 20u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_length, 0u); + + delete down_thread_data->data_buffer; + delete this->ip_data_processor; + delete this->replication_data_processor; + this->ip_data_processor = NULL; + this->replication_data_processor = NULL; + this->session_thread_data_map.clear(); + } + cout << "[280]--------------------------------------------- " << endl; + //unit_test[280] データ状態がHTTP_BODYの場合 + //unit_test[280] 未送信データサイズを0になるの場合 + //unit_test[280] session_tableのlast_timeをnow_timeで更新する + //unit_test[280] 遷移先ステータスを設定するstatus = CLIENT_SEND + + { + boost::asio::ip::tcp::endpoint + ep1(boost::asio::ip::address::from_string("192.168.120.249"), + 12345); + boost::asio::ip::tcp::endpoint init_endpoint; + + thread_data_ptr down_thread_data(new session_thread_data_ip); + down_thread_data->data_buffer_size = MAX_BUFFER_SIZE; + down_thread_data->current_message_rest_size = 5u; + down_thread_data->data_state = HTTP_BODY; + down_thread_data->data_length = 10u; + down_thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + down_thread_data->data_offset = 10u; + down_thread_data->client_endpoint = ep1; + down_thread_data->ip_hash = l7vs_ip_service_calc_hash(ep1); + + memset(down_thread_data->data_buffer + down_thread_data->data_offset, 1, down_thread_data->data_length); + + this->replication_data_processor = new ip_replication_data_processor_stub(ip_replication_area_begain, + ip_replication_area_size, virtual_service_endpoint, ingetloglevel, inputLogFatal, inputLogError, + inputLogWarn, inputLogInfo, inputLogDebug); + this->ip_data_processor = new ip_session_data_processor_stub( + 3600, this->replication_data_processor, ingetloglevel, + inputLogFatal, inputLogError, inputLogWarn, inputLogInfo, + inputLogDebug); + + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + datalen_t = std::min(std::min(sendbuffer.size(), down_thread_data->current_message_rest_size), + down_thread_data->data_length + ); + sendbuffer.assign('0'); + datalen = 0; + + ip_session_table_entry entry_input; + entry_input.last_time = 0; + (dynamic_cast(ip_data_processor)) + ->write_session_data_stub(down_thread_data->ip_hash, entry_input); + status = this->handle_client_connection_check(boost::this_thread::get_id(), + sendbuffer, datalen); + + BOOST_CHECK_EQUAL(status, CLIENT_SEND); + BOOST_CHECK_EQUAL(datalen, datalen_t); + int cmp_ret = memcmp(sendbuffer.data(), + down_thread_data->data_buffer + down_thread_data->data_offset - datalen_t, datalen_t); + BOOST_CHECK_EQUAL(cmp_ret, 0); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_message_rest_size, 0u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_offset, 15u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_length, 5u); + + ip_session_table_entry entry_out = (dynamic_cast(ip_data_processor)) + ->get_session_data_stub(down_thread_data->ip_hash); + BOOST_CHECK_EQUAL(entry_out.rs_endpoint, init_endpoint); + BOOST_CHECK(entry_out.last_time != 0); + + delete down_thread_data->data_buffer; + delete this->ip_data_processor; + delete this->replication_data_processor; + this->ip_data_processor = NULL; + this->replication_data_processor = NULL; + this->session_thread_data_map.clear(); + } + cout << "[281]--------------------------------------------- " << endl; + //unit_test[281] データ状態がHTTP_BODYの場合 + //unit_test[281] 未送信データサイズを0になってない場合 + //unit_test[281] 遷移先ステータスを設定するstatus = CLIENT_SEND + + { + boost::asio::ip::tcp::endpoint + ep1(boost::asio::ip::address::from_string("192.168.120.249"), + 12345); + boost::asio::ip::tcp::endpoint init_endpoint; + + thread_data_ptr down_thread_data(new session_thread_data_ip); + down_thread_data->data_buffer_size = MAX_BUFFER_SIZE; + down_thread_data->current_message_rest_size = 15u; + down_thread_data->data_state = HTTP_BODY; + down_thread_data->data_length = 10u; + down_thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + down_thread_data->data_offset = 10u; + down_thread_data->client_endpoint = ep1; + down_thread_data->ip_hash = l7vs_ip_service_calc_hash(ep1); + + memset(down_thread_data->data_buffer + down_thread_data->data_offset, 1, down_thread_data->data_length); + + this->replication_data_processor = new ip_replication_data_processor_stub(ip_replication_area_begain, + ip_replication_area_size, virtual_service_endpoint, ingetloglevel, inputLogFatal, inputLogError, + inputLogWarn, inputLogInfo, inputLogDebug); + this->ip_data_processor = new ip_session_data_processor_stub( + 3600, this->replication_data_processor, ingetloglevel, + inputLogFatal, inputLogError, inputLogWarn, inputLogInfo, + inputLogDebug); + + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + datalen_t = std::min(std::min(sendbuffer.size(), down_thread_data->current_message_rest_size), + down_thread_data->data_length + ); + + sendbuffer.assign('0'); + datalen = 0; + + status = this->handle_client_connection_check(boost::this_thread::get_id(), + sendbuffer, datalen); + + BOOST_CHECK_EQUAL(status, CLIENT_SEND); + BOOST_CHECK_EQUAL(datalen, datalen_t); + int cmp_ret = memcmp(sendbuffer.data(), + down_thread_data->data_buffer + down_thread_data->data_offset - datalen_t, datalen_t); + BOOST_CHECK_EQUAL(cmp_ret, 0); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_message_rest_size, 5u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_offset, 20u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_length, 0u); + + delete down_thread_data->data_buffer; + delete this->ip_data_processor; + delete this->replication_data_processor; + this->ip_data_processor = NULL; + this->replication_data_processor = NULL; + this->session_thread_data_map.clear(); + } + cout << "[282]--------------------------------------------- " << endl; + //unit_test[282] データ状態がHTTP_HEADERの場合 + //unit_test[282] 未送信データサイズを0になるの場合 + //unit_test[282] session_tableのlast_timeをnow_timeで更新する + //unit_test[282] データ状態にHTTP_BODYを設定する + //unit_test[282] 遷移先ステータスを設定するstatus = CLIENT_SEND + + { + boost::asio::ip::tcp::endpoint + ep1(boost::asio::ip::address::from_string("192.168.120.249"), + 12345); + boost::asio::ip::tcp::endpoint init_endpoint; + + thread_data_ptr down_thread_data(new session_thread_data_ip); + down_thread_data->data_buffer_size = MAX_BUFFER_SIZE; + down_thread_data->current_message_rest_size = 5u; + down_thread_data->data_state = HTTP_HEADER; + down_thread_data->data_length = 10u; + down_thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + down_thread_data->data_offset = 10u; + down_thread_data->client_endpoint = ep1; + down_thread_data->ip_hash = l7vs_ip_service_calc_hash(ep1); + + memset(down_thread_data->data_buffer + down_thread_data->data_offset, 1, down_thread_data->data_length); + + this->replication_data_processor = new ip_replication_data_processor_stub(ip_replication_area_begain, + ip_replication_area_size, virtual_service_endpoint, ingetloglevel, inputLogFatal, inputLogError, + inputLogWarn, inputLogInfo, inputLogDebug); + this->ip_data_processor = new ip_session_data_processor_stub( + 3600, this->replication_data_processor, ingetloglevel, + inputLogFatal, inputLogError, inputLogWarn, inputLogInfo, + inputLogDebug); + + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + datalen_t = std::min(std::min(sendbuffer.size(), down_thread_data->current_message_rest_size), + down_thread_data->data_length + ); + sendbuffer.assign('0'); + datalen = 0; + + ip_session_table_entry entry_input; + entry_input.last_time = 0; + (dynamic_cast(ip_data_processor)) + ->write_session_data_stub(down_thread_data->ip_hash, entry_input); + status = this->handle_client_connection_check(boost::this_thread::get_id(), + sendbuffer, datalen); + + BOOST_CHECK_EQUAL(status, CLIENT_SEND); + BOOST_CHECK_EQUAL(datalen, datalen_t); + BOOST_CHECK_EQUAL(down_thread_data->data_state, HTTP_BODY); + int cmp_ret = memcmp(sendbuffer.data(), + down_thread_data->data_buffer + down_thread_data->data_offset - datalen_t, datalen_t); + BOOST_CHECK_EQUAL(cmp_ret, 0); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_message_rest_size, 0u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_offset, 15u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_length, 5u); + + ip_session_table_entry entry_out = (dynamic_cast(ip_data_processor)) + ->get_session_data_stub(down_thread_data->ip_hash); + BOOST_CHECK_EQUAL(entry_out.rs_endpoint, init_endpoint); + BOOST_CHECK(entry_out.last_time != 0); + + delete down_thread_data->data_buffer; + delete this->ip_data_processor; + delete this->replication_data_processor; + this->ip_data_processor = NULL; + this->replication_data_processor = NULL; + this->session_thread_data_map.clear(); + } + cout << "[283]--------------------------------------------- " << endl; + //unit_test[283] データ状態がHTTP_HEADERの場合 + //unit_test[283] 未送信データサイズを0になってない場合 + //unit_test[283] データ状態にHTTP_BODYを設定する + //unit_test[283] 遷移先ステータスを設定するstatus = CLIENT_SEND + + { + boost::asio::ip::tcp::endpoint + ep1(boost::asio::ip::address::from_string("192.168.120.249"), + 12345); + boost::asio::ip::tcp::endpoint init_endpoint; + + thread_data_ptr down_thread_data(new session_thread_data_ip); + down_thread_data->data_buffer_size = MAX_BUFFER_SIZE; + down_thread_data->current_message_rest_size = 15u; + down_thread_data->data_state = HTTP_HEADER; + down_thread_data->data_length = 10u; + down_thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + down_thread_data->data_offset = 10u; + down_thread_data->client_endpoint = ep1; + down_thread_data->ip_hash = l7vs_ip_service_calc_hash(ep1); + + memset(down_thread_data->data_buffer + down_thread_data->data_offset, 1, down_thread_data->data_length); + + this->replication_data_processor = new ip_replication_data_processor_stub(ip_replication_area_begain, + ip_replication_area_size, virtual_service_endpoint, ingetloglevel, inputLogFatal, inputLogError, + inputLogWarn, inputLogInfo, inputLogDebug); + this->ip_data_processor = new ip_session_data_processor_stub( + 3600, this->replication_data_processor, ingetloglevel, + inputLogFatal, inputLogError, inputLogWarn, inputLogInfo, + inputLogDebug); + + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + datalen_t = std::min(std::min(sendbuffer.size(), down_thread_data->current_message_rest_size), + down_thread_data->data_length + ); + + sendbuffer.assign('0'); + datalen = 0; + + status = this->handle_client_connection_check(boost::this_thread::get_id(), + sendbuffer, datalen); + + BOOST_CHECK_EQUAL(status, CLIENT_SEND); + BOOST_CHECK_EQUAL(datalen, datalen_t); + BOOST_CHECK_EQUAL(down_thread_data->data_state, HTTP_BODY); + + int cmp_ret = memcmp(sendbuffer.data(), + down_thread_data->data_buffer + down_thread_data->data_offset - datalen_t, datalen_t); + BOOST_CHECK_EQUAL(cmp_ret, 0); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_message_rest_size, 5u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_offset, 20u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_length, 0u); + + delete down_thread_data->data_buffer; + delete this->ip_data_processor; + delete this->replication_data_processor; + this->ip_data_processor = NULL; + this->replication_data_processor = NULL; + this->session_thread_data_map.clear(); + } + + delete [] ip_replication_area_begain; + } + + void handle_client_connection_check_test_thread() + { + boost::array sendbuffer; + size_t datalen = 0; + size_t datalen_t = 0; + EVENT_TAG status; + char* ip_replication_area_begain = new char[100]; + int ip_replication_area_size = 100; + std::string session_id; + boost::asio::ip::tcp::endpoint virtual_service_endpoint; + getloglevel_func_type ingetloglevel = stb_getloglevel; + logger_func_type inputLogFatal = stb_putLogFatal; + logger_func_type inputLogError = stb_putLogError; + logger_func_type inputLogWarn = stb_putLogWarn; + logger_func_type inputLogInfo = stb_putLogInfo; + logger_func_type inputLogDebug = stb_putLogDebug; + boost::asio::ip::tcp::endpoint rs_endpoint(boost::asio::ip::address::from_string("172.16.58.239"), 12345); + boost::asio::ip::tcp::endpoint init_endpoint; + { + cout << "[284]--------------------------------------------- " << endl; + //unit_test[284] データ状態がUNKNOWNの場合 + //unit_test[284] 未送信データサイズを0になるの場合 + //unit_test[284] session_tableのlast_timeをnow_timeで更新する + //unit_test[284] 遷移先ステータスを設定するstatus = CLIENT_SEND + thread_data_ptr down_thread_data(new session_thread_data_ip); + { + boost::mutex::scoped_lock sclock(session_thread_data_map_mutex); + boost::asio::ip::tcp::endpoint + ep1(boost::asio::ip::address::from_string("192.168.120.249"), + 12345); + + + down_thread_data->data_buffer_size = MAX_BUFFER_SIZE; + down_thread_data->current_message_rest_size = 5u; + down_thread_data->data_state = UNKNOWN; + down_thread_data->data_length = 10u; + down_thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + down_thread_data->data_offset = 10u; + down_thread_data->client_endpoint = ep1; + down_thread_data->ip_hash = l7vs_ip_service_calc_hash(ep1); + + memset(down_thread_data->data_buffer + down_thread_data->data_offset, 1, down_thread_data->data_length); + + this->replication_data_processor = new ip_replication_data_processor_stub(ip_replication_area_begain, + ip_replication_area_size, virtual_service_endpoint, ingetloglevel, inputLogFatal, inputLogError, + inputLogWarn, inputLogInfo, inputLogDebug); + this->ip_data_processor = new ip_session_data_processor_stub( + 3600, this->replication_data_processor, ingetloglevel, + inputLogFatal, inputLogError, inputLogWarn, inputLogInfo, + inputLogDebug); + + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + datalen_t = std::min(std::min(sendbuffer.size(), down_thread_data->current_message_rest_size), + down_thread_data->data_length + ); + sendbuffer.assign('0'); + datalen = 0; + + } + { + boost::mutex::scoped_lock sclock(session_data_mutex); + ip_session_table_entry entry_input; + entry_input.last_time = 0; + (dynamic_cast(ip_data_processor)) + ->write_session_data_stub(down_thread_data->ip_hash, entry_input); + } + + + status = this->handle_client_connection_check(boost::this_thread::get_id(), + sendbuffer, datalen); + { + boost::mutex::scoped_lock sclock(session_thread_data_map_mutex); + BOOST_CHECK_EQUAL(status, CLIENT_SEND); + BOOST_CHECK_EQUAL(datalen, datalen_t); + int cmp_ret = memcmp(sendbuffer.data(), + down_thread_data->data_buffer + down_thread_data->data_offset - datalen_t, datalen_t); + BOOST_CHECK_EQUAL(cmp_ret, 0); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_message_rest_size, 0u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_offset, 15u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_length, 15u); + + ip_session_table_entry entry = (dynamic_cast(ip_data_processor)) + ->get_session_data_stub(down_thread_data->ip_hash); + //BOOST_CHECK_EQUAL(entry.rs_endpoint, init_endpoint); + //BOOST_CHECK(entry.last_time != 0); + + delete down_thread_data->data_buffer; + this->session_thread_data_map.erase(boost::this_thread::get_id()); + + } + delete [] ip_replication_area_begain; + } + } + + //handle_client_select + void handle_client_select_test() + { + cout << "[285]--------------------------------------------- " << endl; + //unit_test[285] 戻り値がSTOPで設定する。 + boost::asio::ip::udp::endpoint cl_endpoint; + boost::array sendbuffer; + size_t datalen; + EVENT_TAG status; + status = this->handle_client_select(boost::this_thread::get_id(), cl_endpoint, sendbuffer, datalen); + BOOST_CHECK_EQUAL(status, STOP); + } + + //handle_client_send + void handle_client_send_test() + { + { + cout << "[286]--------------------------------------------- " << endl; + //unit_test[286] 未送信データサイズ>0, データサイズ>0, 切替中フラグON, SORRYフラグONの場合, status = CLIENT_CONNECTION_CHECK + EVENT_TAG status; + thread_data_ptr down_thread_data(new session_thread_data_ip); + down_thread_data->current_message_rest_size = 10; + down_thread_data->data_length = 20; + down_thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + down_thread_data->switch_flag = SWITCH_FLAG_ON; + down_thread_data->sorry_flag = SORRY_FLAG_ON; + down_thread_data->data_offset = 0; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + status = this->handle_client_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(status, CLIENT_CONNECTION_CHECK); + BOOST_CHECK_EQUAL(status, this->session_thread_data_map[boost::this_thread::get_id()]->last_status); + this->session_thread_data_map.clear(); + delete[] down_thread_data->data_buffer; + } + { + cout << "[287]--------------------------------------------- " << endl; + //unit_test[287] 未送信データサイズ>0, データサイズが0, 切替中フラグON, SORRYフラグONの場合, status = CLIENT_DISCONNECT + EVENT_TAG status; + thread_data_ptr down_thread_data(new session_thread_data_ip); + down_thread_data->current_message_rest_size = 10; + down_thread_data->data_length = 0; + down_thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + down_thread_data->switch_flag = SWITCH_FLAG_ON; + down_thread_data->sorry_flag = SORRY_FLAG_ON; + down_thread_data->data_offset = 0; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + status = this->handle_client_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL((size_t)0, this->session_thread_data_map[boost::this_thread::get_id()]->data_offset); + BOOST_CHECK_EQUAL(status, CLIENT_DISCONNECT); + BOOST_CHECK_EQUAL(status, this->session_thread_data_map[boost::this_thread::get_id()]->last_status); + this->session_thread_data_map.clear(); + delete[] down_thread_data->data_buffer; + } + { + cout << "[288]--------------------------------------------- " << endl; + //unit_test[288] 未送信データサイズが0, データサイズ>0, find_http_header_all(), 検索結果が該当なし, 切替中フラグON, SORRYフラグONの場合 + //unit_test[288] status = CLIENT_DISCONNECT + EVENT_TAG status; + thread_data_ptr down_thread_data(new session_thread_data_ip); + down_thread_data->current_message_rest_size = 0; + down_thread_data->data_length = 14; + down_thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset(down_thread_data->data_buffer, 0, MAX_BUFFER_SIZE); + strcpy(down_thread_data->data_buffer, "HTTP/1.1 200\r\n"); + down_thread_data->switch_flag = SWITCH_FLAG_ON; + down_thread_data->sorry_flag = SORRY_FLAG_ON; + down_thread_data->data_state = HTTP_BODY; + down_thread_data->data_offset = 0; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + status = this->handle_client_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(status, CLIENT_DISCONNECT); + BOOST_CHECK_EQUAL(status, this->session_thread_data_map[boost::this_thread::get_id()]->last_status); + BOOST_CHECK_EQUAL(HTTP_START, this->session_thread_data_map[boost::this_thread::get_id()]->data_state); + this->session_thread_data_map.clear(); + } + { + cout << "[289]--------------------------------------------- " << endl; + //unit_test[289] 未送信データサイズが0, データサイズ>0, find_http_header_all(), 検索結果が該当あり + //unit_test[289] check_http_version_and_status_code, チェック結果が異常, 切替中フラグON, SORRYフラグONの場合, status = CLIENT_CONNECTION_CHECK + EVENT_TAG status; + thread_data_ptr down_thread_data(new session_thread_data_ip); + down_thread_data->current_message_rest_size = 0; + down_thread_data->data_length = 20; + down_thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset(down_thread_data->data_buffer, 0, MAX_BUFFER_SIZE); + strcpy(down_thread_data->data_buffer, "ABCDEFG\r\nHIJKLMN\r\n\r\n"); + down_thread_data->switch_flag = SWITCH_FLAG_ON; + down_thread_data->sorry_flag = SORRY_FLAG_ON; + down_thread_data->data_state = HTTP_BODY; + down_thread_data->data_offset = 0; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + status = this->handle_client_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(status, CLIENT_CONNECTION_CHECK); + BOOST_CHECK_EQUAL(status, this->session_thread_data_map[boost::this_thread::get_id()]->last_status); + BOOST_CHECK_EQUAL(UNKNOWN, this->session_thread_data_map[boost::this_thread::get_id()]->data_state); + this->session_thread_data_map.clear(); + } + { + cout << "[290]--------------------------------------------- " << endl; + //unit_test[290] 未送信データサイズが0, データサイズ>0, find_http_header_all(), 検索結果が該当あり + //unit_test[290] check_http_version_and_status_code, チェック結果が正常, find_http_header_content_length + //unit_test[290] 検索結果が該当あり, 切替中フラグON, SORRYフラグONの場合 + EVENT_TAG status; + thread_data_ptr down_thread_data(new session_thread_data_ip); + down_thread_data->current_message_rest_size = 0; + down_thread_data->data_length = 206; + down_thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset(down_thread_data->data_buffer, 0, MAX_BUFFER_SIZE); + strcpy(down_thread_data->data_buffer, "HTTP/1.1 200 OK\r\n" + "Date: Thu, 29 Oct 2009 03:03:48 GMT\r\n" + "Accept-Ranges: bytes\r\n" + "Content-Length: 21887\r\n" + "Content-Type: text/css\r\n" + "Last-Modified: Fri, 09 Jan 2009 19:16:12 GMT\r\n" + "X-Powered-By: Servlet/2.4 JSP/2.0\r\n" + "\r\n"); + down_thread_data->switch_flag = SWITCH_FLAG_ON; + down_thread_data->sorry_flag = SORRY_FLAG_ON; + down_thread_data->data_state = HTTP_BODY; + down_thread_data->data_offset = 0; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + status = this->handle_client_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(status, CLIENT_CONNECTION_CHECK); + BOOST_CHECK_EQUAL(status, this->session_thread_data_map[boost::this_thread::get_id()]->last_status); + BOOST_CHECK_EQUAL(HTTP_HEADER, this->session_thread_data_map[boost::this_thread::get_id()]->data_state); + BOOST_CHECK_EQUAL((size_t)(21887 + 206), this->session_thread_data_map[boost::this_thread::get_id()]->current_message_rest_size); + this->session_thread_data_map.clear(); + } + { + cout << "[291]--------------------------------------------- " << endl; + //unit_test[291] 未送信データサイズが0, データサイズ>0, find_http_header_all(), 検索結果が該当あり + //unit_test[291] check_http_version_and_status_code, チェック結果が正常, find_http_header_content_length + //unit_test[291] 検索結果が該当なしり, 切替中フラグON, SORRYフラグONの場合 + EVENT_TAG status; + thread_data_ptr down_thread_data(new session_thread_data_ip); + down_thread_data->current_message_rest_size = 0; + down_thread_data->data_length = 206; + down_thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset(down_thread_data->data_buffer, 0, MAX_BUFFER_SIZE); + strcpy(down_thread_data->data_buffer, "HTTP/1.1 200 OK\r\n" + "Date: Thu, 29 Oct 2009 03:03:48 GMT\r\n" + "Accept-Ranges: bytes\r\n" + "XXXXXXX-XXXXXX: 21887\r\n" + "Content-Type: text/css\r\n" + "Last-Modified: Fri, 09 Jan 2009 19:16:12 GMT\r\n" + "X-Powered-By: Servlet/2.4 JSP/2.0\r\n" + "\r\n"); + down_thread_data->switch_flag = SWITCH_FLAG_ON; + down_thread_data->sorry_flag = SORRY_FLAG_ON; + down_thread_data->data_state = HTTP_BODY; + down_thread_data->data_offset = 0; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + status = this->handle_client_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(status, CLIENT_CONNECTION_CHECK); + BOOST_CHECK_EQUAL(status, this->session_thread_data_map[boost::this_thread::get_id()]->last_status); + BOOST_CHECK_EQUAL(HTTP_HEADER, this->session_thread_data_map[boost::this_thread::get_id()]->data_state); + BOOST_CHECK_EQUAL((size_t)206, this->session_thread_data_map[boost::this_thread::get_id()]->current_message_rest_size); + this->session_thread_data_map.clear(); + } + { + cout << "[292]--------------------------------------------- " << endl; + //unit_test[292] 未送信データサイズが0, データサイズが0,切替中フラグON, SORRYフラグONの場合 + EVENT_TAG status; + thread_data_ptr down_thread_data(new session_thread_data_ip); + down_thread_data->current_message_rest_size = 0; + down_thread_data->data_length = 0; + down_thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + down_thread_data->switch_flag = SWITCH_FLAG_ON; + down_thread_data->data_state = HTTP_BODY; + down_thread_data->sorry_flag = SORRY_FLAG_ON; + down_thread_data->data_offset = 0; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + status = this->handle_client_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(status, CLIENT_DISCONNECT); + BOOST_CHECK_EQUAL(status, this->session_thread_data_map[boost::this_thread::get_id()]->last_status); + BOOST_CHECK_EQUAL(HTTP_START, this->session_thread_data_map[boost::this_thread::get_id()]->data_state); + BOOST_CHECK_EQUAL((size_t)0, this->session_thread_data_map[boost::this_thread::get_id()]->data_offset); + delete[] down_thread_data->data_buffer; + this->session_thread_data_map.clear(); + } + { + cout << "[293]--------------------------------------------- " << endl; + //unit_test[293] 未送信データサイズ>0, データサイズ>0, 切替中フラグOFF, SORRYフラグONの場合, status = CLIENT_CONNECTION_CHECK + EVENT_TAG status; + thread_data_ptr down_thread_data(new session_thread_data_ip); + down_thread_data->current_message_rest_size = 10; + down_thread_data->data_length = 20; + down_thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + down_thread_data->switch_flag = SWITCH_FLAG_OFF; + down_thread_data->data_state = HTTP_BODY; + down_thread_data->sorry_flag = SORRY_FLAG_ON; + down_thread_data->data_offset = 0; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + status = this->handle_client_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(status, CLIENT_CONNECTION_CHECK); + BOOST_CHECK_EQUAL(status, this->session_thread_data_map[boost::this_thread::get_id()]->last_status); + this->session_thread_data_map.clear(); + delete[] down_thread_data->data_buffer; + } + { + cout << "[294]--------------------------------------------- " << endl; + //unit_test[294] 未送信データサイズ>0, データサイズが0, 切替中フラグOFF, SORRYフラグONの場合, status = SORRYSERVER_RECV + EVENT_TAG status; + thread_data_ptr down_thread_data(new session_thread_data_ip); + down_thread_data->current_message_rest_size = 10; + down_thread_data->data_length = 0; + down_thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + down_thread_data->switch_flag = SWITCH_FLAG_OFF; + down_thread_data->data_state = HTTP_BODY; + down_thread_data->sorry_flag = SORRY_FLAG_ON; + down_thread_data->data_offset = 0; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + status = this->handle_client_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL((size_t)0, this->session_thread_data_map[boost::this_thread::get_id()]->data_offset); + BOOST_CHECK_EQUAL(status, SORRYSERVER_RECV); + BOOST_CHECK_EQUAL(status, this->session_thread_data_map[boost::this_thread::get_id()]->last_status); + this->session_thread_data_map.clear(); + delete[] down_thread_data->data_buffer; + } + { + cout << "[295]--------------------------------------------- " << endl; + //unit_test[295] 未送信データサイズが0, データサイズ>0, find_http_header_all(), 検索結果が該当なし, 切替中フラグOFF, SORRYフラグONの場合 + //unit_test[295] status = SORRYSERVER_RECV + EVENT_TAG status; + thread_data_ptr down_thread_data(new session_thread_data_ip); + down_thread_data->current_message_rest_size = 0; + down_thread_data->data_length = 14; + down_thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset(down_thread_data->data_buffer, 0, MAX_BUFFER_SIZE); + strcpy(down_thread_data->data_buffer, "HTTP/1.1 200\r\n"); + down_thread_data->switch_flag = SWITCH_FLAG_OFF; + down_thread_data->data_state = HTTP_BODY; + down_thread_data->sorry_flag = SORRY_FLAG_ON; + down_thread_data->data_offset = 0; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + status = this->handle_client_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(status, SORRYSERVER_RECV); + BOOST_CHECK_EQUAL(status, this->session_thread_data_map[boost::this_thread::get_id()]->last_status); + BOOST_CHECK_EQUAL(HTTP_START, this->session_thread_data_map[boost::this_thread::get_id()]->data_state); + this->session_thread_data_map.clear(); + } + { + cout << "[296]--------------------------------------------- " << endl; + //unit_test[296] 未送信データサイズが0, データサイズ>0, find_http_header_all(), 検索結果が該当あり + //unit_test[296] check_http_version_and_status_code, チェック結果が異常, 切替中フラグOFF, SORRYフラグONの場合, status = CLIENT_CONNECTION_CHECK + EVENT_TAG status; + thread_data_ptr down_thread_data(new session_thread_data_ip); + down_thread_data->current_message_rest_size = 0; + down_thread_data->data_length = 20; + down_thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset(down_thread_data->data_buffer, 0, MAX_BUFFER_SIZE); + strcpy(down_thread_data->data_buffer, "ABCDEFG\r\nHIJKLMN\r\n\r\n"); + down_thread_data->switch_flag = SWITCH_FLAG_OFF; + down_thread_data->data_state = HTTP_BODY; + down_thread_data->sorry_flag = SORRY_FLAG_ON; + down_thread_data->data_offset = 0; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + status = this->handle_client_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(status, CLIENT_CONNECTION_CHECK); + BOOST_CHECK_EQUAL(status, this->session_thread_data_map[boost::this_thread::get_id()]->last_status); + BOOST_CHECK_EQUAL(UNKNOWN, this->session_thread_data_map[boost::this_thread::get_id()]->data_state); + this->session_thread_data_map.clear(); + } + { + cout << "[297]--------------------------------------------- " << endl; + //unit_test[297] 未送信データサイズが0, データサイズ>0, find_http_header_all(), 検索結果が該当あり + //unit_test[297] check_http_version_and_status_code, チェック結果が正常, find_http_header_content_length + //unit_test[297] 検索結果が該当あり, 切替中フラグOFF, SORRYフラグONの場合 + EVENT_TAG status; + thread_data_ptr down_thread_data(new session_thread_data_ip); + down_thread_data->current_message_rest_size = 0; + down_thread_data->data_length = 206; + down_thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset(down_thread_data->data_buffer, 0, MAX_BUFFER_SIZE); + strcpy(down_thread_data->data_buffer, "HTTP/1.1 200 OK\r\n" + "Date: Thu, 29 Oct 2009 03:03:48 GMT\r\n" + "Accept-Ranges: bytes\r\n" + "Content-Length: 21887\r\n" + "Content-Type: text/css\r\n" + "Last-Modified: Fri, 09 Jan 2009 19:16:12 GMT\r\n" + "X-Powered-By: Servlet/2.4 JSP/2.0\r\n" + "\r\n"); + down_thread_data->switch_flag = SWITCH_FLAG_OFF; + down_thread_data->data_state = HTTP_BODY; + down_thread_data->sorry_flag = SORRY_FLAG_ON; + down_thread_data->data_offset = 0; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + status = this->handle_client_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(status, CLIENT_CONNECTION_CHECK); + BOOST_CHECK_EQUAL(status, this->session_thread_data_map[boost::this_thread::get_id()]->last_status); + BOOST_CHECK_EQUAL(HTTP_HEADER, this->session_thread_data_map[boost::this_thread::get_id()]->data_state); + BOOST_CHECK_EQUAL((size_t)(21887 + 206), this->session_thread_data_map[boost::this_thread::get_id()]->current_message_rest_size); + this->session_thread_data_map.clear(); + } + { + cout << "[298]--------------------------------------------- " << endl; + //unit_test[298] 未送信データサイズが0, データサイズ>0, find_http_header_all(), 検索結果が該当あり + //unit_test[298] check_http_version_and_status_code, チェック結果が正常, find_http_header_content_length + //unit_test[298] 検索結果が該当なしり, 切替中フラグOFF, SORRYフラグONの場合 + EVENT_TAG status; + thread_data_ptr down_thread_data(new session_thread_data_ip); + down_thread_data->current_message_rest_size = 0; + down_thread_data->data_length = 206; + down_thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset(down_thread_data->data_buffer, 0, MAX_BUFFER_SIZE); + strcpy(down_thread_data->data_buffer, "HTTP/1.1 200 OK\r\n" + "Date: Thu, 29 Oct 2009 03:03:48 GMT\r\n" + "Accept-Ranges: bytes\r\n" + "XXXXXXX-XXXXXX: 21887\r\n" + "Content-Type: text/css\r\n" + "Last-Modified: Fri, 09 Jan 2009 19:16:12 GMT\r\n" + "X-Powered-By: Servlet/2.4 JSP/2.0\r\n" + "\r\n"); + down_thread_data->switch_flag = SWITCH_FLAG_OFF; + down_thread_data->data_state = HTTP_BODY; + down_thread_data->sorry_flag = SORRY_FLAG_ON; + down_thread_data->data_offset = 0; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + status = this->handle_client_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(status, CLIENT_CONNECTION_CHECK); + BOOST_CHECK_EQUAL(status, this->session_thread_data_map[boost::this_thread::get_id()]->last_status); + BOOST_CHECK_EQUAL(HTTP_HEADER, this->session_thread_data_map[boost::this_thread::get_id()]->data_state); + BOOST_CHECK_EQUAL((size_t)206, this->session_thread_data_map[boost::this_thread::get_id()]->current_message_rest_size); + this->session_thread_data_map.clear(); + } + { + cout << "[299]--------------------------------------------- " << endl; + //unit_test[299] 未送信データサイズが0, データサイズが0,切替中フラグOFF, SORRYフラグONの場合 + EVENT_TAG status; + thread_data_ptr down_thread_data(new session_thread_data_ip); + down_thread_data->current_message_rest_size = 0; + down_thread_data->data_length = 0; + down_thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + down_thread_data->switch_flag = SWITCH_FLAG_OFF; + down_thread_data->data_state = HTTP_BODY; + down_thread_data->sorry_flag = SORRY_FLAG_ON; + down_thread_data->data_offset = 0; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + status = this->handle_client_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(status, SORRYSERVER_RECV); + BOOST_CHECK_EQUAL(status, this->session_thread_data_map[boost::this_thread::get_id()]->last_status); + BOOST_CHECK_EQUAL(HTTP_START, this->session_thread_data_map[boost::this_thread::get_id()]->data_state); + BOOST_CHECK_EQUAL((size_t)0, this->session_thread_data_map[boost::this_thread::get_id()]->data_offset); + delete[] down_thread_data->data_buffer; + this->session_thread_data_map.clear(); + } + { + cout << "[300]--------------------------------------------- " << endl; + //unit_test[300] 未送信データサイズ>0, データサイズ>0, 切替中フラグON, SORRYフラグOFFの場合, status = CLIENT_CONNECTION_CHECK + EVENT_TAG status; + thread_data_ptr down_thread_data(new session_thread_data_ip); + down_thread_data->current_message_rest_size = 10; + down_thread_data->data_length = 20; + down_thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + down_thread_data->switch_flag = SWITCH_FLAG_ON; + down_thread_data->data_state = HTTP_BODY; + down_thread_data->sorry_flag = SORRY_FLAG_OFF; + down_thread_data->data_offset = 0; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + status = this->handle_client_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(status, CLIENT_CONNECTION_CHECK); + BOOST_CHECK_EQUAL(status, this->session_thread_data_map[boost::this_thread::get_id()]->last_status); + this->session_thread_data_map.clear(); + delete[] down_thread_data->data_buffer; + } + { + cout << "[301]--------------------------------------------- " << endl; + //unit_test[301] 未送信データサイズ>0, データサイズが0, 切替中フラグON, SORRYフラグOFFの場合, status = CLIENT_DISCONNECT + EVENT_TAG status; + thread_data_ptr down_thread_data(new session_thread_data_ip); + down_thread_data->current_message_rest_size = 10; + down_thread_data->data_length = 0; + down_thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + down_thread_data->switch_flag = SWITCH_FLAG_ON; + down_thread_data->data_state = HTTP_BODY; + down_thread_data->sorry_flag = SORRY_FLAG_OFF; + down_thread_data->data_offset = 0; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + status = this->handle_client_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL((size_t)0, this->session_thread_data_map[boost::this_thread::get_id()]->data_offset); + BOOST_CHECK_EQUAL(status, CLIENT_DISCONNECT); + BOOST_CHECK_EQUAL(status, this->session_thread_data_map[boost::this_thread::get_id()]->last_status); + this->session_thread_data_map.clear(); + delete[] down_thread_data->data_buffer; + } + { + cout << "[302]--------------------------------------------- " << endl; + //unit_test[302] 未送信データサイズが0, データサイズ>0, find_http_header_all(), 検索結果が該当なし, 切替中フラグON, SORRYフラグOFFの場合 + //unit_test[302] status = CLIENT_DISCONNECT + EVENT_TAG status; + thread_data_ptr down_thread_data(new session_thread_data_ip); + down_thread_data->current_message_rest_size = 0; + down_thread_data->data_length = 14; + down_thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset(down_thread_data->data_buffer, 0, MAX_BUFFER_SIZE); + strcpy(down_thread_data->data_buffer, "HTTP/1.1 200\r\n"); + down_thread_data->switch_flag = SWITCH_FLAG_ON; + down_thread_data->data_state = HTTP_BODY; + down_thread_data->sorry_flag = SORRY_FLAG_OFF; + down_thread_data->data_offset = 0; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + status = this->handle_client_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(status, CLIENT_DISCONNECT); + BOOST_CHECK_EQUAL(status, this->session_thread_data_map[boost::this_thread::get_id()]->last_status); + BOOST_CHECK_EQUAL(HTTP_START, this->session_thread_data_map[boost::this_thread::get_id()]->data_state); + this->session_thread_data_map.clear(); + } + { + cout << "[303]--------------------------------------------- " << endl; + //unit_test[303] 未送信データサイズが0, データサイズ>0, find_http_header_all(), 検索結果が該当あり + //unit_test[303] check_http_version_and_status_code, チェック結果が異常, 切替中フラグON, SORRYフラグOFFの場合, status = CLIENT_CONNECTION_CHECK + EVENT_TAG status; + thread_data_ptr down_thread_data(new session_thread_data_ip); + down_thread_data->current_message_rest_size = 0; + down_thread_data->data_length = 20; + down_thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset(down_thread_data->data_buffer, 0, MAX_BUFFER_SIZE); + strcpy(down_thread_data->data_buffer, "ABCDEFG\r\nHIJKLMN\r\n\r\n"); + down_thread_data->switch_flag = SWITCH_FLAG_ON; + down_thread_data->data_state = HTTP_BODY; + down_thread_data->sorry_flag = SORRY_FLAG_OFF; + down_thread_data->data_offset = 0; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + status = this->handle_client_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(status, CLIENT_CONNECTION_CHECK); + BOOST_CHECK_EQUAL(status, this->session_thread_data_map[boost::this_thread::get_id()]->last_status); + BOOST_CHECK_EQUAL(UNKNOWN, this->session_thread_data_map[boost::this_thread::get_id()]->data_state); + this->session_thread_data_map.clear(); + } + { + cout << "[304]--------------------------------------------- " << endl; + //unit_test[304] 未送信データサイズが0, データサイズ>0, find_http_header_all(), 検索結果が該当あり + //unit_test[304] check_http_version_and_status_code, チェック結果が正常, find_http_header_content_length + //unit_test[304] 検索結果が該当あり, 切替中フラグON, SORRYフラグOFFの場合 + EVENT_TAG status; + thread_data_ptr down_thread_data(new session_thread_data_ip); + down_thread_data->current_message_rest_size = 0; + down_thread_data->data_length = 206; + down_thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset(down_thread_data->data_buffer, 0, MAX_BUFFER_SIZE); + strcpy(down_thread_data->data_buffer, "HTTP/1.1 200 OK\r\n" + "Date: Thu, 29 Oct 2009 03:03:48 GMT\r\n" + "Accept-Ranges: bytes\r\n" + "Content-Length: 21887\r\n" + "Content-Type: text/css\r\n" + "Last-Modified: Fri, 09 Jan 2009 19:16:12 GMT\r\n" + "X-Powered-By: Servlet/2.4 JSP/2.0\r\n" + "\r\n"); + down_thread_data->switch_flag = SWITCH_FLAG_ON; + down_thread_data->data_state = HTTP_BODY; + down_thread_data->sorry_flag = SORRY_FLAG_OFF; + down_thread_data->data_offset = 0; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + status = this->handle_client_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(status, CLIENT_CONNECTION_CHECK); + BOOST_CHECK_EQUAL(status, this->session_thread_data_map[boost::this_thread::get_id()]->last_status); + BOOST_CHECK_EQUAL(HTTP_HEADER, this->session_thread_data_map[boost::this_thread::get_id()]->data_state); + BOOST_CHECK_EQUAL((size_t)(21887 + 206), this->session_thread_data_map[boost::this_thread::get_id()]->current_message_rest_size); + this->session_thread_data_map.clear(); + } + { + cout << "[305]--------------------------------------------- " << endl; + //unit_test[305] 未送信データサイズが0, データサイズ>0, find_http_header_all(), 検索結果が該当あり + //unit_test[305] check_http_version_and_status_code, チェック結果が正常, find_http_header_content_length + //unit_test[305] 検索結果が該当なしり, 切替中フラグON, SORRYフラグOFFの場合 + EVENT_TAG status; + thread_data_ptr down_thread_data(new session_thread_data_ip); + down_thread_data->current_message_rest_size = 0; + down_thread_data->data_length = 206; + down_thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset(down_thread_data->data_buffer, 0, MAX_BUFFER_SIZE); + strcpy(down_thread_data->data_buffer, "HTTP/1.1 200 OK\r\n" + "Date: Thu, 29 Oct 2009 03:03:48 GMT\r\n" + "Accept-Ranges: bytes\r\n" + "XXXXXXX-XXXXXX: 21887\r\n" + "Content-Type: text/css\r\n" + "Last-Modified: Fri, 09 Jan 2009 19:16:12 GMT\r\n" + "X-Powered-By: Servlet/2.4 JSP/2.0\r\n" + "\r\n"); + down_thread_data->switch_flag = SWITCH_FLAG_ON; + down_thread_data->data_state = HTTP_BODY; + down_thread_data->sorry_flag = SORRY_FLAG_OFF; + down_thread_data->data_offset = 0; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + status = this->handle_client_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(status, CLIENT_CONNECTION_CHECK); + BOOST_CHECK_EQUAL(status, this->session_thread_data_map[boost::this_thread::get_id()]->last_status); + BOOST_CHECK_EQUAL(HTTP_HEADER, this->session_thread_data_map[boost::this_thread::get_id()]->data_state); + BOOST_CHECK_EQUAL((size_t)206, this->session_thread_data_map[boost::this_thread::get_id()]->current_message_rest_size); + this->session_thread_data_map.clear(); + } + { + cout << "[306]--------------------------------------------- " << endl; + //unit_test[306] 未送信データサイズが0, データサイズが0,切替中フラグON, SORRYフラグOFFの場合 + EVENT_TAG status; + thread_data_ptr down_thread_data(new session_thread_data_ip); + down_thread_data->current_message_rest_size = 0; + down_thread_data->data_length = 0; + down_thread_data->data_state = HTTP_BODY; + down_thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + down_thread_data->switch_flag = SWITCH_FLAG_ON; + down_thread_data->sorry_flag = SORRY_FLAG_OFF; + down_thread_data->data_offset = 0; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + status = this->handle_client_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(status, CLIENT_DISCONNECT); + BOOST_CHECK_EQUAL(status, this->session_thread_data_map[boost::this_thread::get_id()]->last_status); + BOOST_CHECK_EQUAL(HTTP_START, this->session_thread_data_map[boost::this_thread::get_id()]->data_state); + BOOST_CHECK_EQUAL((size_t)0, this->session_thread_data_map[boost::this_thread::get_id()]->data_offset); + delete[] down_thread_data->data_buffer; + this->session_thread_data_map.clear(); + } + { + cout << "[307]--------------------------------------------- " << endl; + //unit_test[307] 未送信データサイズ>0, データサイズ>0, 切替中フラグOFF, SORRYフラグOFFの場合, status = CLIENT_CONNECTION_CHECK + EVENT_TAG status; + thread_data_ptr down_thread_data(new session_thread_data_ip); + down_thread_data->current_message_rest_size = 10; + down_thread_data->data_state = HTTP_BODY; + down_thread_data->data_length = 20; + down_thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + down_thread_data->switch_flag = SWITCH_FLAG_OFF; + down_thread_data->sorry_flag = SORRY_FLAG_OFF; + down_thread_data->data_offset = 0; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + status = this->handle_client_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(status, CLIENT_CONNECTION_CHECK); + BOOST_CHECK_EQUAL(status, this->session_thread_data_map[boost::this_thread::get_id()]->last_status); + this->session_thread_data_map.clear(); + delete[] down_thread_data->data_buffer; + } + { + cout << "[308]--------------------------------------------- " << endl; + //unit_test[308] 未送信データサイズ>0, データサイズが0, 切替中フラグOFF, SORRYフラグOFFの場合, status = REALSERVER_RECV + EVENT_TAG status; + thread_data_ptr down_thread_data(new session_thread_data_ip); + down_thread_data->current_message_rest_size = 10; + down_thread_data->data_length = 0; + down_thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + down_thread_data->data_state = HTTP_BODY; + down_thread_data->switch_flag = SWITCH_FLAG_OFF; + down_thread_data->sorry_flag = SORRY_FLAG_OFF; + down_thread_data->data_offset = 0; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + status = this->handle_client_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL((size_t)0, this->session_thread_data_map[boost::this_thread::get_id()]->data_offset); + BOOST_CHECK_EQUAL(status, REALSERVER_RECV); + BOOST_CHECK_EQUAL(status, this->session_thread_data_map[boost::this_thread::get_id()]->last_status); + this->session_thread_data_map.clear(); + delete[] down_thread_data->data_buffer; + } + { + cout << "[309]--------------------------------------------- " << endl; + //unit_test[309] 未送信データサイズが0, データサイズ>0, find_http_header_all(), 検索結果が該当なし, 切替中フラグOFF, SORRYフラグOFFの場合 + //unit_test[309] status = REALSERVER_RECV + EVENT_TAG status; + thread_data_ptr down_thread_data(new session_thread_data_ip); + down_thread_data->current_message_rest_size = 0; + down_thread_data->data_length = 14; + down_thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset(down_thread_data->data_buffer, 0, MAX_BUFFER_SIZE); + strcpy(down_thread_data->data_buffer, "HTTP/1.1 200\r\n"); + down_thread_data->data_state = HTTP_BODY; + down_thread_data->switch_flag = SWITCH_FLAG_OFF; + down_thread_data->sorry_flag = SORRY_FLAG_OFF; + down_thread_data->data_offset = 0; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + status = this->handle_client_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(status, REALSERVER_RECV); + BOOST_CHECK_EQUAL(status, this->session_thread_data_map[boost::this_thread::get_id()]->last_status); + BOOST_CHECK_EQUAL(HTTP_START, this->session_thread_data_map[boost::this_thread::get_id()]->data_state); + this->session_thread_data_map.clear(); + } + { + cout << "[310]--------------------------------------------- " << endl; + //unit_test[310] 未送信データサイズが0, データサイズ>0, find_http_header_all(), 検索結果が該当あり + //unit_test[310] check_http_version_and_status_code, チェック結果が異常, 切替中フラグOFF, SORRYフラグOFFの場合, status = CLIENT_CONNECTION_CHECK + EVENT_TAG status; + thread_data_ptr down_thread_data(new session_thread_data_ip); + down_thread_data->current_message_rest_size = 0; + down_thread_data->data_length = 20; + down_thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset(down_thread_data->data_buffer, 0, MAX_BUFFER_SIZE); + strcpy(down_thread_data->data_buffer, "ABCDEFG\r\nHIJKLMN\r\n\r\n"); + down_thread_data->switch_flag = SWITCH_FLAG_OFF; + down_thread_data->data_state = HTTP_BODY; + down_thread_data->sorry_flag = SORRY_FLAG_OFF; + down_thread_data->data_offset = 0; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + status = this->handle_client_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(status, CLIENT_CONNECTION_CHECK); + BOOST_CHECK_EQUAL(status, this->session_thread_data_map[boost::this_thread::get_id()]->last_status); + BOOST_CHECK_EQUAL((size_t)20, this->session_thread_data_map[boost::this_thread::get_id()]->current_message_rest_size); + BOOST_CHECK_EQUAL(UNKNOWN, this->session_thread_data_map[boost::this_thread::get_id()]->data_state); + this->session_thread_data_map.clear(); + } + { + cout << "[311]--------------------------------------------- " << endl; + //unit_test[311] 未送信データサイズが0, データサイズ>0, find_http_header_all(), 検索結果が該当あり + //unit_test[311] check_http_version_and_status_code, チェック結果が正常, find_http_header_content_length + //unit_test[311] 検索結果が該当あり, 切替中フラグOFF, SORRYフラグOFFの場合 + EVENT_TAG status; + thread_data_ptr down_thread_data(new session_thread_data_ip); + down_thread_data->current_message_rest_size = 0; + down_thread_data->data_length = 206; + down_thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset(down_thread_data->data_buffer, 0, MAX_BUFFER_SIZE); + strcpy(down_thread_data->data_buffer, "HTTP/1.1 200 OK\r\n" + "Date: Thu, 29 Oct 2009 03:03:48 GMT\r\n" + "Accept-Ranges: bytes\r\n" + "Content-Length: 21887\r\n" + "Content-Type: text/css\r\n" + "Last-Modified: Fri, 09 Jan 2009 19:16:12 GMT\r\n" + "X-Powered-By: Servlet/2.4 JSP/2.0\r\n" + "\r\n"); + down_thread_data->data_state = HTTP_BODY; + down_thread_data->switch_flag = SWITCH_FLAG_OFF; + down_thread_data->sorry_flag = SORRY_FLAG_OFF; + down_thread_data->data_offset = 0; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + status = this->handle_client_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(status, CLIENT_CONNECTION_CHECK); + BOOST_CHECK_EQUAL(status, this->session_thread_data_map[boost::this_thread::get_id()]->last_status); + BOOST_CHECK_EQUAL(HTTP_HEADER, this->session_thread_data_map[boost::this_thread::get_id()]->data_state); + BOOST_CHECK_EQUAL((size_t)(21887 + 206), this->session_thread_data_map[boost::this_thread::get_id()]->current_message_rest_size); + this->session_thread_data_map.clear(); + } + { + cout << "[312]--------------------------------------------- " << endl; + //unit_test[312] 未送信データサイズが0, データサイズ>0, find_http_header_all(), 検索結果が該当あり + //unit_test[312] check_http_version_and_status_code, チェック結果が正常, find_http_header_content_length + //unit_test[312] 検索結果が該当なしり, 切替中フラグOFF, SORRYフラグOFFの場合 + EVENT_TAG status; + thread_data_ptr down_thread_data(new session_thread_data_ip); + down_thread_data->current_message_rest_size = 0; + down_thread_data->data_length = 206; + down_thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset(down_thread_data->data_buffer, 0, MAX_BUFFER_SIZE); + strcpy(down_thread_data->data_buffer, "HTTP/1.1 200 OK\r\n" + "Date: Thu, 29 Oct 2009 03:03:48 GMT\r\n" + "Accept-Ranges: bytes\r\n" + "XXXXXXX-XXXXXX: 21887\r\n" + "Content-Type: text/css\r\n" + "Last-Modified: Fri, 09 Jan 2009 19:16:12 GMT\r\n" + "X-Powered-By: Servlet/2.4 JSP/2.0\r\n" + "\r\n"); + down_thread_data->data_state = HTTP_BODY; + down_thread_data->switch_flag = SWITCH_FLAG_OFF; + down_thread_data->sorry_flag = SORRY_FLAG_OFF; + down_thread_data->data_offset = 0; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + status = this->handle_client_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(status, CLIENT_CONNECTION_CHECK); + BOOST_CHECK_EQUAL(status, this->session_thread_data_map[boost::this_thread::get_id()]->last_status); + BOOST_CHECK_EQUAL(HTTP_HEADER, this->session_thread_data_map[boost::this_thread::get_id()]->data_state); + BOOST_CHECK_EQUAL((size_t)206, this->session_thread_data_map[boost::this_thread::get_id()]->current_message_rest_size); + this->session_thread_data_map.clear(); + } + { + cout << "[313]--------------------------------------------- " << endl; + //unit_test[313] 未送信データサイズが0, データサイズが0,切替中フラグOFF, SORRYフラグOFFの場合 + EVENT_TAG status; + thread_data_ptr down_thread_data(new session_thread_data_ip); + down_thread_data->current_message_rest_size = 0; + down_thread_data->data_length = 0; + down_thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + down_thread_data->data_state = HTTP_BODY; + down_thread_data->switch_flag = SWITCH_FLAG_OFF; + down_thread_data->sorry_flag = SORRY_FLAG_OFF; + down_thread_data->data_offset = 0; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + status = this->handle_client_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(status, REALSERVER_RECV); + BOOST_CHECK_EQUAL(status, this->session_thread_data_map[boost::this_thread::get_id()]->last_status); + BOOST_CHECK_EQUAL(HTTP_START, this->session_thread_data_map[boost::this_thread::get_id()]->data_state); + BOOST_CHECK_EQUAL((size_t)0, this->session_thread_data_map[boost::this_thread::get_id()]->data_offset); + delete[] down_thread_data->data_buffer; + this->session_thread_data_map.clear(); + } + + { + cout << "[314]--------------------------------------------- " << endl; + //unit_test[314] 異常の場合、status = FINALIZE + EVENT_TAG status; + this->session_thread_data_map.clear(); + status = this->handle_client_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(status, FINALIZE); + } + } + + //handle_client_send + void handle_client_send_test_thread() + { + { + cout << "[315]--------------------------------------------- " << endl; + //unit_test[315] 未送信データサイズが0, データサイズが0,切替中フラグOFF, SORRYフラグOFFの場合 + EVENT_TAG status; + thread_data_ptr down_thread_data(new session_thread_data_ip); + { + boost::mutex::scoped_lock sclock(session_thread_data_map_mutex); + down_thread_data->current_message_rest_size = 0; + down_thread_data->data_length = 0; + down_thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + down_thread_data->switch_flag = SWITCH_FLAG_OFF; + down_thread_data->data_state = HTTP_BODY; + down_thread_data->sorry_flag = SORRY_FLAG_OFF; + down_thread_data->data_offset = 0; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + } + status = this->handle_client_send(boost::this_thread::get_id()); + { + boost::mutex::scoped_lock sclock(session_thread_data_map_mutex); + BOOST_CHECK_EQUAL(status, REALSERVER_RECV); + BOOST_CHECK_EQUAL(status, this->session_thread_data_map[boost::this_thread::get_id()]->last_status); + BOOST_CHECK_EQUAL(HTTP_START, this->session_thread_data_map[boost::this_thread::get_id()]->data_state); + BOOST_CHECK_EQUAL((size_t)0, this->session_thread_data_map[boost::this_thread::get_id()]->data_offset); + delete[] down_thread_data->data_buffer; + this->session_thread_data_map.erase(boost::this_thread::get_id()); + } + } + } + + //handle_client_disconnect + void handle_client_disconnect_test() + { + cout << "[316]--------------------------------------------- " << endl; + //unit_test[316] 正常系で必ずFINALIZEを返す + EVENT_TAG status; + thread_data_ptr down_thread_data(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + status = this->handle_client_disconnect(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(status, FINALIZE); + this->session_thread_data_map.clear(); + } + + void handle_client_disconnect_test_thread() + { + cout << "[317]--------------------------------------------- " << endl; + //unit_test[317] 正常系で必ずFINALIZEを返す + EVENT_TAG status; + thread_data_ptr down_thread_data(new session_thread_data_ip); + { + boost::mutex::scoped_lock sclock(session_thread_data_map_mutex); + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + } + status = this->handle_client_disconnect(boost::this_thread::get_id()); + { + boost::mutex::scoped_lock sclock(session_thread_data_map_mutex); + BOOST_CHECK_EQUAL(status, FINALIZE); + BOOST_CHECK_EQUAL(status, this->session_thread_data_map[boost::this_thread::get_id()]->last_status); + this->session_thread_data_map.erase(boost::this_thread::get_id()); + } + } + + //handle_sorry_enable + void handle_sorry_enable_test() + { + EVENT_TAG status; + thread_data_ptr thread_data(new session_thread_data_ip); + boost::thread thread_up(&up_thread_func); + boost::thread thread_down(&down_thread_func); + + // 上りスレッドの場合 + thread_data->thread_division = THREAD_DIVISION_UP_STREAM; + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data; + + cout << "[318]--------------------------------------------- " << endl; + //unit_test[318] accept完了フラグOFFの場合,sorry状態をON,status = ACCEPT + { + thread_data->accept_end_flag = ACCEPT_END_FLAG_OFF; + status = this->handle_sorry_enable(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(thread_data->sorry_flag, SORRY_FLAG_ON); + BOOST_CHECK_EQUAL(status, ACCEPT); + BOOST_CHECK_EQUAL(thread_data->last_status, ACCEPT); + } + + cout << "[319]--------------------------------------------- " << endl; + //unit_test[319] accept完了フラグON,sorry状態,テータ状態がHTTP_STARTの場合,切替中フラグON status = SORRYSERVER_DISCONNECT + { + thread_data->accept_end_flag = ACCEPT_END_FLAG_ON; + thread_data->sorry_flag= SORRY_FLAG_ON; + thread_data->data_state = HTTP_START; + status = this->handle_sorry_enable(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(thread_data->sorry_flag, SORRY_FLAG_ON); + BOOST_CHECK_EQUAL(status, SORRYSERVER_DISCONNECT); + BOOST_CHECK_EQUAL(thread_data->switch_flag,SWITCH_FLAG_ON); + BOOST_CHECK_EQUAL(thread_data->last_status, SORRYSERVER_DISCONNECT); + } + + cout << "[320]--------------------------------------------- " << endl; + //unit_test[320] accept完了フラグON,sorry状態,テータ状態がHTTP_HEADERの場合,切替中フラグON status = SORRYSERVER_DISCONNECT + { + thread_data->accept_end_flag = ACCEPT_END_FLAG_ON; + thread_data->sorry_flag= SORRY_FLAG_ON; + thread_data->data_state = HTTP_HEADER; + status = this->handle_sorry_enable(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(thread_data->sorry_flag, SORRY_FLAG_ON); + BOOST_CHECK_EQUAL(status, SORRYSERVER_DISCONNECT); + BOOST_CHECK_EQUAL(thread_data->switch_flag,SWITCH_FLAG_ON); + BOOST_CHECK_EQUAL(thread_data->last_status, SORRYSERVER_DISCONNECT); + } + + cout << "[321]--------------------------------------------- " << endl; + //unit_test[321] accept完了フラグON,sorry状態,テータ状態がHTTP_BODYの場合, status = last_status + { + thread_data->accept_end_flag = ACCEPT_END_FLAG_ON; + thread_data->sorry_flag= SORRY_FLAG_ON; + thread_data->data_state = HTTP_BODY; + thread_data->last_status = CLIENT_RECV; + status = this->handle_sorry_enable(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(thread_data->sorry_flag, SORRY_FLAG_ON); + BOOST_CHECK_EQUAL(status, CLIENT_RECV); + BOOST_CHECK_EQUAL(thread_data->last_status, CLIENT_RECV); + } + + cout << "[322]--------------------------------------------- " << endl; + //unit_test[322] 上りスレッドの場合,accept完了フラグON,sorry状態,テータ状態がUNKNOWNの場合 + { + thread_data->accept_end_flag = ACCEPT_END_FLAG_ON; + thread_data->sorry_flag= SORRY_FLAG_ON; + thread_data->data_state = UNKNOWN; + thread_data->last_status = CLIENT_RECV; + status = this->handle_sorry_enable(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(thread_data->sorry_flag, SORRY_FLAG_ON); + BOOST_CHECK_EQUAL(status, CLIENT_RECV); + BOOST_CHECK_EQUAL(thread_data->last_status, CLIENT_RECV); + } + + cout << "[323]--------------------------------------------- " << endl; + //unit_test[323] accept完了フラグON sorry状態以外,テータ状態がHTTP_STARTの場合,切替中フラグON,status = REALSERVER_DISCONNECT + { + thread_data->accept_end_flag = ACCEPT_END_FLAG_ON; + thread_data->sorry_flag = SORRY_FLAG_OFF; + thread_data->data_state = HTTP_START; + status = this->handle_sorry_enable(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(thread_data->sorry_flag, SORRY_FLAG_ON); + BOOST_CHECK_EQUAL(thread_data->switch_flag,SWITCH_FLAG_ON); + BOOST_CHECK_EQUAL(status, REALSERVER_DISCONNECT); + BOOST_CHECK_EQUAL(thread_data->last_status, REALSERVER_DISCONNECT); + } + + cout << "[324]--------------------------------------------- " << endl; + //unit_test[324] accept完了フラグON sorry状態以外,テータ状態がHTTP_HEADERの場合,切替中フラグON,status = REALSERVER_DISCONNECT + { + thread_data->accept_end_flag = ACCEPT_END_FLAG_ON; + thread_data->sorry_flag= SORRY_FLAG_OFF; + thread_data->data_state = HTTP_HEADER; + status = this->handle_sorry_enable(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(thread_data->sorry_flag, SORRY_FLAG_ON); + BOOST_CHECK_EQUAL(thread_data->switch_flag,SWITCH_FLAG_ON); + BOOST_CHECK_EQUAL(status, REALSERVER_DISCONNECT); + BOOST_CHECK_EQUAL(thread_data->last_status, REALSERVER_DISCONNECT); + } + + cout << "[325]--------------------------------------------- " << endl; + //unit_test[325] accept完了フラグON sorry状態以外,テータ状態がHTTP_BODYの場合,終了フラグをON,status = REALSERVER_DISCONNECT + { + thread_data->accept_end_flag = ACCEPT_END_FLAG_ON; + thread_data->sorry_flag= SORRY_FLAG_OFF; + thread_data->data_state = HTTP_BODY; + status = this->handle_sorry_enable(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(thread_data->sorry_flag, SORRY_FLAG_ON); + BOOST_CHECK_EQUAL(thread_data->end_flag,END_FLAG_ON); + BOOST_CHECK_EQUAL(status, REALSERVER_DISCONNECT); + BOOST_CHECK_EQUAL(thread_data->last_status, REALSERVER_DISCONNECT); + } + + cout << "[326]--------------------------------------------- " << endl; + //unit_test[326] accept完了フラグON sorry状態以外,テータ状態がUNKNOWNの場合,終了フラグをON,status = REALSERVER_DISCONNECT + { + thread_data->accept_end_flag = ACCEPT_END_FLAG_ON; + thread_data->sorry_flag= SORRY_FLAG_OFF; + thread_data->data_state = UNKNOWN; + status = this->handle_sorry_enable(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(thread_data->sorry_flag, SORRY_FLAG_ON); + BOOST_CHECK_EQUAL(thread_data->end_flag,END_FLAG_ON); + BOOST_CHECK_EQUAL(status, REALSERVER_DISCONNECT); + BOOST_CHECK_EQUAL(thread_data->last_status, REALSERVER_DISCONNECT); + } + + // 下りスレッドの場合 + thread_data->thread_division = THREAD_DIVISION_DOWN_STREAM; + { + cout << "[327]--------------------------------------------- " << endl; + //unit_test[327] sorry状態の場合 status = last_status + thread_data->sorry_flag= SORRY_FLAG_ON; + thread_data->last_status = SORRYSERVER_RECV; + status = this->handle_sorry_enable(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(thread_data->sorry_flag, SORRY_FLAG_ON); + BOOST_CHECK_EQUAL(status, SORRYSERVER_RECV); + BOOST_CHECK_EQUAL(thread_data->last_status, SORRYSERVER_RECV); + } + + cout << "[328]--------------------------------------------- " << endl; + //unit_test[328] sorry状態以外の場合 テータ状態がHTTP_START かつ データサイズが0の場合,status = SORRYSERVER_RECV + { + thread_data->sorry_flag= SORRY_FLAG_OFF; + thread_data->data_state = HTTP_START; + thread_data->data_length = 0; + status = this->handle_sorry_enable(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(thread_data->sorry_flag, SORRY_FLAG_ON); + BOOST_CHECK_EQUAL(status, SORRYSERVER_RECV); + BOOST_CHECK_EQUAL(thread_data->last_status, SORRYSERVER_RECV); + } + + cout << "[329]--------------------------------------------- " << endl; + //unit_test[329] sorry状態以外の場合 テータ状態がHTTP_START かつ データサイズ >0 の場合,status = REALSERVER_DISCONNECT + { + thread_data->sorry_flag = SORRY_FLAG_OFF; + thread_data->data_state = HTTP_START; + thread_data->data_length = 5; + status = this->handle_sorry_enable(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(thread_data->sorry_flag, SORRY_FLAG_ON); + BOOST_CHECK_EQUAL(status, REALSERVER_DISCONNECT); + BOOST_CHECK_EQUAL(thread_data->last_status, REALSERVER_DISCONNECT); + } + + cout << "[330]--------------------------------------------- " << endl; + //unit_test[330] sorry状態以外の場合 テータ状態がHTTP_HEADER の場合,切替中フラグON status = last_status + { + thread_data->sorry_flag= SORRY_FLAG_OFF; + thread_data->data_state = HTTP_HEADER; + thread_data->switch_flag = SWITCH_FLAG_OFF; + thread_data->last_status = REALSERVER_SEND; + status = this->handle_sorry_enable(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(thread_data->sorry_flag, SORRY_FLAG_ON); + BOOST_CHECK_EQUAL(thread_data->switch_flag,SWITCH_FLAG_ON); + BOOST_CHECK_EQUAL(status, REALSERVER_SEND); + BOOST_CHECK_EQUAL(thread_data->last_status, REALSERVER_SEND); + } + + cout << "[331]--------------------------------------------- " << endl; + //unit_test[331] sorry状態以外の場合 テータ状態がHTTP_BODY の場合,切替中フラグON status = last_status + { + thread_data->sorry_flag= SORRY_FLAG_OFF; + thread_data->data_state = HTTP_BODY; + thread_data->switch_flag = SWITCH_FLAG_OFF; + thread_data->last_status = REALSERVER_SEND; + status = this->handle_sorry_enable(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(thread_data->sorry_flag, SORRY_FLAG_ON); + BOOST_CHECK_EQUAL(thread_data->switch_flag,SWITCH_FLAG_ON); + BOOST_CHECK_EQUAL(status, REALSERVER_SEND); + BOOST_CHECK_EQUAL(thread_data->last_status, REALSERVER_SEND); + } + + cout << "[332]--------------------------------------------- " << endl; + //unit_test[332] sorry状態以外の場合 テータ状態がUNKNOWN の場合,status = REALSERVER_DISCONNECT + { + thread_data->sorry_flag= SORRY_FLAG_OFF; + thread_data->data_state = UNKNOWN; + status = this->handle_sorry_enable(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(thread_data->switch_flag, SWITCH_FLAG_ON); + BOOST_CHECK_EQUAL(status, REALSERVER_DISCONNECT); + BOOST_CHECK_EQUAL(thread_data->last_status, REALSERVER_DISCONNECT); + } + + cout << "[333]--------------------------------------------- " << endl; + //unit_test[333] session_thread_data NULLの場合,status = FINALIZE + { + thread_data_ptr thread_data_null; + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data_null; + status = this->handle_sorry_enable(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(status, FINALIZE); + } + + cout << "[334]--------------------------------------------- " << endl; + //unit_test[334] thread_id対応のsession_thread_dataなし場合,status = FINALIZE + { + this->session_thread_data_map.clear(); + status = this->handle_sorry_enable(thread_up.get_id()); + BOOST_CHECK_EQUAL(status, FINALIZE); + } + + cout << "[335]--------------------------------------------- " << endl; + //unit_test[335] session_thread_dataにthread_idなし場合,status = FINALIZE + { + thread_data_ptr thread_data_threadid_err(new session_thread_data_ip); + + this->session_thread_data_map.clear(); + this->session_thread_data_map[thread_down.get_id()] = thread_data_threadid_err; + status = this->handle_sorry_enable(thread_up.get_id()); + BOOST_CHECK_EQUAL(status, FINALIZE); + } + + cout << "[336]--------------------------------------------- " << endl; + //unit_test[336] 上りスレッドの戻り値が「ACCEPT」を設定する、下りスレッドの戻り値が「SORRYSERVER_RECV」を設定する + //unit_test[336] test data:上りスレッドと下りスレッドの場合 + { + thread_data_ptr thread_data_up(new session_thread_data_ip); + // 上りスレッド,accept完了フラグOFFの場合 + thread_data_up->thread_division = THREAD_DIVISION_UP_STREAM; + thread_data_up->thread_id = thread_up.get_id(); + thread_data_up->accept_end_flag = ACCEPT_END_FLAG_OFF; + + // 下りスレッド,sorry状態以外の場合 テータ状態がHTTP_START かつ データサイズが0の場合,status = SORRYSERVER_RECV + thread_data_ptr thread_data_down(new session_thread_data_ip); + thread_data_down->thread_division = THREAD_DIVISION_DOWN_STREAM; + thread_data_down->thread_id = thread_down.get_id(); + thread_data_down->sorry_flag= SORRY_FLAG_OFF; + thread_data_down->data_state = HTTP_START; + thread_data_down->data_length = 0; + this->session_thread_data_map[thread_up.get_id()] = thread_data_up; + this->session_thread_data_map[thread_down.get_id()] = thread_data_down; + boost::thread_group threads; + threads.create_thread(bind(&protocol_module_ip_test_class::handle_sorry_enable_test_thread_func, + this, + thread_up.get_id(), + ACCEPT)); + threads.create_thread(bind(&protocol_module_ip_test_class::handle_sorry_enable_test_thread_func, + this, + thread_down.get_id(), + SORRYSERVER_RECV)); + threads.join_all(); + // sorry状態をON + BOOST_CHECK_EQUAL(thread_data_up->sorry_flag, SORRY_FLAG_ON); + BOOST_CHECK_EQUAL(thread_data_down->sorry_flag, SORRY_FLAG_ON); + } + } + + void handle_sorry_enable_test_thread_func(const boost::thread::id thread_id, + EVENT_TAG check_value) + { + EVENT_TAG ret = this->handle_sorry_enable(thread_id); + { + boost::mutex::scoped_lock sclock(session_thread_data_map_mutex); + BOOST_CHECK_EQUAL(ret, check_value); + } + } + void handle_sorry_enable_test_thread() + { + EVENT_TAG status; + thread_data_ptr thread_data(new session_thread_data_ip); + boost::thread thread_up(&up_thread_func); + boost::thread thread_down(&down_thread_func); + + // 上りスレッドの場合 + { + boost::mutex::scoped_lock sclock(session_thread_data_map_mutex); + thread_data->thread_division = THREAD_DIVISION_UP_STREAM; + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data; + } + cout << "[337]--------------------------------------------- " << endl; + //unit_test[337] accept完了フラグOFFの場合,sorry状態をON,status = ACCEPT + { + thread_data->accept_end_flag = ACCEPT_END_FLAG_OFF; + status = this->handle_sorry_enable(boost::this_thread::get_id()); + { + boost::mutex::scoped_lock sclock(session_thread_data_map_mutex); + BOOST_CHECK_EQUAL(thread_data->sorry_flag, SORRY_FLAG_OFF); + BOOST_CHECK_EQUAL(status, ACCEPT); + BOOST_CHECK_EQUAL(thread_data->last_status, ACCEPT); + } + } + } + + //handle_sorry_disable + void handle_sorry_disable_test() + { + + EVENT_TAG ret; + + cout << "[338]--------------------------------------------- " << endl; + //unit_test[338] 異常系 session_thread_data_map中にThreadID対応のデータがない + { + //assign the map a value before reset + this->session_thread_data_map[boost::this_thread::get_id()].reset(); + ret = this->handle_sorry_disable(boost::this_thread::get_id()); + + //遷移先ステータスを設定する status = FINALIZE + BOOST_CHECK_EQUAL(ret, FINALIZE); + } + + cout << "[339]--------------------------------------------- " << endl; + //unit_test[339] 異常系 session_thread_data_map中にThreadIDなし場合のテスト + { + this->session_thread_data_map.clear(); + ret = this->handle_sorry_disable(boost::this_thread::get_id()); + + //遷移先ステータスを設定する status = FINALIZE + BOOST_CHECK_EQUAL(ret, FINALIZE); + } + + cout << "[340]--------------------------------------------- " << endl; + //unit_test[340] 上りスレッド accept完了フラグOFFの場合 + { + thread_data_ptr data_ptr(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data_ptr; + data_ptr->thread_division = THREAD_DIVISION_UP_STREAM; + data_ptr->accept_end_flag = ACCEPT_END_FLAG_OFF; + data_ptr->sorry_flag = SORRY_FLAG_ON; + data_ptr->last_status = INITIALIZE; + + ret = this->handle_sorry_disable(boost::this_thread::get_id()); + + BOOST_CHECK_EQUAL(ret, ACCEPT); + BOOST_CHECK_EQUAL(data_ptr->sorry_flag, SORRY_FLAG_OFF); + BOOST_CHECK_EQUAL(data_ptr->last_status, ACCEPT); + } + cout << "[341]--------------------------------------------- " << endl; + //unit_test[341] 上りスレッド accept完了フラグONの場合 sorry状態の場合 テータ状態がHTTP_STARTの場合 + { + thread_data_ptr data_ptr(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data_ptr; + data_ptr->thread_division = THREAD_DIVISION_UP_STREAM; + data_ptr->accept_end_flag = ACCEPT_END_FLAG_ON; + data_ptr->sorry_flag = SORRY_FLAG_ON; + data_ptr->data_state = HTTP_START; + data_ptr->switch_flag = SWITCH_FLAG_OFF; + data_ptr->last_status = INITIALIZE; + + ret = this->handle_sorry_disable(boost::this_thread::get_id()); + + BOOST_CHECK_EQUAL(ret, SORRYSERVER_DISCONNECT); + BOOST_CHECK_EQUAL(data_ptr->sorry_flag, SORRY_FLAG_OFF); + BOOST_CHECK_EQUAL(data_ptr->switch_flag,SWITCH_FLAG_ON); + BOOST_CHECK_EQUAL(data_ptr->last_status, SORRYSERVER_DISCONNECT); + + } + + + cout << "[342]--------------------------------------------- " << endl; + //unit_test[342] 上りスレッド accept完了フラグONの場合 sorry状態の場合 テータ状態がHTTP_HEADERの場合 + { + thread_data_ptr data_ptr(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data_ptr; + data_ptr->thread_division = THREAD_DIVISION_UP_STREAM; + data_ptr->accept_end_flag = ACCEPT_END_FLAG_ON; + data_ptr->sorry_flag = SORRY_FLAG_ON; + data_ptr->data_state = HTTP_HEADER; + data_ptr->switch_flag = SWITCH_FLAG_OFF; + data_ptr->last_status = INITIALIZE; + + ret = this->handle_sorry_disable(boost::this_thread::get_id()); + + BOOST_CHECK_EQUAL(ret, SORRYSERVER_DISCONNECT); + BOOST_CHECK_EQUAL(data_ptr->sorry_flag, SORRY_FLAG_OFF); + BOOST_CHECK_EQUAL(data_ptr->switch_flag, SWITCH_FLAG_ON); + BOOST_CHECK_EQUAL(data_ptr->last_status, SORRYSERVER_DISCONNECT); + + } + + + cout << "[343]--------------------------------------------- " << endl; + //unit_test[343] 上りスレッド accept完了フラグONの場合 sorry状態の場合 テータ状態がHTTP_BODYの場合 + { + thread_data_ptr data_ptr(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data_ptr; + data_ptr->thread_division = THREAD_DIVISION_UP_STREAM; + data_ptr->accept_end_flag = ACCEPT_END_FLAG_ON; + data_ptr->sorry_flag = SORRY_FLAG_ON; + data_ptr->end_flag = END_FLAG_OFF; + data_ptr->data_state = HTTP_BODY; + data_ptr->switch_flag = SWITCH_FLAG_OFF; + data_ptr->last_status = INITIALIZE; + + ret = this->handle_sorry_disable(boost::this_thread::get_id()); + + BOOST_CHECK_EQUAL(ret, SORRYSERVER_DISCONNECT); + BOOST_CHECK_EQUAL(data_ptr->sorry_flag, SORRY_FLAG_OFF); + BOOST_CHECK_EQUAL(data_ptr->end_flag, END_FLAG_ON); + BOOST_CHECK_EQUAL(data_ptr->last_status, SORRYSERVER_DISCONNECT); + } + + + cout << "[344]--------------------------------------------- " << endl; + //unit_test[344] 上りスレッド accept完了フラグONの場合 sorry状態の場合 テータ状態がUNKNOWNの場合 + { + thread_data_ptr data_ptr(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data_ptr; + data_ptr->thread_division = THREAD_DIVISION_UP_STREAM; + data_ptr->accept_end_flag = ACCEPT_END_FLAG_ON; + data_ptr->sorry_flag = SORRY_FLAG_ON; + data_ptr->end_flag = END_FLAG_OFF; + data_ptr->data_state = UNKNOWN; + data_ptr->switch_flag = SWITCH_FLAG_OFF; + data_ptr->last_status = INITIALIZE; + + ret = this->handle_sorry_disable(boost::this_thread::get_id()); + + BOOST_CHECK_EQUAL(ret, SORRYSERVER_DISCONNECT); + BOOST_CHECK_EQUAL(data_ptr->sorry_flag, SORRY_FLAG_OFF); + BOOST_CHECK_EQUAL(data_ptr->end_flag, END_FLAG_ON); + BOOST_CHECK_EQUAL(data_ptr->last_status, SORRYSERVER_DISCONNECT); + } + + cout << "[345]--------------------------------------------- " << endl; + //unit_test[345] 上りスレッド accept完了フラグONの場合 sorry状態以外の場合 テータ状態がHTTP_STARTの場合 + { + thread_data_ptr data_ptr(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data_ptr; + data_ptr->thread_division = THREAD_DIVISION_UP_STREAM; + data_ptr->accept_end_flag = ACCEPT_END_FLAG_ON; + data_ptr->sorry_flag = SORRY_FLAG_OFF; + data_ptr->data_state = HTTP_START; + data_ptr->switch_flag = SWITCH_FLAG_OFF; + data_ptr->last_status = INITIALIZE; + + ret = this->handle_sorry_disable(boost::this_thread::get_id()); + + BOOST_CHECK_EQUAL(ret, REALSERVER_DISCONNECT); + BOOST_CHECK_EQUAL(data_ptr->sorry_flag, SORRY_FLAG_OFF); + BOOST_CHECK_EQUAL(data_ptr->switch_flag, SWITCH_FLAG_ON); + BOOST_CHECK_EQUAL(data_ptr->last_status, REALSERVER_DISCONNECT); + } + + cout << "[346]--------------------------------------------- " << endl; + //unit_test[346] 上りスレッド accept完了フラグONの場合 sorry状態以外の場合 テータ状態がHTTP_HEADERの場合 + { + thread_data_ptr data_ptr(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data_ptr; + data_ptr->thread_division = THREAD_DIVISION_UP_STREAM; + data_ptr->accept_end_flag = ACCEPT_END_FLAG_ON; + data_ptr->sorry_flag = SORRY_FLAG_OFF; + data_ptr->data_state = HTTP_HEADER; + data_ptr->switch_flag = SWITCH_FLAG_OFF; + data_ptr->last_status = INITIALIZE; + + ret = this->handle_sorry_disable(boost::this_thread::get_id()); + + BOOST_CHECK_EQUAL(ret, REALSERVER_DISCONNECT); + BOOST_CHECK_EQUAL(data_ptr->sorry_flag, SORRY_FLAG_OFF); + BOOST_CHECK_EQUAL(data_ptr->switch_flag, SWITCH_FLAG_ON); + BOOST_CHECK_EQUAL(data_ptr->last_status, REALSERVER_DISCONNECT); + } + + + cout << "[347]--------------------------------------------- " << endl; + //unit_test[347] 上りスレッド accept完了フラグONの場合 sorry状態以外の場合 テータ状態がHTTP_BODYの場合 + { + thread_data_ptr data_ptr(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data_ptr; + data_ptr->thread_division = THREAD_DIVISION_UP_STREAM; + data_ptr->accept_end_flag = ACCEPT_END_FLAG_ON; + data_ptr->sorry_flag = SORRY_FLAG_OFF; + data_ptr->data_state = HTTP_BODY; + data_ptr->last_status = CLIENT_RECV; + + ret = this->handle_sorry_disable(boost::this_thread::get_id()); + + BOOST_CHECK_EQUAL(ret, CLIENT_RECV); + BOOST_CHECK_EQUAL(data_ptr->sorry_flag, SORRY_FLAG_OFF); + BOOST_CHECK_EQUAL(data_ptr->last_status, CLIENT_RECV); + } + + + + cout << "[348]--------------------------------------------- " << endl; + //unit_test[348] 上りスレッド accept完了フラグONの場合 sorry状態以外の場合 テータ状態がUNKNOWNの場合 + { + thread_data_ptr data_ptr(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data_ptr; + data_ptr->thread_division = THREAD_DIVISION_UP_STREAM; + data_ptr->accept_end_flag = ACCEPT_END_FLAG_ON; + data_ptr->sorry_flag = SORRY_FLAG_OFF; + data_ptr->data_state = UNKNOWN; + data_ptr->last_status = CLIENT_RECV; + + ret = this->handle_sorry_disable(boost::this_thread::get_id()); + + BOOST_CHECK_EQUAL(ret, CLIENT_RECV); + BOOST_CHECK_EQUAL(data_ptr->sorry_flag, SORRY_FLAG_OFF); + BOOST_CHECK_EQUAL(data_ptr->last_status, CLIENT_RECV); + } + + + cout << "[349]--------------------------------------------- " << endl; + //unit_test[349] 下りスレッド sorry状態以外の場合 + //unit_test[349] 遷移先ステータスを設定するstatus = last_status + { + thread_data_ptr data_ptr(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data_ptr; + data_ptr->thread_division = THREAD_DIVISION_DOWN_STREAM; + data_ptr->sorry_flag = SORRY_FLAG_OFF; + data_ptr->last_status = REALSERVER_RECV; + + ret = this->handle_sorry_disable(boost::this_thread::get_id()); + + BOOST_CHECK_EQUAL(ret, REALSERVER_RECV); + BOOST_CHECK_EQUAL(data_ptr->sorry_flag, SORRY_FLAG_OFF); + BOOST_CHECK_EQUAL(data_ptr->last_status, REALSERVER_RECV); + } + + + cout << "[350]--------------------------------------------- " << endl; + //unit_test[350] 下りスレッド sorry状態の場合 テータ状態がHTTP_START かつ データサイズが0の場合 + //unit_test[350] 遷移先ステータスを設定する status = REALSERVER_RECV + { + thread_data_ptr data_ptr(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data_ptr; + data_ptr->thread_division = THREAD_DIVISION_DOWN_STREAM; + data_ptr->data_state = HTTP_START; + data_ptr->data_length = 0; + data_ptr->sorry_flag = SORRY_FLAG_ON; + data_ptr->last_status = SORRYSERVER_RECV; + + ret = this->handle_sorry_disable(boost::this_thread::get_id()); + + BOOST_CHECK_EQUAL(ret, REALSERVER_RECV); + BOOST_CHECK_EQUAL(data_ptr->sorry_flag, SORRY_FLAG_OFF); + BOOST_CHECK_EQUAL(data_ptr->last_status, REALSERVER_RECV); + } + + cout << "[351]--------------------------------------------- " << endl; + //unit_test[351] 下りスレッド sorry状態の場合 テータ状態がHTTP_START かつ データサイズ>0の場合 + //unit_test[351] 遷移先ステータスを設定する status = SORRYSERVER_DISCONNECT + { + thread_data_ptr data_ptr(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data_ptr; + data_ptr->thread_division = THREAD_DIVISION_DOWN_STREAM; + data_ptr->data_state = HTTP_START; + data_ptr->data_length = 100; + data_ptr->sorry_flag = SORRY_FLAG_ON; + data_ptr->last_status = SORRYSERVER_RECV; + + ret = this->handle_sorry_disable(boost::this_thread::get_id()); + + BOOST_CHECK_EQUAL(ret, SORRYSERVER_DISCONNECT); + BOOST_CHECK_EQUAL(data_ptr->sorry_flag, SORRY_FLAG_OFF); + BOOST_CHECK_EQUAL(data_ptr->last_status, SORRYSERVER_DISCONNECT); + } + + cout << "[352]--------------------------------------------- " << endl; + //unit_test[352] 下りスレッド sorry状態の場合 テータ状態がHTTP_HEADER の場合 + //unit_test[352] 切替中フラグON 遷移先ステータスを設定する`status = last_status + { + thread_data_ptr data_ptr(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data_ptr; + data_ptr->thread_division = THREAD_DIVISION_DOWN_STREAM; + data_ptr->data_state = HTTP_HEADER; + data_ptr->sorry_flag = SORRY_FLAG_ON; + data_ptr->switch_flag = SWITCH_FLAG_OFF; + data_ptr->last_status = SORRYSERVER_RECV; + + ret = this->handle_sorry_disable(boost::this_thread::get_id()); + + BOOST_CHECK_EQUAL(ret, SORRYSERVER_RECV); + BOOST_CHECK_EQUAL(data_ptr->sorry_flag, SORRY_FLAG_OFF); + //BOOST_CHECK_EQUAL(data_ptr->swith_flag, SWITCH_FLAG_ON); + BOOST_CHECK_EQUAL(data_ptr->last_status, SORRYSERVER_RECV); + } + + cout << "[353]--------------------------------------------- " << endl; + //unit_test[353] 下りスレッド sorry状態の場合 テータ状態がHTTP_BODY の場合 + //unit_test[353] 切替中フラグON 遷移先ステータスを設定する`status = last_status + { + thread_data_ptr data_ptr(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data_ptr; + data_ptr->thread_division = THREAD_DIVISION_DOWN_STREAM; + data_ptr->data_state = HTTP_BODY; + data_ptr->sorry_flag = SORRY_FLAG_ON; + data_ptr->switch_flag = SWITCH_FLAG_OFF; + data_ptr->last_status = SORRYSERVER_RECV; + + ret = this->handle_sorry_disable(boost::this_thread::get_id()); + + BOOST_CHECK_EQUAL(ret, SORRYSERVER_RECV); + BOOST_CHECK_EQUAL(data_ptr->sorry_flag, SORRY_FLAG_OFF); + //BOOST_CHECK_EQUAL(data_ptr->swith_flag, SWITCH_FLAG_ON); + BOOST_CHECK_EQUAL(data_ptr->last_status, SORRYSERVER_RECV); + } + + cout << "[354]--------------------------------------------- " << endl; + //unit_test[354] 下りスレッド sorry状態の場合 テータ状態がUNKNOWN の場合 + //遷移先ステータスを設定する status = SORRYSERVER_DISCONNECT + { + thread_data_ptr data_ptr(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data_ptr; + data_ptr->thread_division = THREAD_DIVISION_DOWN_STREAM; + data_ptr->data_state = UNKNOWN; + data_ptr->sorry_flag = SORRY_FLAG_ON; + data_ptr->last_status = SORRYSERVER_RECV; + + ret = this->handle_sorry_disable(boost::this_thread::get_id()); + + BOOST_CHECK_EQUAL(ret, SORRYSERVER_DISCONNECT); + BOOST_CHECK_EQUAL(data_ptr->sorry_flag, SORRY_FLAG_OFF); + BOOST_CHECK_EQUAL(data_ptr->last_status, SORRYSERVER_DISCONNECT); + } + + { + cout << "[355]--------------------------------------------- " << endl; + //unit_test[355]上りスレッドと下りスレッドの場合 + boost::thread tdown_for_get_id(down_thread_func); + thread_data_ptr data_ptr_up(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data_ptr_up; + data_ptr_up->thread_division = THREAD_DIVISION_UP_STREAM; + data_ptr_up->accept_end_flag = ACCEPT_END_FLAG_OFF; + + + thread_data_ptr data_ptr_down(new session_thread_data_ip); + this->session_thread_data_map[tdown_for_get_id.get_id()] = data_ptr_down; + data_ptr_down->thread_division = THREAD_DIVISION_DOWN_STREAM; + data_ptr_down->sorry_flag = SORRY_FLAG_OFF; + data_ptr_down->last_status = REALSERVER_RECV; + + boost::thread_group threads; + threads.create_thread(bind(&protocol_module_ip_test_class::handle_sorry_disable_test_thread_func, + this, + boost::this_thread::get_id(), + ACCEPT)); + threads.create_thread(bind(&protocol_module_ip_test_class::handle_sorry_disable_test_thread_func, + this, + tdown_for_get_id.get_id(), + REALSERVER_RECV)); + threads.join_all(); + //sorryフラグをOFF + BOOST_CHECK_EQUAL(data_ptr_up->sorry_flag, SORRY_FLAG_OFF); + BOOST_CHECK_EQUAL(data_ptr_down->sorry_flag, SORRY_FLAG_OFF); + } + } + + void handle_sorry_disable_test_thread_func(const boost::thread::id thread_id, + EVENT_TAG check_value) + { + EVENT_TAG ret = this->handle_sorry_disable(thread_id); + { + boost::mutex::scoped_lock sclock(session_thread_data_map_mutex); + BOOST_CHECK_EQUAL(ret, check_value); + } + } + + void handle_sorry_disable_test_thread() + { + EVENT_TAG ret; + cout << "[356]--------------------------------------------- " << endl; + //unit_test[356] 下りスレッド sorry状態の場合 テータ状態がUNKNOWN の場合 + { + thread_data_ptr data_ptr(new session_thread_data_ip); + { + boost::mutex::scoped_lock sclock(session_thread_data_map_mutex); + this->session_thread_data_map[boost::this_thread::get_id()] = data_ptr; + data_ptr->thread_division = THREAD_DIVISION_DOWN_STREAM; + data_ptr->data_state = UNKNOWN; + data_ptr->sorry_flag = SORRY_FLAG_ON; + data_ptr->last_status = SORRYSERVER_RECV; + } + ret = this->handle_sorry_disable(boost::this_thread::get_id()); + { + boost::mutex::scoped_lock sclock(session_thread_data_map_mutex); + BOOST_CHECK_EQUAL(ret, SORRYSERVER_DISCONNECT); + BOOST_CHECK_EQUAL(data_ptr->sorry_flag, SORRY_FLAG_OFF); + BOOST_CHECK_EQUAL(data_ptr->last_status, SORRYSERVER_DISCONNECT); + this->session_thread_data_map.erase(boost::this_thread::get_id()); + } + } + } + + //handle_realserver_disconnect(tcp) + void handle_realserver_disconnect_tcp_test() + { + + { + cout << "[357]--------------------------------------------- " << endl; + //unit_test[357] 異常系 session_thread_data_map中にThreadIDなし場合のテスト + EVENT_TAG status; + boost::asio::ip::tcp::endpoint rs_endpoint; + status = this->handle_realserver_disconnect(boost::this_thread::get_id(), rs_endpoint); + //遷移先ステータスを設定する status = FINALIZE + BOOST_CHECK_EQUAL(status, FINALIZE); + } + { + cout << "[358]--------------------------------------------- " << endl; + //unit_test[358] 異常系 session_thread_data_map中にThreadID対応のデータがない + //unit_test[358]assign the map a value before reset + this->session_thread_data_map[boost::this_thread::get_id()].reset(); + EVENT_TAG status; + boost::asio::ip::tcp::endpoint rs_endpoint; + status = this->handle_realserver_disconnect(boost::this_thread::get_id(), rs_endpoint); + + //遷移先ステータスを設定する status = FINALIZE + BOOST_CHECK_EQUAL(status, FINALIZE); + } + { + cout << "[359]--------------------------------------------- " << endl; + //unit_test[359]上りスレッド, 終了フラグがONの場合, status = CLIENT_RECV + EVENT_TAG status; + thread_data_ptr up_thread_data(new session_thread_data_ip); + up_thread_data->thread_division = THREAD_DIVISION_UP_STREAM; + up_thread_data->end_flag = END_FLAG_ON; + this->session_thread_data_map[boost::this_thread::get_id()] = up_thread_data; + boost::asio::ip::tcp::endpoint rs_endpoint; + status = this->handle_realserver_disconnect(boost::this_thread::get_id(), rs_endpoint); + BOOST_CHECK_EQUAL(status, CLIENT_RECV); + BOOST_CHECK_EQUAL(status, this->session_thread_data_map[boost::this_thread::get_id()]->last_status); + this->session_thread_data_map.clear(); + } + { + cout << "[360]--------------------------------------------- " << endl; + //unit_test[360]上りスレッド, 終了フラグがOFF, 切替中, sorryフラグがONの場合, status = SORRYSERVER_SELECT + EVENT_TAG status; + thread_data_ptr up_thread_data(new session_thread_data_ip); + up_thread_data->thread_division = THREAD_DIVISION_UP_STREAM; + up_thread_data->end_flag = END_FLAG_OFF; + up_thread_data->switch_flag = SWITCH_FLAG_ON; + up_thread_data->sorry_flag = SORRY_FLAG_ON; + this->session_thread_data_map[boost::this_thread::get_id()] = up_thread_data; + boost::asio::ip::tcp::endpoint rs_endpoint; + status = this->handle_realserver_disconnect(boost::this_thread::get_id(), rs_endpoint); + BOOST_CHECK_EQUAL(status, SORRYSERVER_SELECT); + BOOST_CHECK_EQUAL(status, this->session_thread_data_map[boost::this_thread::get_id()]->last_status); + BOOST_CHECK_EQUAL(SWITCH_FLAG_OFF, this->session_thread_data_map[boost::this_thread::get_id()]->switch_flag); + this->session_thread_data_map.clear(); + } + { + cout << "[361]--------------------------------------------- " << endl; + //unit_test[361]上りスレッド, 終了フラグがOFF, 切替中, sorryフラグがOFFの場合, status = REALSERVER_SELECT + EVENT_TAG status; + thread_data_ptr up_thread_data(new session_thread_data_ip); + up_thread_data->thread_division = THREAD_DIVISION_UP_STREAM; + up_thread_data->end_flag = END_FLAG_OFF; + up_thread_data->switch_flag = SWITCH_FLAG_ON; + up_thread_data->sorry_flag = SORRY_FLAG_OFF; + this->session_thread_data_map[boost::this_thread::get_id()] = up_thread_data; + boost::asio::ip::tcp::endpoint rs_endpoint; + status = this->handle_realserver_disconnect(boost::this_thread::get_id(), rs_endpoint); + BOOST_CHECK_EQUAL(status, REALSERVER_SELECT); + BOOST_CHECK_EQUAL(status, this->session_thread_data_map[boost::this_thread::get_id()]->last_status); + BOOST_CHECK_EQUAL(SWITCH_FLAG_OFF, this->session_thread_data_map[boost::this_thread::get_id()]->switch_flag); + this->session_thread_data_map.clear(); + } + { + cout << "[362]--------------------------------------------- " << endl; + //unit_test[362]上りスレッド, 終了フラグがOFF, 切替中でない場合, status = CLIENT_RECV + EVENT_TAG status; + thread_data_ptr up_thread_data(new session_thread_data_ip); + up_thread_data->thread_division = THREAD_DIVISION_UP_STREAM; + up_thread_data->end_flag = END_FLAG_OFF; + up_thread_data->switch_flag = SWITCH_FLAG_OFF; + this->session_thread_data_map[boost::this_thread::get_id()] = up_thread_data; + boost::asio::ip::tcp::endpoint rs_endpoint; + status = this->handle_realserver_disconnect(boost::this_thread::get_id(), rs_endpoint); + BOOST_CHECK_EQUAL(status, CLIENT_RECV); + BOOST_CHECK_EQUAL(status, this->session_thread_data_map[boost::this_thread::get_id()]->last_status); + this->session_thread_data_map.clear(); + } + { + cout << "[363]--------------------------------------------- " << endl; + //unit_test[363]下りスレッドの場合, status = CLIENT_DISCONNECT + EVENT_TAG status; + thread_data_ptr down_thread_data(new session_thread_data_ip); + down_thread_data->thread_division = THREAD_DIVISION_DOWN_STREAM; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + boost::asio::ip::tcp::endpoint rs_endpoint; + status = this->handle_realserver_disconnect(boost::this_thread::get_id(), rs_endpoint); + BOOST_CHECK_EQUAL(status, CLIENT_DISCONNECT); + BOOST_CHECK_EQUAL(status, this->session_thread_data_map[boost::this_thread::get_id()]->last_status); + this->session_thread_data_map.clear(); + } + { + cout << "[364]--------------------------------------------- " << endl; + //unit_test[364]上りスレッドと下りスレッドの場合 + boost::thread tdown_for_get_id(down_thread_func); + thread_data_ptr up_thread_data(new session_thread_data_ip); + up_thread_data->thread_division = THREAD_DIVISION_UP_STREAM; + up_thread_data->end_flag = END_FLAG_OFF; + up_thread_data->switch_flag = SWITCH_FLAG_OFF; + this->session_thread_data_map[boost::this_thread::get_id()] = up_thread_data; + boost::asio::ip::tcp::endpoint rs_endpoint; + + thread_data_ptr down_thread_data(new session_thread_data_ip); + down_thread_data->thread_division = THREAD_DIVISION_DOWN_STREAM; + this->session_thread_data_map[tdown_for_get_id.get_id()] = down_thread_data; + + boost::thread_group threads; + threads.create_thread(bind(&protocol_module_ip_test_class::handle_realserver_disconnect_test_thread_func, + this, + boost::this_thread::get_id(), + rs_endpoint, + CLIENT_RECV)); + threads.create_thread(bind(&protocol_module_ip_test_class::handle_realserver_disconnect_test_thread_func, + this, + tdown_for_get_id.get_id(), + rs_endpoint, + CLIENT_DISCONNECT)); + threads.join_all(); + } + } + + void handle_realserver_disconnect_test_thread_func(const boost::thread::id thread_id, + const boost::asio::ip::tcp::endpoint & rs_endpoint, + EVENT_TAG check_value) + { + EVENT_TAG ret = this->handle_realserver_disconnect(thread_id, rs_endpoint); + { + boost::mutex::scoped_lock sclock(session_thread_data_map_mutex); + BOOST_CHECK_EQUAL(ret, check_value); + } + } + + void handle_realserver_disconnect_tcp_test_thread() + { + { + cout << "[365]--------------------------------------------- " << endl; + //unit_test[365]下りスレッドの場合, status = CLIENT_DISCONNECT + EVENT_TAG status; + thread_data_ptr down_thread_data(new session_thread_data_ip); + { + boost::mutex::scoped_lock sclock(session_thread_data_map_mutex); + down_thread_data->thread_division = THREAD_DIVISION_DOWN_STREAM; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + } + boost::asio::ip::tcp::endpoint rs_endpoint; + status = this->handle_realserver_disconnect(boost::this_thread::get_id(), rs_endpoint); + { + boost::mutex::scoped_lock sclock(session_thread_data_map_mutex); + BOOST_CHECK_EQUAL(status, CLIENT_DISCONNECT); + BOOST_CHECK_EQUAL(status, this->session_thread_data_map[boost::this_thread::get_id()]->last_status); + this->session_thread_data_map.erase(boost::this_thread::get_id()); + } + } + } + + //handle_sorryserver_disconnect + void handle_sorryserver_disconnect_test() + { + EVENT_TAG ret; + cout << "[366]--------------------------------------------- " << endl; + //unit_test[366] 異常系 上りスレッドsession_thread_data_map中にThreadID対応のデータなし + + this->session_thread_data_map[boost::this_thread::get_id()].reset(); + boost::asio::ip::tcp::endpoint ep_err; + ret = this->handle_sorryserver_disconnect(boost::this_thread::get_id(), ep_err); + //BOOST_CHECK_EQUAL(ret, this->session_thread_data_map[boost::this_thread::get_id()]->last_status); + //遷移先ステータスを設定する status = FINALIZE + BOOST_CHECK_EQUAL(ret, FINALIZE); + + cout << "[367]--------------------------------------------- " << endl; + //unit_test[367] 異常系 上りスレッドsession_thread_data_map中にThreadIDなしの場合のテスト + this->session_thread_data_map.clear(); + ret = this->handle_sorryserver_disconnect(boost::this_thread::get_id(), ep_err); + //BOOST_CHECK_EQUAL(ret, this->session_thread_data_map[boost::this_thread::get_id()]->last_status); + //遷移先ステータスを設定する status = FINALIZE + BOOST_CHECK_EQUAL(ret, FINALIZE); + + cout << "[368]--------------------------------------------- " << endl; + //unit_test[368] 異常系 下りスレッドsession_thread_data_map中にThreadID対応のデータなし + boost::thread t_err(down_thread_func); + this->session_thread_data_map[t_err.get_id()].reset(); + ret = this->handle_sorryserver_disconnect(t_err.get_id(), ep_err); + //BOOST_CHECK_EQUAL(ret, this->session_thread_data_map[boost::this_thread::get_id()]->last_status); + //遷移先ステータスを設定する status = FINALIZE + BOOST_CHECK_EQUAL(ret, FINALIZE); + + cout << "[369]--------------------------------------------- " << endl; + //unit_test[369] 異常系 下りスレッドsession_thread_data_map中にThreadIDなしの場合のテスト + this->session_thread_data_map.clear(); + ret = this->handle_sorryserver_disconnect(t_err.get_id(), ep_err); + //BOOST_CHECK_EQUAL(ret, this->session_thread_data_map[boost::this_thread::get_id()]->last_status); + //遷移先ステータスを設定する status = FINALIZE + BOOST_CHECK_EQUAL(ret, FINALIZE); + + cout << "[370]--------------------------------------------- " << endl; + //unit_test[370] 上りスレッドの場合,終了フラグがONの場合 + //unit_test[370] 遷移先ステータスを設定する status = CLIENT_RECV + boost::asio::ip::tcp::endpoint ep1, ep_d1; + thread_data_ptr data1(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data1; + data1->thread_division = THREAD_DIVISION_UP_STREAM; + data1->end_flag = END_FLAG_ON; + ret = this->handle_sorryserver_disconnect(boost::this_thread::get_id(), ep1); + BOOST_CHECK_EQUAL(ret, this->session_thread_data_map[boost::this_thread::get_id()]->last_status); + //遷移先ステータスを設定する status = CLIENT_RECV + BOOST_CHECK_EQUAL(ret, CLIENT_RECV); + + cout << "[371]--------------------------------------------- " << endl; + //unit_test[371] 上りスレッドの場合,終了フラグがOFF,sorryserver切替中の場合,sorryフラグがONの場合 + //unit_test[371] 遷移先ステータスを設定する status = SORRYSERVER_SELECT + this->session_thread_data_map.clear(); + boost::asio::ip::tcp::endpoint ep2; + thread_data_ptr data2(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data2; + data2->thread_division = THREAD_DIVISION_UP_STREAM; + data2->end_flag = END_FLAG_OFF; + data2->switch_flag = SWITCH_FLAG_ON; + data2->sorry_flag = SORRY_FLAG_ON; + ret = this->handle_sorryserver_disconnect(boost::this_thread::get_id(), ep2); + BOOST_CHECK_EQUAL(ret, this->session_thread_data_map[boost::this_thread::get_id()]->last_status); + //遷移先ステータスを設定する status = SORRYSERVER_SELECT + BOOST_CHECK_EQUAL(ret, SORRYSERVER_SELECT); + BOOST_CHECK_EQUAL(data2->switch_flag, SWITCH_FLAG_OFF); + + cout << "[372]--------------------------------------------- " << endl; + //unit_test[372] 上りスレッドの場合,終了フラグがOFF,sorryserver切替中の場合,sorryフラグがOFFの場合 + //unit_test[372] //遷移先ステータスを設定する status = REALSERVER_SELECT + this->session_thread_data_map.clear(); + boost::asio::ip::tcp::endpoint ep3; + thread_data_ptr data3(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data3; + data3->thread_division = THREAD_DIVISION_UP_STREAM; + data3->end_flag = END_FLAG_OFF; + data3->switch_flag = SWITCH_FLAG_ON; + data3->sorry_flag = SORRY_FLAG_OFF; + + ret = this->handle_sorryserver_disconnect(boost::this_thread::get_id(), ep3); + BOOST_CHECK_EQUAL(ret, this->session_thread_data_map[boost::this_thread::get_id()]->last_status); + //遷移先ステータスを設定する status = REALSERVER_SELECT + BOOST_CHECK_EQUAL(ret, REALSERVER_SELECT); + BOOST_CHECK_EQUAL(data2->switch_flag, SWITCH_FLAG_OFF); + + cout << "[373]--------------------------------------------- " << endl; + //unit_test[373] 上りスレッドの場合,終了フラグがOFF,sorryserver切替中でない場合 + //unit_test[373] 遷移先ステータスを設定する status = CLIENT_RECV + this->session_thread_data_map.clear(); + boost::asio::ip::tcp::endpoint ep4, ep_d4; + thread_data_ptr data4(new session_thread_data_ip); + this->session_thread_data_map[boost::this_thread::get_id()] = data4; + data4->thread_division = THREAD_DIVISION_UP_STREAM; + data4->end_flag = END_FLAG_OFF; + data4->switch_flag = SWITCH_FLAG_OFF; + + ret = this->handle_sorryserver_disconnect(boost::this_thread::get_id(), ep4); + BOOST_CHECK_EQUAL(ret, this->session_thread_data_map[boost::this_thread::get_id()]->last_status); + //遷移先ステータスを設定する status = CLIENT_RECV + BOOST_CHECK_EQUAL(ret, CLIENT_RECV); + + cout << "[374]--------------------------------------------- " << endl; + //unit_test[374] 下りスレッド + //unit_test[374] status = CLIENT_DISCONNECT + this->session_thread_data_map.clear(); + + boost::thread t5(down_thread_func); + boost::asio::ip::tcp::endpoint ep5; + + thread_data_ptr data5(new session_thread_data_ip); + this->session_thread_data_map[t5.get_id()] = data5; + //make 下りスレッドの場合 1->下りスレッド + data5->thread_division = THREAD_DIVISION_DOWN_STREAM; + + ret = this->handle_sorryserver_disconnect(t5.get_id(), ep5); + BOOST_CHECK_EQUAL(ret, this->session_thread_data_map[t5.get_id()]->last_status); + BOOST_CHECK_EQUAL(ret, CLIENT_DISCONNECT); + + cout << "[375]--------------------------------------------- " << endl; + //unit_test[375] 上りスレッドと下りスレッドの場合 + this->session_thread_data_map.clear(); + + boost::thread tdown_for_get_id(down_thread_func); + + boost::asio::ip::tcp::endpoint epup; + boost::asio::ip::tcp::endpoint epdown; + + //上りスレッドの場合,終了フラグがOFF,sorryserver切替中の場合,sorryフラグがONの場合 + thread_data_ptr dataup(new session_thread_data_ip); + dataup->thread_id = boost::this_thread::get_id(); + dataup->thread_division = THREAD_DIVISION_UP_STREAM; + dataup->pair_thread_id = tdown_for_get_id.get_id(); + dataup->end_flag = END_FLAG_OFF; + dataup->switch_flag = SWITCH_FLAG_ON; + dataup->sorry_flag = SORRY_FLAG_ON; + + //下りスレッド + thread_data_ptr datadown(new session_thread_data_ip); + datadown->thread_id = tdown_for_get_id.get_id(); + datadown->thread_division = THREAD_DIVISION_DOWN_STREAM; + datadown->pair_thread_id = boost::this_thread::get_id(); + + this->session_thread_data_map[boost::this_thread::get_id()] = dataup; + this->session_thread_data_map[tdown_for_get_id.get_id()] = datadown; + + boost::thread_group threads; + threads.create_thread(bind(&protocol_module_ip_test_class::handle_sorryserver_disconnect_test_thread_func, + this, + boost::this_thread::get_id(), + epup, + SORRYSERVER_SELECT)); + threads.create_thread(bind(&protocol_module_ip_test_class::handle_sorryserver_disconnect_test_thread_func, + this, + tdown_for_get_id.get_id(), + epdown, + CLIENT_DISCONNECT)); + threads.join_all(); + + //終了フラグをON + BOOST_CHECK_EQUAL(dataup->switch_flag, SWITCH_FLAG_OFF); + BOOST_CHECK_EQUAL(SORRYSERVER_SELECT, this->session_thread_data_map[boost::this_thread::get_id()]->last_status); + } + + void handle_sorryserver_disconnect_test_thread_func(const boost::thread::id thread_id, + const boost::asio::ip::tcp::endpoint & rs_endpoint, EVENT_TAG check_value) + { + EVENT_TAG ret = this->handle_sorryserver_disconnect(thread_id, rs_endpoint); + { + boost::mutex::scoped_lock sclock(session_thread_data_map_mutex); + BOOST_CHECK_EQUAL(ret, check_value); + } + } + + void handle_sorryserver_disconnect_test_thread() + { + cout << "[376]--------------------------------------------- " << endl; + //unit_test[376] 異常系 上りスレッドsession_thread_data_map中にThreadID対応のデータなし + + this->session_thread_data_map[boost::this_thread::get_id()].reset(); + boost::asio::ip::tcp::endpoint ep_err; + EVENT_TAG ret = this->handle_sorryserver_disconnect(boost::this_thread::get_id(), ep_err); + //遷移先ステータスを設定する status = FINALIZE + { + boost::mutex::scoped_lock sclock(session_thread_data_map_mutex); + BOOST_CHECK_EQUAL(ret, FINALIZE); + } + } + + //create_x_forwarded_for + void create_x_forwarded_for_test() + { + { + cout << "[377]--------------------------------------------- " << endl; + //unit_test[377] HTTPヘッダーでX-Forworded-Forを検索結果が該当なしの場合 + bool ret = false; + std::string client_endpoint("172.16.58.64"); + char buffer[] = "GET / HTTP/1.1\r\nHost: 172.16.58.66:80\r\n\r\n"; + size_t buffer_len = 41; + size_t x_forwarded_for_insert_pos = 0; + std::string x_forwarded_for_context; + ret = this->create_x_forwarded_for(client_endpoint, buffer, buffer_len, + x_forwarded_for_insert_pos, x_forwarded_for_context); + BOOST_CHECK_EQUAL(true, ret); + BOOST_CHECK_EQUAL((size_t)16, x_forwarded_for_insert_pos); + BOOST_CHECK_EQUAL(0, x_forwarded_for_context.compare("X-Forwarded-For: 172.16.58.64\r\n")); + } + { + cout << "[378]--------------------------------------------- " << endl; + //unit_test[378] HTTPヘッダーでX-Forworded-Forを検索結果が該当ありの場合 + bool ret = true; + std::string client_endpoint("172.16.58.64"); + char buffer[] = "GET / HTTP/1.1\r\nHost: 172.16.58.66:80\r\nX-Forwarded-For: 172.16.58.69\r\n\r\n"; + size_t buffer_len = 75; + size_t x_forwarded_for_insert_pos = 0; + std::string x_forwarded_for_context; + ret = this->create_x_forwarded_for(client_endpoint, buffer, buffer_len, + x_forwarded_for_insert_pos, x_forwarded_for_context); + BOOST_CHECK_EQUAL(false, ret); + BOOST_CHECK_EQUAL((size_t)68, x_forwarded_for_insert_pos); + BOOST_CHECK_EQUAL(0, x_forwarded_for_context.compare(", 172.16.58.64")); + } + } + //handle_realserver_close + void handle_realserver_close_test() + { + cout << "[379]--------------------------------------------- " << endl; + //unit_test[379] handle_realserver_close 戻り値が「STOP」に設定する。 + boost::asio::ip::udp::endpoint ep; + EVENT_TAG ret = this->handle_realserver_close(boost::this_thread::get_id(), ep); + BOOST_CHECK_EQUAL(ret, STOP); + } + + //get_data_from_recvbuffer + void get_data_from_recvbuffer_test() + { + { + cout << "[380]--------------------------------------------- " << endl; + //unit_test[380] データバッファサイズ > 0, データサイズ > 0, データ開始位置 > 0, リクエストデータサイズ > 0 + //unit_test[380] データバッファサイズ - データサイズ - データ開始位置 > リクエストデータサイズ + bool ret = false; + int cmpresult = -1; + thread_data_ptr thread_data(new session_thread_data_ip); + thread_data->data_buffer_size = MAX_BUFFER_SIZE; + thread_data->data_length = 10; + thread_data->data_offset = 10; + thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset((thread_data->data_buffer+thread_data->data_offset), 1, thread_data->data_length); + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data; + boost::array recvbuffer = { { "abcdefghij" } }; + size_t recvlen = 10; + ret = this->get_data_from_recvbuffer(thread_data, recvbuffer, recvlen); + cmpresult = memcmp(this->session_thread_data_map[boost::this_thread::get_id()]->data_buffer + + this->session_thread_data_map[boost::this_thread::get_id()]->data_offset + 10, + recvbuffer.c_array(), recvlen); + BOOST_CHECK_EQUAL(true, ret); + BOOST_CHECK_EQUAL(MAX_BUFFER_SIZE, this->session_thread_data_map[boost::this_thread::get_id()]->data_buffer_size); + BOOST_CHECK_EQUAL((size_t)20, this->session_thread_data_map[boost::this_thread::get_id()]->data_length); + BOOST_CHECK_EQUAL((size_t)10, this->session_thread_data_map[boost::this_thread::get_id()]->data_offset); + BOOST_CHECK_EQUAL(0, cmpresult); + delete[] thread_data->data_buffer; + } + { + cout << "[381]--------------------------------------------- " << endl; + //unit_test[381] データバッファサイズ > 0, データサイズ = 0, データ開始位置 > 0, リクエストデータサイズ > 0 + //unit_test[381] データバッファサイズ - データサイズ - データ開始位置 > リクエストデータサイズ + bool ret = false; + int cmpresult = -1; + thread_data_ptr thread_data(new session_thread_data_ip); + thread_data->data_buffer_size = MAX_BUFFER_SIZE; + thread_data->data_length = 0; + thread_data->data_offset = 10; + thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset((thread_data->data_buffer+thread_data->data_offset), 1, thread_data->data_length); + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data; + boost::array recvbuffer = { { "abcdefghij" } }; + size_t recvlen = 10; + ret = this->get_data_from_recvbuffer(thread_data, recvbuffer, recvlen); + cmpresult = memcmp(this->session_thread_data_map[boost::this_thread::get_id()]->data_buffer + + this->session_thread_data_map[boost::this_thread::get_id()]->data_offset, + recvbuffer.c_array(), recvlen); + BOOST_CHECK_EQUAL(true, ret); + BOOST_CHECK_EQUAL(MAX_BUFFER_SIZE, this->session_thread_data_map[boost::this_thread::get_id()]->data_buffer_size); + BOOST_CHECK_EQUAL((size_t)10, this->session_thread_data_map[boost::this_thread::get_id()]->data_length); + BOOST_CHECK_EQUAL((size_t)10, this->session_thread_data_map[boost::this_thread::get_id()]->data_offset); + BOOST_CHECK_EQUAL(0, cmpresult); + delete[] thread_data->data_buffer; + } + { + cout << "[382]--------------------------------------------- " << endl; + //unit_test[382] データバッファサイズ > 0, データサイズ > 0, データ開始位置 = 0, リクエストデータサイズ > 0 + //unit_test[382] データバッファサイズ - データサイズ - データ開始位置 > リクエストデータサイズ + bool ret = false; + int cmpresult = -1; + thread_data_ptr thread_data(new session_thread_data_ip); + thread_data->data_buffer_size = MAX_BUFFER_SIZE; + thread_data->data_length = 10; + thread_data->data_offset = 0; + thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset((thread_data->data_buffer+thread_data->data_offset), 1, thread_data->data_length); + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data; + boost::array recvbuffer = { { "abcdefghij" } }; + size_t recvlen = 10; + ret = this->get_data_from_recvbuffer(thread_data, recvbuffer, recvlen); + cmpresult = memcmp(this->session_thread_data_map[boost::this_thread::get_id()]->data_buffer + + this->session_thread_data_map[boost::this_thread::get_id()]->data_offset + 10, + recvbuffer.c_array(), recvlen); + BOOST_CHECK_EQUAL(true, ret); + BOOST_CHECK_EQUAL(MAX_BUFFER_SIZE, this->session_thread_data_map[boost::this_thread::get_id()]->data_buffer_size); + BOOST_CHECK_EQUAL((size_t)20, this->session_thread_data_map[boost::this_thread::get_id()]->data_length); + BOOST_CHECK_EQUAL((size_t)0, this->session_thread_data_map[boost::this_thread::get_id()]->data_offset); + BOOST_CHECK_EQUAL(0, cmpresult); + delete[] thread_data->data_buffer; + } + { + cout << "[383]--------------------------------------------- " << endl; + //unit_test[383] データバッファサイズ > 0, データサイズ > 0, データ開始位置 > 0, リクエストデータサイズ = 0 + //unit_test[383] データバッファサイズ - データサイズ - データ開始位置 > リクエストデータサイズ + bool ret = false; + int cmpresult = -1; + thread_data_ptr thread_data(new session_thread_data_ip); + thread_data->data_buffer_size = MAX_BUFFER_SIZE; + thread_data->data_length = 10; + thread_data->data_offset = 10; + thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset((thread_data->data_buffer+thread_data->data_offset), 1, thread_data->data_length); + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data; + boost::array recvbuffer = { { "abcdefghij" } }; + size_t recvlen = 0; + ret = this->get_data_from_recvbuffer(thread_data, recvbuffer, recvlen); + cmpresult = memcmp(this->session_thread_data_map[boost::this_thread::get_id()]->data_buffer + + this->session_thread_data_map[boost::this_thread::get_id()]->data_offset + 10, + recvbuffer.c_array(), recvlen); + BOOST_CHECK_EQUAL(true, ret); + BOOST_CHECK_EQUAL(MAX_BUFFER_SIZE, this->session_thread_data_map[boost::this_thread::get_id()]->data_buffer_size); + BOOST_CHECK_EQUAL((size_t)10, this->session_thread_data_map[boost::this_thread::get_id()]->data_length); + BOOST_CHECK_EQUAL((size_t)10, this->session_thread_data_map[boost::this_thread::get_id()]->data_offset); + BOOST_CHECK_EQUAL(0, cmpresult); + delete[] thread_data->data_buffer; + } + { + cout << "[384]--------------------------------------------- " << endl; + //unit_test[384] データバッファサイズ > 0, データサイズ = 0, データ開始位置 = 0, リクエストデータサイズ > 0 + //unit_test[384] データバッファサイズ - データサイズ - データ開始位置 = リクエストデータサイズ + bool ret = false; + int cmpresult = -1; + thread_data_ptr thread_data(new session_thread_data_ip); + thread_data->data_buffer_size = MAX_BUFFER_SIZE; + thread_data->data_length = 0; + thread_data->data_offset = 0; + thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset((thread_data->data_buffer+thread_data->data_offset), 1, thread_data->data_length); + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data; + boost::array recvbuffer = { { "abcdefghij" } }; + size_t recvlen = 10; + ret = this->get_data_from_recvbuffer(thread_data, recvbuffer, recvlen); + cmpresult = memcmp(this->session_thread_data_map[boost::this_thread::get_id()]->data_buffer + + this->session_thread_data_map[boost::this_thread::get_id()]->data_offset, + recvbuffer.c_array(), recvlen); + BOOST_CHECK_EQUAL(true, ret); + BOOST_CHECK_EQUAL(MAX_BUFFER_SIZE, this->session_thread_data_map[boost::this_thread::get_id()]->data_buffer_size); + BOOST_CHECK_EQUAL((size_t)10, this->session_thread_data_map[boost::this_thread::get_id()]->data_length); + BOOST_CHECK_EQUAL((size_t)0, this->session_thread_data_map[boost::this_thread::get_id()]->data_offset); + BOOST_CHECK_EQUAL(0, cmpresult); + delete[] thread_data->data_buffer; + } + { + cout << "[385]--------------------------------------------- " << endl; + //unit_test[385] データバッファサイズ > 0, データサイズ > 0, データ開始位置 = 0, リクエストデータサイズ = 0 + //unit_test[385] データバッファサイズ - データサイズ - データ開始位置 > リクエストデータサイズ + bool ret = false; + int cmpresult = -1; + thread_data_ptr thread_data(new session_thread_data_ip); + thread_data->data_buffer_size = MAX_BUFFER_SIZE; + thread_data->data_length = 10; + thread_data->data_offset = 0; + thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset((thread_data->data_buffer+thread_data->data_offset), 1, thread_data->data_length); + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data; + boost::array recvbuffer = { { "abcdefghij" } }; + size_t recvlen = 0; + ret = this->get_data_from_recvbuffer(thread_data, recvbuffer, recvlen); + cmpresult = memcmp(this->session_thread_data_map[boost::this_thread::get_id()]->data_buffer + + this->session_thread_data_map[boost::this_thread::get_id()]->data_offset + 10, + recvbuffer.c_array(), recvlen); + BOOST_CHECK_EQUAL(true, ret); + BOOST_CHECK_EQUAL(MAX_BUFFER_SIZE, this->session_thread_data_map[boost::this_thread::get_id()]->data_buffer_size); + BOOST_CHECK_EQUAL((size_t)10, this->session_thread_data_map[boost::this_thread::get_id()]->data_length); + BOOST_CHECK_EQUAL((size_t)0, this->session_thread_data_map[boost::this_thread::get_id()]->data_offset); + BOOST_CHECK_EQUAL(0, cmpresult); + delete[] thread_data->data_buffer; + } + { + cout << "[386]--------------------------------------------- " << endl; + //unit_test[386] データバッファサイズ > 0, データサイズ = 0, データ開始位置 > 0, リクエストデータサイズ = 0 + //unit_test[386] データバッファサイズ - データサイズ - データ開始位置 > リクエストデータサイズ + bool ret = false; + int cmpresult = -1; + thread_data_ptr thread_data(new session_thread_data_ip); + thread_data->data_buffer_size = MAX_BUFFER_SIZE; + thread_data->data_length = 0; + thread_data->data_offset = 10; + thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset((thread_data->data_buffer+thread_data->data_offset), 1, thread_data->data_length); + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data; + boost::array recvbuffer = { { "abcdefghij" } }; + size_t recvlen = 0; + ret = this->get_data_from_recvbuffer(thread_data, recvbuffer, recvlen); + cmpresult = memcmp(this->session_thread_data_map[boost::this_thread::get_id()]->data_buffer + + this->session_thread_data_map[boost::this_thread::get_id()]->data_offset, + recvbuffer.c_array(), recvlen); + BOOST_CHECK_EQUAL(true, ret); + BOOST_CHECK_EQUAL(MAX_BUFFER_SIZE, this->session_thread_data_map[boost::this_thread::get_id()]->data_buffer_size); + BOOST_CHECK_EQUAL((size_t)0, this->session_thread_data_map[boost::this_thread::get_id()]->data_length); + BOOST_CHECK_EQUAL((size_t)10, this->session_thread_data_map[boost::this_thread::get_id()]->data_offset); + BOOST_CHECK_EQUAL(0, cmpresult); + delete[] thread_data->data_buffer; + } + { + cout << "[387]--------------------------------------------- " << endl; + //unit_test[387] データバッファサイズ > 0, データサイズ = 0, データ開始位置 = 0, リクエストデータサイズ = 0 + //unit_test[387] データバッファサイズ - データサイズ - データ開始位置 > リクエストデータサイズ + bool ret = false; + int cmpresult = -1; + thread_data_ptr thread_data(new session_thread_data_ip); + thread_data->data_buffer_size = MAX_BUFFER_SIZE; + thread_data->data_length = 0; + thread_data->data_offset = 0; + thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset((thread_data->data_buffer+thread_data->data_offset), 1, thread_data->data_length); + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data; + boost::array recvbuffer = { { "abcdefghij" } }; + size_t recvlen = 0; + ret = this->get_data_from_recvbuffer(thread_data, recvbuffer, recvlen); + cmpresult = memcmp(this->session_thread_data_map[boost::this_thread::get_id()]->data_buffer + + this->session_thread_data_map[boost::this_thread::get_id()]->data_offset, + recvbuffer.c_array(), recvlen); + BOOST_CHECK_EQUAL(true, ret); + BOOST_CHECK_EQUAL(MAX_BUFFER_SIZE, this->session_thread_data_map[boost::this_thread::get_id()]->data_buffer_size); + BOOST_CHECK_EQUAL((size_t)0, this->session_thread_data_map[boost::this_thread::get_id()]->data_length); + BOOST_CHECK_EQUAL((size_t)0, this->session_thread_data_map[boost::this_thread::get_id()]->data_offset); + BOOST_CHECK_EQUAL(0, cmpresult); + delete[] thread_data->data_buffer; + } + { + cout << "[388]--------------------------------------------- " << endl; + //unit_test[388] データバッファサイズ > 0, データサイズ > 0, データ開始位置 > 0, リクエストデータサイズ > 0 + //unit_test[388] データバッファサイズ - データサイズ - データ開始位置 < リクエストデータサイズ + //unit_test[388] データバッファサイズ - データサイズ > リクエストデータサイズ + bool ret = false; + int cmpresult = -1; + thread_data_ptr thread_data(new session_thread_data_ip); + thread_data->data_buffer_size = MAX_BUFFER_SIZE; + thread_data->data_length = 10; + thread_data->data_offset = 10; + thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset((thread_data->data_buffer+thread_data->data_offset), 1, thread_data->data_length); + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data; + boost::array recvbuffer; + size_t recvlen = MAX_BUFFER_SIZE - 11; + memset(recvbuffer.c_array(), 2, recvlen); + ret = this->get_data_from_recvbuffer(thread_data, recvbuffer, recvlen); + cmpresult = memcmp(this->session_thread_data_map[boost::this_thread::get_id()]->data_buffer + + this->session_thread_data_map[boost::this_thread::get_id()]->data_offset + 10, + recvbuffer.c_array(), recvlen); + BOOST_CHECK_EQUAL(true, ret); + BOOST_CHECK_EQUAL(MAX_BUFFER_SIZE, this->session_thread_data_map[boost::this_thread::get_id()]->data_buffer_size); + BOOST_CHECK_EQUAL((size_t)(10 + MAX_BUFFER_SIZE - 11), this->session_thread_data_map[boost::this_thread::get_id()]->data_length); + BOOST_CHECK_EQUAL((size_t)0, this->session_thread_data_map[boost::this_thread::get_id()]->data_offset); + BOOST_CHECK_EQUAL(0, cmpresult); + delete[] thread_data->data_buffer; + } + { + cout << "[389]--------------------------------------------- " << endl; + //unit_test[389] データバッファサイズ > 0, データサイズ = 0, データ開始位置 > 0, リクエストデータサイズ > 0 + //unit_test[389] データバッファサイズ - データサイズ - データ開始位置 < リクエストデータサイズ + //unit_test[389] データバッファサイズ - データサイズ > リクエストデータサイズ + bool ret = false; + int cmpresult = -1; + thread_data_ptr thread_data(new session_thread_data_ip); + thread_data->data_buffer_size = MAX_BUFFER_SIZE; + thread_data->data_length = 0; + thread_data->data_offset = 10; + thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset((thread_data->data_buffer+thread_data->data_offset), 1, thread_data->data_length); + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data; + boost::array recvbuffer; + size_t recvlen = MAX_BUFFER_SIZE; + memset(recvbuffer.c_array(), 2, recvlen); + ret = this->get_data_from_recvbuffer(thread_data, recvbuffer, recvlen); + cmpresult = memcmp(this->session_thread_data_map[boost::this_thread::get_id()]->data_buffer + + this->session_thread_data_map[boost::this_thread::get_id()]->data_offset, + recvbuffer.c_array(), recvlen); + BOOST_CHECK_EQUAL(true, ret); + BOOST_CHECK_EQUAL(MAX_BUFFER_SIZE, this->session_thread_data_map[boost::this_thread::get_id()]->data_buffer_size); + BOOST_CHECK_EQUAL((size_t)(MAX_BUFFER_SIZE), this->session_thread_data_map[boost::this_thread::get_id()]->data_length); + BOOST_CHECK_EQUAL((size_t)0, this->session_thread_data_map[boost::this_thread::get_id()]->data_offset); + BOOST_CHECK_EQUAL(0, cmpresult); + delete[] thread_data->data_buffer; + } + { + cout << "[390]--------------------------------------------- " << endl; + //unit_test[390] データバッファサイズ > 0, データサイズ > 0, データ開始位置 > 0, リクエストデータサイズ > 0 + //unit_test[390] データバッファサイズ - データサイズ - データ開始位置 < リクエストデータサイズ + //unit_test[390] データバッファサイズ - データサイズ < リクエストデータサイズ + //unit_test[390] データバッファサイズ > データバッファMAXサイズ  + bool ret = true; + thread_data_ptr thread_data(new session_thread_data_ip); + thread_data->data_buffer_size = MAX_IP_MODULE_BUFFER_SIZE; + thread_data->data_length = 10; + thread_data->data_offset = 10; + thread_data->data_buffer = new char[MAX_IP_MODULE_BUFFER_SIZE]; + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data; + boost::array recvbuffer; + size_t recvlen = MAX_IP_MODULE_BUFFER_SIZE; + ret = this->get_data_from_recvbuffer(thread_data, recvbuffer, recvlen); + BOOST_CHECK_EQUAL(false, ret); + delete[] thread_data->data_buffer; + } + { + cout << "[391]--------------------------------------------- " << endl; + //unit_test[391] データバッファサイズ > 0, データサイズ > 0, データ開始位置 = 0, リクエストデータサイズ > 0 + //unit_test[391] データバッファサイズ - データサイズ - データ開始位置 < リクエストデータサイズ + //unit_test[391] データバッファサイズ - データサイズ < リクエストデータサイズ + //unit_test[391] データバッファサイズ > データバッファMAXサイズ  + bool ret = true; + thread_data_ptr thread_data(new session_thread_data_ip); + thread_data->data_buffer_size = MAX_IP_MODULE_BUFFER_SIZE; + thread_data->data_length = 10; + thread_data->data_offset = 0; + thread_data->data_buffer = new char[MAX_IP_MODULE_BUFFER_SIZE]; + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data; + boost::array recvbuffer; + size_t recvlen = MAX_IP_MODULE_BUFFER_SIZE; + ret = this->get_data_from_recvbuffer(thread_data, recvbuffer, recvlen); + BOOST_CHECK_EQUAL(false, ret); + delete[] thread_data->data_buffer; + } + { + cout << "[392]--------------------------------------------- " << endl; + //unit_test[392] データバッファサイズ > 0, データサイズ > 0, データ開始位置 > 0, リクエストデータサイズ > 0 + //unit_test[392] データバッファサイズ - データサイズ - データ開始位置 < リクエストデータサイズ + //unit_test[392] データバッファサイズ - データサイズ < リクエストデータサイズ + //unit_test[392] データバッファサイズ < データバッファMAXサイズ + //unit_test[392] データサイズ + リクエストデータサイズ > データバッファMAXサイズ + bool ret = true; + thread_data_ptr thread_data(new session_thread_data_ip); + thread_data->data_buffer_size = MAX_BUFFER_SIZE; + thread_data->data_length = 10; + thread_data->data_offset = 10; + thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data; + boost::array recvbuffer; + size_t recvlen = MAX_IP_MODULE_BUFFER_SIZE; + ret = this->get_data_from_recvbuffer(thread_data, recvbuffer, recvlen); + BOOST_CHECK_EQUAL(false, ret); + delete[] thread_data->data_buffer; + } + { + cout << "[393]--------------------------------------------- " << endl; + //unit_test[393] データバッファサイズ > 0, データサイズ = 0, データ開始位置 > 0, リクエストデータサイズ > 0 + //unit_test[393] データバッファサイズ - データサイズ - データ開始位置 < リクエストデータサイズ + //unit_test[393] データバッファサイズ - データサイズ < リクエストデータサイズ + //unit_test[393] データバッファサイズ < データバッファMAXサイズ + //unit_test[393] データサイズ + リクエストデータサイズ > データバッファMAXサイズ + bool ret = true; + thread_data_ptr thread_data(new session_thread_data_ip); + thread_data->data_buffer_size = MAX_BUFFER_SIZE; + thread_data->data_length = 0; + thread_data->data_offset = 10; + thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data; + boost::array recvbuffer; + size_t recvlen = MAX_IP_MODULE_BUFFER_SIZE + 1; + ret = this->get_data_from_recvbuffer(thread_data, recvbuffer, recvlen); + BOOST_CHECK_EQUAL(false, ret); + delete[] thread_data->data_buffer; + } + { + cout << "[394]--------------------------------------------- " << endl; + //unit_test[394] データバッファサイズ > 0, データサイズ > 0, データ開始位置 = 0, リクエストデータサイズ > 0 + //unit_test[394] データバッファサイズ - データサイズ - データ開始位置 < リクエストデータサイズ + //unit_test[394] データバッファサイズ - データサイズ < リクエストデータサイズ + //unit_test[394] データバッファサイズ < データバッファMAXサイズ + //unit_test[394] データサイズ + リクエストデータサイズ > データバッファMAXサイズ + bool ret = true; + thread_data_ptr thread_data(new session_thread_data_ip); + thread_data->data_buffer_size = MAX_BUFFER_SIZE; + thread_data->data_length = 10; + thread_data->data_offset = 0; + thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data; + boost::array recvbuffer; + size_t recvlen = MAX_IP_MODULE_BUFFER_SIZE + 1; + ret = this->get_data_from_recvbuffer(thread_data, recvbuffer, recvlen); + BOOST_CHECK_EQUAL(false, ret); + delete[] thread_data->data_buffer; + } + { + cout << "[395]--------------------------------------------- " << endl; + //unit_test[395] データバッファサイズ > 0, データサイズ = 0, データ開始位置 = 0, リクエストデータサイズ > 0 + //unit_test[395] データバッファサイズ - データサイズ - データ開始位置 < リクエストデータサイズ + //unit_test[395] データバッファサイズ - データサイズ < リクエストデータサイズ + //unit_test[395] データバッファサイズ < データバッファMAXサイズ + //unit_test[395] データサイズ + リクエストデータサイズ > データバッファMAXサイズ + bool ret = true; + thread_data_ptr thread_data(new session_thread_data_ip); + thread_data->data_buffer_size = MAX_BUFFER_SIZE; + thread_data->data_length = 0; + thread_data->data_offset = 0; + thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data; + boost::array recvbuffer; + size_t recvlen = MAX_IP_MODULE_BUFFER_SIZE + 1; + ret = this->get_data_from_recvbuffer(thread_data, recvbuffer, recvlen); + BOOST_CHECK_EQUAL(false, ret); + delete[] thread_data->data_buffer; + } + + { + cout << "[396]--------------------------------------------- " << endl; + //unit_test[396]異常の場合、retu\r\n false + bool ret = true; + thread_data_ptr thread_data(new session_thread_data_ip); + thread_data->data_buffer = NULL; + boost::array recvbuffer; + size_t recvlen; + ret = this->get_data_from_recvbuffer(thread_data, recvbuffer, recvlen); + BOOST_CHECK_EQUAL(false, ret); + } + } + + void put_data_into_sendbuffer_test() + { + char targetUrl_1[] = "GET / HTTP/1.1\r\nX-Forwarded-For: 192.168.1.100\r\nHost: 172.16.58.66:80\r\n\r\n"; + char targetUrl_2[] = "GET / HTTP/1.1\r\nHost: 172.16.58.66:80\r\n\r\n"; + char forwardCtx_1[] = "X-Forwarded-For: 192.168.1.100\r\n"; + char forwardCtx_2[] = ", 192.168.1.101"; + char sorryUri_1[] = "/sorry.html"; + char result_1[] = "GET / HTTP/1.1\r\nX-Forwarded-For: 192.168.1.100, 192.168.1.101\r\nHost: 172.16.58.66:80\r\n\r\n"; + char result_2[] = "GET / HTTP/1.1\r\nX-Forwarded-For: 192.168.1.100\r\nHost: 172.16.58.66:80\r\n\r\n"; + char result_3[] = "GET /sorry.html HTTP/1.1\r\nX-Forwarded-For: 192.168.1.100\r\nHost: 172.16.58.66:80\r\n\r\n"; + char result_4[] = "GET /sorry.html HTTP/1.1\r\nHost: 172.16.58.66:80\r\n\r\n"; + char result_5[] = "GET /sorry.html HTTP/1.1\r\nX-Forwarded-For: 192.168.1.100, 192.168.1.101\r\nHost: 172.16.58.66:80\r\n\r\n"; + char result_6[] = "GET /sorry.html HTTP/1.1\r\nX-Forwarded-For: 192.168.1.100\r\nHost: 172.16.58.66:80\r\n\r\n"; + std::pair buffer_element; + + { + cout << "[397]--------------------------------------------- " << endl; + //unit_test[397] data_bufferにX-Forwarded-Forがあり,data_offsetが0,sorry_flagがOFF,forwarded_forがOFFの場合、データコピーが成功します。 + thread_data_ptr thread_data(new session_thread_data_ip); + thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset(thread_data->data_buffer, 0, MAX_BUFFER_SIZE); + thread_data->data_buffer_size = MAX_BUFFER_SIZE; + thread_data->data_length = strlen(targetUrl_1); + thread_data->data_offset = 0; + thread_data->current_message_rest_size = strlen(targetUrl_1); + strcpy(thread_data->data_buffer + thread_data->data_offset, targetUrl_1); + buffer_element.first = thread_data->data_buffer +thread_data->data_offset; + buffer_element.second = thread_data->data_length; + thread_data->buffer_sequence.push_back(buffer_element); + boost::array sendbuffer; + size_t datalen = 0; + this->put_data_into_sendbuffer(thread_data, sendbuffer, datalen); + BOOST_CHECK_EQUAL(memcmp(sendbuffer.c_array(), targetUrl_1, strlen(targetUrl_1)), 0); + BOOST_CHECK_EQUAL(datalen, strlen(targetUrl_1)); + BOOST_CHECK_EQUAL(thread_data->data_length, 0u); + BOOST_CHECK_EQUAL(thread_data->data_offset, strlen(targetUrl_1)); + BOOST_CHECK_EQUAL(thread_data->current_message_rest_size, 0u); + delete[] thread_data->data_buffer; + } + + { + cout << "[398]--------------------------------------------- " << endl; + //unit_test[398] data_bufferにX-Forwarded-Forが存在しない,data_offsetが0,sorry_flagがOFF,forwarded_forがOFFの場合、データコピーが成功します + thread_data_ptr thread_data(new session_thread_data_ip); + thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset(thread_data->data_buffer, 0, MAX_BUFFER_SIZE); + thread_data->data_buffer_size = MAX_BUFFER_SIZE; + thread_data->data_length = strlen(targetUrl_2); + thread_data->data_offset = 0; + thread_data->current_message_rest_size = strlen(targetUrl_2); + strcpy(thread_data->data_buffer + thread_data->data_offset, targetUrl_2); + buffer_element.first = thread_data->data_buffer +thread_data->data_offset; + buffer_element.second = thread_data->data_length; + thread_data->buffer_sequence.push_back(buffer_element); + boost::array sendbuffer; + size_t datalen = 0; + this->put_data_into_sendbuffer(thread_data, sendbuffer, datalen); + BOOST_CHECK_EQUAL(memcmp(sendbuffer.c_array(), targetUrl_2, strlen(targetUrl_2)), 0); + BOOST_CHECK_EQUAL(datalen, strlen(targetUrl_2)); + BOOST_CHECK_EQUAL(thread_data->data_length, 0u); + BOOST_CHECK_EQUAL(thread_data->data_offset, strlen(targetUrl_2)); + BOOST_CHECK_EQUAL(thread_data->current_message_rest_size, 0u); + delete[] thread_data->data_buffer; + } + + { + cout << "[399]--------------------------------------------- " << endl; + //unit_test[399] data_bufferにX-Forwarded-Forがあり,data_offsetが0,sorry_flagがOFF,forwarded_forがONの場合、データコピーが成功します + thread_data_ptr thread_data(new session_thread_data_ip); + thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset(thread_data->data_buffer, 0, MAX_BUFFER_SIZE); + thread_data->data_buffer_size = MAX_BUFFER_SIZE; + thread_data->data_length = strlen(targetUrl_1); + thread_data->data_offset = 0; + thread_data->current_message_rest_size = strlen(targetUrl_1); + strcpy(thread_data->data_buffer + thread_data->data_offset, targetUrl_1); + + buffer_element.first = thread_data->data_buffer +thread_data->data_offset; + buffer_element.second = strstr(targetUrl_1, "\r\nHost") - targetUrl_1; + thread_data->buffer_sequence.push_back(buffer_element); + + memset(thread_data->forwarded_for_buffer.c_array(), 0, MAX_FORWARD_FOR_SIZE); + strcpy(thread_data->forwarded_for_buffer.c_array(), forwardCtx_2); + buffer_element.first = thread_data->forwarded_for_buffer.c_array(); + buffer_element.second = strlen(forwardCtx_2); + thread_data->buffer_sequence.push_back(buffer_element); + + buffer_element.first = strstr(thread_data->data_buffer + thread_data->data_offset, "\r\nHost"); + buffer_element.second = strlen("\r\nHost: 172.16.58.66:80\r\n\r\n"); + thread_data->buffer_sequence.push_back(buffer_element); + + boost::array sendbuffer; + size_t datalen = 0; + this->put_data_into_sendbuffer(thread_data, sendbuffer, datalen); + BOOST_CHECK_EQUAL(memcmp(sendbuffer.c_array(), result_1, strlen(result_1)), 0); + BOOST_CHECK_EQUAL(datalen, strlen(result_1)); + BOOST_CHECK_EQUAL(thread_data->data_length, 0u); + BOOST_CHECK_EQUAL(thread_data->data_offset, strlen(targetUrl_1)); + BOOST_CHECK_EQUAL(thread_data->current_message_rest_size, 0u); + delete[] thread_data->data_buffer; + } + + { + cout << "[400]--------------------------------------------- " << endl; + //unit_test[400] data_bufferにX-Forwarded-Forが存在しない,data_offsetが0,sorry_flagがOFF,forwarded_forがONの場合、データコピーが成功します + thread_data_ptr thread_data(new session_thread_data_ip); + thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset(thread_data->data_buffer, 0, MAX_BUFFER_SIZE); + thread_data->data_buffer_size = MAX_BUFFER_SIZE; + thread_data->data_length = strlen(targetUrl_2); + thread_data->data_offset = 0; + thread_data->current_message_rest_size = strlen(targetUrl_2); + strcpy(thread_data->data_buffer + thread_data->data_offset, targetUrl_2); + + buffer_element.first = thread_data->data_buffer +thread_data->data_offset; + buffer_element.second = strstr(targetUrl_2, "Host") - targetUrl_2; + thread_data->buffer_sequence.push_back(buffer_element); + + memset(thread_data->forwarded_for_buffer.c_array(), 0, MAX_FORWARD_FOR_SIZE); + strcpy(thread_data->forwarded_for_buffer.c_array(), forwardCtx_1); + buffer_element.first = thread_data->forwarded_for_buffer.c_array(); + buffer_element.second = strlen(forwardCtx_1); + thread_data->buffer_sequence.push_back(buffer_element); + + buffer_element.first = strstr(thread_data->data_buffer + thread_data->data_offset, "Host"); + buffer_element.second = strlen("Host: 172.16.58.66:80\r\n\r\n"); + thread_data->buffer_sequence.push_back(buffer_element); + + boost::array sendbuffer; + size_t datalen = 0; + this->put_data_into_sendbuffer(thread_data, sendbuffer, datalen); + BOOST_CHECK_EQUAL(memcmp(sendbuffer.c_array(), result_2, strlen(result_2)), 0); + BOOST_CHECK_EQUAL(datalen, strlen(result_2)); + BOOST_CHECK_EQUAL(thread_data->data_length, 0u); + BOOST_CHECK_EQUAL(thread_data->data_offset, strlen(targetUrl_2)); + BOOST_CHECK_EQUAL(thread_data->current_message_rest_size, 0u); + delete[] thread_data->data_buffer; + } + + { + cout << "[401]--------------------------------------------- " << endl; + //unit_test[401] data_bufferにX-Forwarded-Forがあり,data_offsetが0,sorry_flagがON,forwarded_forがOFFの場合、データコピーが成功します + thread_data_ptr thread_data(new session_thread_data_ip); + thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset(thread_data->data_buffer, 0, MAX_BUFFER_SIZE); + thread_data->data_buffer_size = MAX_BUFFER_SIZE; + thread_data->data_length = strlen(targetUrl_1); + thread_data->data_offset = 0; + thread_data->current_message_rest_size = strlen(targetUrl_1); + strcpy(thread_data->data_buffer + thread_data->data_offset, targetUrl_1); + + buffer_element.first = thread_data->data_buffer +thread_data->data_offset; + buffer_element.second = strstr(targetUrl_1, "/ HTTP") - targetUrl_1; + thread_data->buffer_sequence.push_back(buffer_element); + + memset(this->sorry_uri.c_array(), 0, MAX_OPTION_SIZE); + strcpy(this->sorry_uri.c_array(), sorryUri_1); + buffer_element.first = this->sorry_uri.c_array(); + buffer_element.second = strlen(sorryUri_1); + thread_data->buffer_sequence.push_back(buffer_element); + + buffer_element.first = strstr(thread_data->data_buffer + thread_data->data_offset, " HTTP"); + buffer_element.second = strlen(" HTTP/1.1\r\nX-Forwarded-For: 192.168.1.100rnHost: 172.16.58.66:80\r\n\r\n"); + thread_data->buffer_sequence.push_back(buffer_element); + + boost::array sendbuffer; + size_t datalen = 0; + this->put_data_into_sendbuffer(thread_data, sendbuffer, datalen); + BOOST_CHECK_EQUAL(memcmp(sendbuffer.c_array(), result_3, strlen(result_3)), 0); + BOOST_CHECK_EQUAL(datalen, strlen(result_3)); + BOOST_CHECK_EQUAL(thread_data->data_length, 0u); + BOOST_CHECK_EQUAL(thread_data->data_offset, strlen(targetUrl_1)); + BOOST_CHECK_EQUAL(thread_data->current_message_rest_size, 0u); + delete[] thread_data->data_buffer; + } + + { + cout << "[402]--------------------------------------------- " << endl; + //unit_test[402] data_bufferにX-Forwarded-Forが存在しない,data_offsetが0,sorry_flagがON,forwarded_forがOFFの場合、データコピーが成功します + thread_data_ptr thread_data(new session_thread_data_ip); + thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset(thread_data->data_buffer, 0, MAX_BUFFER_SIZE); + thread_data->data_buffer_size = MAX_BUFFER_SIZE; + thread_data->data_length = strlen(targetUrl_2); + thread_data->data_offset = 0; + thread_data->current_message_rest_size = strlen(targetUrl_2); + strcpy(thread_data->data_buffer + thread_data->data_offset, targetUrl_2); + + buffer_element.first = thread_data->data_buffer +thread_data->data_offset; + buffer_element.second = strstr(targetUrl_2, "/ HTTP") - targetUrl_2; + thread_data->buffer_sequence.push_back(buffer_element); + + memset(this->sorry_uri.c_array(), 0, MAX_OPTION_SIZE); + strcpy(this->sorry_uri.c_array(), sorryUri_1); + buffer_element.first = this->sorry_uri.c_array(); + buffer_element.second = strlen(sorryUri_1); + thread_data->buffer_sequence.push_back(buffer_element); + + buffer_element.first = strstr(thread_data->data_buffer + thread_data->data_offset, " HTTP"); + buffer_element.second = strlen(" HTTP/1.1\r\nHost: 172.16.58.66:80\r\n\r\n"); + thread_data->buffer_sequence.push_back(buffer_element); + + boost::array sendbuffer; + size_t datalen = 0; + this->put_data_into_sendbuffer(thread_data, sendbuffer, datalen); + BOOST_CHECK_EQUAL(memcmp(sendbuffer.c_array(), result_4, strlen(result_4)), 0); + BOOST_CHECK_EQUAL(datalen, strlen(result_4)); + BOOST_CHECK_EQUAL(thread_data->data_length, 0u); + BOOST_CHECK_EQUAL(thread_data->data_offset, strlen(targetUrl_2)); + BOOST_CHECK_EQUAL(thread_data->current_message_rest_size, 0u); + delete[] thread_data->data_buffer; + } + + { + cout << "[403]--------------------------------------------- " << endl; + //unit_test[403] data_bufferにX-Forwarded-Forがあり,data_offsetが0,sorry_flagがON,forwarded_forがONの場合、データコピーが成功します + thread_data_ptr thread_data(new session_thread_data_ip); + thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset(thread_data->data_buffer, 0, MAX_BUFFER_SIZE); + thread_data->data_buffer_size = MAX_BUFFER_SIZE; + thread_data->data_length = strlen(targetUrl_1); + thread_data->data_offset = 0; + thread_data->current_message_rest_size = strlen(targetUrl_1); + strcpy(thread_data->data_buffer + thread_data->data_offset, targetUrl_1); + + buffer_element.first = thread_data->data_buffer +thread_data->data_offset; + buffer_element.second = strstr(targetUrl_1, "/ HTTP") - targetUrl_1; + thread_data->buffer_sequence.push_back(buffer_element); + + memset(this->sorry_uri.c_array(), 0, MAX_OPTION_SIZE); + strcpy(this->sorry_uri.c_array(), sorryUri_1); + buffer_element.first = this->sorry_uri.c_array(); + buffer_element.second = strlen(sorryUri_1); + thread_data->buffer_sequence.push_back(buffer_element); + + buffer_element.first = strstr(thread_data->data_buffer + thread_data->data_offset, " HTTP"); + buffer_element.second = strlen(" HTTP/1.1\r\nX-Forwarded-For: 192.168.1.100"); + thread_data->buffer_sequence.push_back(buffer_element); + + memset(thread_data->forwarded_for_buffer.c_array(), 0, MAX_FORWARD_FOR_SIZE); + strcpy(thread_data->forwarded_for_buffer.c_array(), forwardCtx_2); + buffer_element.first = thread_data->forwarded_for_buffer.c_array(); + buffer_element.second = strlen(forwardCtx_2); + thread_data->buffer_sequence.push_back(buffer_element); + + buffer_element.first = strstr(thread_data->data_buffer + thread_data->data_offset, "\r\nHost"); + buffer_element.second = strlen("\r\nHost: 172.16.58.66:80\r\n\r\n"); + thread_data->buffer_sequence.push_back(buffer_element); + + boost::array sendbuffer; + size_t datalen = 0; + this->put_data_into_sendbuffer(thread_data, sendbuffer, datalen); + BOOST_CHECK_EQUAL(memcmp(sendbuffer.c_array(), result_5, strlen(result_5)), 0); + BOOST_CHECK_EQUAL(datalen, strlen(result_5)); + BOOST_CHECK_EQUAL(thread_data->data_length, 0u); + BOOST_CHECK_EQUAL(thread_data->data_offset, strlen(targetUrl_1)); + BOOST_CHECK_EQUAL(thread_data->current_message_rest_size, 0u); + delete[] thread_data->data_buffer; + } + + { + cout << "[404]--------------------------------------------- " << endl; + //unit_test[404] data_bufferにX-Forwarded-Forが存在しない,data_offsetが0,sorry_flagがOFF,forwarded_forがONの場合、データコピーが成功します + thread_data_ptr thread_data(new session_thread_data_ip); + thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset(thread_data->data_buffer, 0, MAX_BUFFER_SIZE); + thread_data->data_buffer_size = MAX_BUFFER_SIZE; + thread_data->data_length = strlen(targetUrl_2); + thread_data->data_offset = 0; + thread_data->current_message_rest_size = strlen(targetUrl_2); + strcpy(thread_data->data_buffer + thread_data->data_offset, targetUrl_2); + thread_data->buffer_sequence.clear(); + + buffer_element.first = thread_data->data_buffer +thread_data->data_offset; + buffer_element.second = strstr(targetUrl_2, "/ HTTP") - targetUrl_2; + thread_data->buffer_sequence.push_back(buffer_element); + + memset(this->sorry_uri.c_array(), 0, MAX_OPTION_SIZE); + strcpy(this->sorry_uri.c_array(), sorryUri_1); + buffer_element.first = this->sorry_uri.c_array(); + buffer_element.second = strlen(sorryUri_1); + thread_data->buffer_sequence.push_back(buffer_element); + + buffer_element.first = strstr(thread_data->data_buffer + thread_data->data_offset, " HTTP"); + buffer_element.second = strlen(" HTTP/1.1\r\n"); + thread_data->buffer_sequence.push_back(buffer_element); + + memset(thread_data->forwarded_for_buffer.c_array(), 0, MAX_FORWARD_FOR_SIZE); + strcpy(thread_data->forwarded_for_buffer.c_array(), forwardCtx_1); + buffer_element.first = thread_data->forwarded_for_buffer.c_array(); + buffer_element.second = strlen(forwardCtx_1); + thread_data->buffer_sequence.push_back(buffer_element); + + buffer_element.first = strstr(thread_data->data_buffer + thread_data->data_offset, "Host"); + buffer_element.second = strlen("Host: 172.16.58.66:80\r\n\r\n"); + thread_data->buffer_sequence.push_back(buffer_element); + + boost::array sendbuffer; + memset(sendbuffer.c_array(), 0, MAX_BUFFER_SIZE); + size_t datalen = 0; + this->put_data_into_sendbuffer(thread_data, sendbuffer, datalen); + BOOST_CHECK_EQUAL(memcmp(sendbuffer.c_array(), result_6, strlen(result_6)), 0); + BOOST_CHECK_EQUAL(datalen, strlen(result_6)); + BOOST_CHECK_EQUAL(thread_data->data_length, 0u); + BOOST_CHECK_EQUAL(thread_data->data_offset, strlen(targetUrl_2)); + BOOST_CHECK_EQUAL(thread_data->current_message_rest_size, 0u); + delete[] thread_data->data_buffer; + } + + { + cout << "[405]--------------------------------------------- " << endl; + //unit_test[405] data_bufferにX-Forwarded-Forがあり,data_offsetが0,sorry_flagがOFF,forwarded_forがOFFの場合、データコピーが成功します + thread_data_ptr thread_data(new session_thread_data_ip); + thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset(thread_data->data_buffer, 0, MAX_BUFFER_SIZE); + thread_data->data_buffer_size = MAX_BUFFER_SIZE; + thread_data->data_length = strlen(targetUrl_1); + thread_data->data_offset = 10; + thread_data->current_message_rest_size = strlen(targetUrl_1); + strcpy(thread_data->data_buffer + thread_data->data_offset, targetUrl_1); + buffer_element.first = thread_data->data_buffer +thread_data->data_offset; + buffer_element.second = thread_data->data_length; + thread_data->buffer_sequence.push_back(buffer_element); + boost::array sendbuffer; + size_t datalen = 0; + this->put_data_into_sendbuffer(thread_data, sendbuffer, datalen); + BOOST_CHECK_EQUAL(memcmp(sendbuffer.c_array(), targetUrl_1, strlen(targetUrl_1)), 0); + BOOST_CHECK_EQUAL(datalen, strlen(targetUrl_1)); + BOOST_CHECK_EQUAL(thread_data->data_length, 0u); + BOOST_CHECK_EQUAL(thread_data->data_offset, strlen(targetUrl_1) + 10); + BOOST_CHECK_EQUAL(thread_data->current_message_rest_size, 0u); + delete[] thread_data->data_buffer; + } + + { + cout << "[406]--------------------------------------------- " << endl; + //unit_test[406] data_bufferにX-Forwarded-Forが存在しない,data_offsetが0,sorry_flagがOFF,forwarded_forがOFFの場合、データコピーが成功します + thread_data_ptr thread_data(new session_thread_data_ip); + thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset(thread_data->data_buffer, 0, MAX_BUFFER_SIZE); + thread_data->data_buffer_size = MAX_BUFFER_SIZE; + thread_data->data_length = strlen(targetUrl_2); + thread_data->data_offset = 10; + thread_data->current_message_rest_size = strlen(targetUrl_2); + strcpy(thread_data->data_buffer + thread_data->data_offset, targetUrl_2); + buffer_element.first = thread_data->data_buffer +thread_data->data_offset; + buffer_element.second = thread_data->data_length; + thread_data->buffer_sequence.push_back(buffer_element); + boost::array sendbuffer; + size_t datalen = 0; + this->put_data_into_sendbuffer(thread_data, sendbuffer, datalen); + BOOST_CHECK_EQUAL(memcmp(sendbuffer.c_array(), targetUrl_2, strlen(targetUrl_2)), 0); + BOOST_CHECK_EQUAL(datalen, strlen(targetUrl_2)); + BOOST_CHECK_EQUAL(thread_data->data_length, 0u); + BOOST_CHECK_EQUAL(thread_data->data_offset, strlen(targetUrl_2) + 10); + BOOST_CHECK_EQUAL(thread_data->current_message_rest_size, 0u); + delete[] thread_data->data_buffer; + } + + { + cout << "[407]--------------------------------------------- " << endl; + //unit_test[407] data_bufferにX-Forwarded-Forがあり,data_offsetが0,sorry_flagがOFF,forwarded_forがONの場合、データコピーが成功します + thread_data_ptr thread_data(new session_thread_data_ip); + thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset(thread_data->data_buffer, 0, MAX_BUFFER_SIZE); + thread_data->data_buffer_size = MAX_BUFFER_SIZE; + thread_data->data_length = strlen(targetUrl_1); + thread_data->data_offset = 10; + thread_data->current_message_rest_size = strlen(targetUrl_1); + strcpy(thread_data->data_buffer + thread_data->data_offset, targetUrl_1); + + buffer_element.first = thread_data->data_buffer +thread_data->data_offset; + buffer_element.second = strstr(targetUrl_1, "\r\nHost") - targetUrl_1; + thread_data->buffer_sequence.push_back(buffer_element); + + memset(thread_data->forwarded_for_buffer.c_array(), 0, MAX_FORWARD_FOR_SIZE); + strcpy(thread_data->forwarded_for_buffer.c_array(), forwardCtx_2); + buffer_element.first = thread_data->forwarded_for_buffer.c_array(); + buffer_element.second = strlen(forwardCtx_2); + thread_data->buffer_sequence.push_back(buffer_element); + + buffer_element.first = strstr(thread_data->data_buffer + thread_data->data_offset, "\r\nHost"); + buffer_element.second = strlen("\r\nHost: 172.16.58.66:80\r\n\r\n"); + thread_data->buffer_sequence.push_back(buffer_element); + + boost::array sendbuffer; + size_t datalen = 0; + this->put_data_into_sendbuffer(thread_data, sendbuffer, datalen); + BOOST_CHECK_EQUAL(memcmp(sendbuffer.c_array(), result_1, strlen(result_1)), 0); + BOOST_CHECK_EQUAL(datalen, strlen(result_1)); + BOOST_CHECK_EQUAL(thread_data->data_length, 0u); + BOOST_CHECK_EQUAL(thread_data->data_offset, strlen(targetUrl_1) + 10); + BOOST_CHECK_EQUAL(thread_data->current_message_rest_size, 0u); + delete[] thread_data->data_buffer; + } + + { + cout << "[408]--------------------------------------------- " << endl; + //unit_test[408] data_bufferにX-Forwarded-Forが存在しない,data_offsetが0,sorry_flagがOFF,forwarded_forがONの場合、データコピーが成功します + thread_data_ptr thread_data(new session_thread_data_ip); + thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset(thread_data->data_buffer, 0, MAX_BUFFER_SIZE); + thread_data->data_buffer_size = MAX_BUFFER_SIZE; + thread_data->data_length = strlen(targetUrl_2); + thread_data->data_offset = 10; + thread_data->current_message_rest_size = strlen(targetUrl_2); + strcpy(thread_data->data_buffer + thread_data->data_offset, targetUrl_2); + + buffer_element.first = thread_data->data_buffer +thread_data->data_offset; + buffer_element.second = strstr(targetUrl_2, "Host") - targetUrl_2; + thread_data->buffer_sequence.push_back(buffer_element); + + memset(thread_data->forwarded_for_buffer.c_array(), 0, MAX_FORWARD_FOR_SIZE); + strcpy(thread_data->forwarded_for_buffer.c_array(), forwardCtx_1); + buffer_element.first = thread_data->forwarded_for_buffer.c_array(); + buffer_element.second = strlen(forwardCtx_1); + thread_data->buffer_sequence.push_back(buffer_element); + + buffer_element.first = strstr(thread_data->data_buffer + thread_data->data_offset, "Host"); + buffer_element.second = strlen("Host: 172.16.58.66:80\r\n\r\n"); + thread_data->buffer_sequence.push_back(buffer_element); + + boost::array sendbuffer; + size_t datalen = 0; + this->put_data_into_sendbuffer(thread_data, sendbuffer, datalen); + BOOST_CHECK_EQUAL(memcmp(sendbuffer.c_array(), result_2, strlen(result_2)), 0); + BOOST_CHECK_EQUAL(datalen, strlen(result_2)); + BOOST_CHECK_EQUAL(thread_data->data_length, 0u); + BOOST_CHECK_EQUAL(thread_data->data_offset, strlen(targetUrl_2) + 10); + BOOST_CHECK_EQUAL(thread_data->current_message_rest_size, 0u); + delete[] thread_data->data_buffer; + } + + { + cout << "[409]--------------------------------------------- " << endl; + //unit_test[409] data_bufferにX-Forwarded-Forがあり,data_offsetが0,sorry_flagがON,forwarded_forがOFFの場合、データコピーが成功します + thread_data_ptr thread_data(new session_thread_data_ip); + thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset(thread_data->data_buffer, 0, MAX_BUFFER_SIZE); + thread_data->data_buffer_size = MAX_BUFFER_SIZE; + thread_data->data_length = strlen(targetUrl_1); + thread_data->data_offset = 10; + thread_data->current_message_rest_size = strlen(targetUrl_1); + strcpy(thread_data->data_buffer + thread_data->data_offset, targetUrl_1); + + buffer_element.first = thread_data->data_buffer +thread_data->data_offset; + buffer_element.second = strstr(targetUrl_1, "/ HTTP") - targetUrl_1; + thread_data->buffer_sequence.push_back(buffer_element); + + memset(this->sorry_uri.c_array(), 0, MAX_OPTION_SIZE); + strcpy(this->sorry_uri.c_array(), sorryUri_1); + buffer_element.first = this->sorry_uri.c_array(); + buffer_element.second = strlen(sorryUri_1); + thread_data->buffer_sequence.push_back(buffer_element); + + buffer_element.first = strstr(thread_data->data_buffer + thread_data->data_offset, " HTTP"); + buffer_element.second = strlen(" HTTP/1.1\r\nX-Forwarded-For: 192.168.1.100rnHost: 172.16.58.66:80\r\n\r\n"); + thread_data->buffer_sequence.push_back(buffer_element); + + boost::array sendbuffer; + size_t datalen = 0; + this->put_data_into_sendbuffer(thread_data, sendbuffer, datalen); + BOOST_CHECK_EQUAL(memcmp(sendbuffer.c_array(), result_3, strlen(result_3)), 0); + BOOST_CHECK_EQUAL(datalen, strlen(result_3)); + BOOST_CHECK_EQUAL(thread_data->data_length, 0u); + BOOST_CHECK_EQUAL(thread_data->data_offset, strlen(targetUrl_1) + 10); + BOOST_CHECK_EQUAL(thread_data->current_message_rest_size, 0u); + delete[] thread_data->data_buffer; + } + + { + cout << "[410]--------------------------------------------- " << endl; + //unit_test[410] data_bufferにX-Forwarded-Forが存在しない,data_offsetが0,sorry_flagがON,forwarded_forがOFFの場合、データコピーが成功します + thread_data_ptr thread_data(new session_thread_data_ip); + thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset(thread_data->data_buffer, 0, MAX_BUFFER_SIZE); + thread_data->data_buffer_size = MAX_BUFFER_SIZE; + thread_data->data_length = strlen(targetUrl_2); + thread_data->data_offset = 10; + thread_data->current_message_rest_size = strlen(targetUrl_2); + strcpy(thread_data->data_buffer + thread_data->data_offset, targetUrl_2); + + buffer_element.first = thread_data->data_buffer +thread_data->data_offset; + buffer_element.second = strstr(targetUrl_2, "/ HTTP") - targetUrl_2; + thread_data->buffer_sequence.push_back(buffer_element); + + memset(this->sorry_uri.c_array(), 0, MAX_OPTION_SIZE); + strcpy(this->sorry_uri.c_array(), sorryUri_1); + buffer_element.first = this->sorry_uri.c_array(); + buffer_element.second = strlen(sorryUri_1); + thread_data->buffer_sequence.push_back(buffer_element); + + buffer_element.first = strstr(thread_data->data_buffer + thread_data->data_offset, " HTTP"); + buffer_element.second = strlen(" HTTP/1.1\r\nHost: 172.16.58.66:80\r\n\r\n"); + thread_data->buffer_sequence.push_back(buffer_element); + + boost::array sendbuffer; + size_t datalen = 0; + this->put_data_into_sendbuffer(thread_data, sendbuffer, datalen); + BOOST_CHECK_EQUAL(memcmp(sendbuffer.c_array(), result_4, strlen(result_4)), 0); + BOOST_CHECK_EQUAL(datalen, strlen(result_4)); + BOOST_CHECK_EQUAL(thread_data->data_length, 0u); + BOOST_CHECK_EQUAL(thread_data->data_offset, strlen(targetUrl_2) + 10); + BOOST_CHECK_EQUAL(thread_data->current_message_rest_size, 0u); + delete[] thread_data->data_buffer; + } + + { + cout << "[411]--------------------------------------------- " << endl; + //unit_test[411] data_bufferにX-Forwarded-Forがあり,data_offsetが0,sorry_flagがON,forwarded_forがONの場合、データコピーが成功します + thread_data_ptr thread_data(new session_thread_data_ip); + thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset(thread_data->data_buffer, 0, MAX_BUFFER_SIZE); + thread_data->data_buffer_size = MAX_BUFFER_SIZE; + thread_data->data_length = strlen(targetUrl_1); + thread_data->data_offset = 10; + thread_data->current_message_rest_size = strlen(targetUrl_1); + strcpy(thread_data->data_buffer + thread_data->data_offset, targetUrl_1); + + buffer_element.first = thread_data->data_buffer +thread_data->data_offset; + buffer_element.second = strstr(targetUrl_1, "/ HTTP") - targetUrl_1; + thread_data->buffer_sequence.push_back(buffer_element); + + memset(this->sorry_uri.c_array(), 0, MAX_OPTION_SIZE); + strcpy(this->sorry_uri.c_array(), sorryUri_1); + buffer_element.first = this->sorry_uri.c_array(); + buffer_element.second = strlen(sorryUri_1); + thread_data->buffer_sequence.push_back(buffer_element); + + buffer_element.first = strstr(thread_data->data_buffer + thread_data->data_offset, " HTTP"); + buffer_element.second = strlen(" HTTP/1.1\r\nX-Forwarded-For: 192.168.1.100"); + thread_data->buffer_sequence.push_back(buffer_element); + + memset(thread_data->forwarded_for_buffer.c_array(), 0, MAX_FORWARD_FOR_SIZE); + strcpy(thread_data->forwarded_for_buffer.c_array(), forwardCtx_2); + buffer_element.first = thread_data->forwarded_for_buffer.c_array(); + buffer_element.second = strlen(forwardCtx_2); + thread_data->buffer_sequence.push_back(buffer_element); + + buffer_element.first = strstr(thread_data->data_buffer + thread_data->data_offset, "\r\nHost"); + buffer_element.second = strlen("\r\nHost: 172.16.58.66:80\r\n\r\n"); + thread_data->buffer_sequence.push_back(buffer_element); + + boost::array sendbuffer; + size_t datalen = 0; + this->put_data_into_sendbuffer(thread_data, sendbuffer, datalen); + BOOST_CHECK_EQUAL(memcmp(sendbuffer.c_array(), result_5, strlen(result_5)), 0); + BOOST_CHECK_EQUAL(datalen, strlen(result_5)); + BOOST_CHECK_EQUAL(thread_data->data_length, 0u); + BOOST_CHECK_EQUAL(thread_data->data_offset, strlen(targetUrl_1) + 10); + BOOST_CHECK_EQUAL(thread_data->current_message_rest_size, 0u); + delete[] thread_data->data_buffer; + } + + { + cout << "[412]--------------------------------------------- " << endl; + //unit_test[412] data_bufferにX-Forwarded-Forが存在しない,data_offsetが0,sorry_flagがOFF,forwarded_forがONの場合、データコピーが成功します + thread_data_ptr thread_data(new session_thread_data_ip); + thread_data->data_buffer = new char[MAX_BUFFER_SIZE]; + memset(thread_data->data_buffer, 0, MAX_BUFFER_SIZE); + thread_data->data_buffer_size = MAX_BUFFER_SIZE; + thread_data->data_length = strlen(targetUrl_2); + thread_data->data_offset = 10; + thread_data->current_message_rest_size = strlen(targetUrl_2); + strcpy(thread_data->data_buffer + thread_data->data_offset, targetUrl_2); + thread_data->buffer_sequence.clear(); + + buffer_element.first = thread_data->data_buffer +thread_data->data_offset; + buffer_element.second = strstr(targetUrl_2, "/ HTTP") - targetUrl_2; + thread_data->buffer_sequence.push_back(buffer_element); + + memset(this->sorry_uri.c_array(), 0, MAX_OPTION_SIZE); + strcpy(this->sorry_uri.c_array(), sorryUri_1); + buffer_element.first = this->sorry_uri.c_array(); + buffer_element.second = strlen(sorryUri_1); + thread_data->buffer_sequence.push_back(buffer_element); + + buffer_element.first = strstr(thread_data->data_buffer + thread_data->data_offset, " HTTP"); + buffer_element.second = strlen(" HTTP/1.1\r\n"); + thread_data->buffer_sequence.push_back(buffer_element); + + memset(thread_data->forwarded_for_buffer.c_array(), 0, MAX_FORWARD_FOR_SIZE); + strcpy(thread_data->forwarded_for_buffer.c_array(), forwardCtx_1); + buffer_element.first = thread_data->forwarded_for_buffer.c_array(); + buffer_element.second = strlen(forwardCtx_1); + thread_data->buffer_sequence.push_back(buffer_element); + + buffer_element.first = strstr(thread_data->data_buffer + thread_data->data_offset, "Host"); + buffer_element.second = strlen("Host: 172.16.58.66:80\r\n\r\n"); + thread_data->buffer_sequence.push_back(buffer_element); + + boost::array sendbuffer; + memset(sendbuffer.c_array(), 0, MAX_BUFFER_SIZE); + size_t datalen = 0; + this->put_data_into_sendbuffer(thread_data, sendbuffer, datalen); + BOOST_CHECK_EQUAL(memcmp(sendbuffer.c_array(), result_6, strlen(result_6)), 0); + BOOST_CHECK_EQUAL(datalen, strlen(result_6)); + BOOST_CHECK_EQUAL(thread_data->data_length, 0u); + BOOST_CHECK_EQUAL(thread_data->data_offset, strlen(targetUrl_2) + 10); + BOOST_CHECK_EQUAL(thread_data->current_message_rest_size, 0u); + delete[] thread_data->data_buffer; + } + + { + cout << "[413]--------------------------------------------- " << endl; + //unit_test[413] data_buffer > sendbuffer の場合 + thread_data_ptr thread_data(new session_thread_data_ip); + thread_data->data_buffer = new char[MAX_BUFFER_SIZE + 1]; + memset(thread_data->data_buffer, 1, MAX_BUFFER_SIZE + 1); + thread_data->data_buffer_size = MAX_BUFFER_SIZE + 1; + thread_data->data_length = MAX_BUFFER_SIZE + 1; + thread_data->data_offset = 0; + thread_data->current_message_rest_size = MAX_BUFFER_SIZE + 1; + buffer_element.first = thread_data->data_buffer +thread_data->data_offset; + buffer_element.second = thread_data->data_length; + thread_data->buffer_sequence.push_back(buffer_element); + boost::array sendbuffer; + size_t datalen = 0; + this->put_data_into_sendbuffer(thread_data, sendbuffer, datalen); + BOOST_CHECK_EQUAL(memcmp(sendbuffer.c_array(), thread_data->data_buffer, MAX_BUFFER_SIZE), 0); + BOOST_CHECK_EQUAL(datalen, MAX_BUFFER_SIZE); + delete[] thread_data->data_buffer; + } + } +}; + +/*********************************************************************************** + *以下はBOOST_TEST_SUITEに入れる関数 + ***********************************************************************************/ +//protocol_module_ip +void protocol_module_ip_test() +{ + protocol_module_ip_test_class obj; + obj.protocol_module_ip_test(); +} + +//is_tcp +void is_tcp_test() +{ + protocol_module_ip_test_class obj; + obj.is_tcp_test(); +} + +//is_udp +void is_udp_test() +{ + protocol_module_ip_test_class obj; + obj.is_udp_test(); +} + +//get_name +void get_name_test() +{ + protocol_module_ip_test_class obj; + obj.get_name_test(); +} + +//initialize +void initialize_test() +{ + protocol_module_ip_test_class obj; + obj.initialize_test(); +} + +//finalize +void finalize_test() +{ + protocol_module_ip_test_class obj; + obj.finalize_test(); +} + +//is_use_sorry +void is_use_sorry_test() +{ + protocol_module_ip_test_class obj; + obj.is_use_sorry_test(); +} + +//check_parameter +void check_parameter_test() +{ + protocol_module_ip_test_class obj; + obj.check_parameter_test(); +} + +//set_parameter +void set_parameter_test() +{ + protocol_module_ip_test_class obj; + obj.set_parameter_test(); +} + +//add_parameter +void add_parameter_test() +{ + protocol_module_ip_test_class obj; + obj.add_parameter_test(); +} + +//register_schedule(tcp) +void register_schedule_tcp_test() +{ + protocol_module_ip_test_class obj; + obj.register_schedule_tcp_test(); +} + +//handle_session_initialize +void handle_session_initialize_test() +{ + protocol_module_ip_test_class obj; + obj.handle_session_initialize_test(); +} + +//handle_session_initialize +void handle_session_initialize_test_thread() +{ + protocol_module_ip_test_class obj; + boost::thread_group threads; + for (int i=0; iadd(BOOST_TEST_CASE(&protocol_module_ip_test)); + ts->add(BOOST_TEST_CASE(&is_tcp_test)); + ts->add(BOOST_TEST_CASE(&is_udp_test)); + ts->add(BOOST_TEST_CASE(&get_name_test)); + ts->add(BOOST_TEST_CASE(&initialize_test)); + ts->add(BOOST_TEST_CASE(&finalize_test)); + ts->add(BOOST_TEST_CASE(&is_use_sorry_test)); + ts->add(BOOST_TEST_CASE(&check_parameter_test)); + ts->add(BOOST_TEST_CASE(&set_parameter_test)); + ts->add(BOOST_TEST_CASE(&add_parameter_test)); + ts->add(BOOST_TEST_CASE(®ister_schedule_tcp_test)); + ts->add(BOOST_TEST_CASE(&handle_session_initialize_test)); + ts->add(BOOST_TEST_CASE(&handle_session_initialize_test_thread)); + ts->add(BOOST_TEST_CASE(&handle_session_finalize_test)); + ts->add(BOOST_TEST_CASE(&handle_session_finalize_test_thread)); + ts->add(BOOST_TEST_CASE(&handle_accept_test)); + ts->add(BOOST_TEST_CASE(&handle_accept_test_thread)); + ts->add(BOOST_TEST_CASE(&handle_client_recv_test)); + ts->add(BOOST_TEST_CASE(&handle_client_recv_test_thread)); + ts->add(BOOST_TEST_CASE(&handle_realserver_select_tcp_test)); + ts->add(BOOST_TEST_CASE(&handle_realserver_select_tcp_test_thread)); + ts->add(BOOST_TEST_CASE(&handle_realserver_select_udp_test)); + ts->add(BOOST_TEST_CASE(&handle_realserver_connect_test)); + ts->add(BOOST_TEST_CASE(&handle_realserver_connect_test_thread)); + ts->add(BOOST_TEST_CASE(&handle_realserver_connection_fail_test)); + ts->add(BOOST_TEST_CASE(&handle_realserver_connection_fail_test_thread)); + ts->add(BOOST_TEST_CASE(&handle_realserver_send_test)); + ts->add(BOOST_TEST_CASE(&handle_realserver_send_test_thread)); + ts->add(BOOST_TEST_CASE(&handle_sorryserver_select_test)); + ts->add(BOOST_TEST_CASE(&handle_sorryserver_select_test_thread)); + ts->add(BOOST_TEST_CASE(&handle_sorryserver_connect_test)); + ts->add(BOOST_TEST_CASE(&handle_sorryserver_connect_test_thread)); + ts->add(BOOST_TEST_CASE(&handle_sorryserver_connection_fail_test)); + ts->add(BOOST_TEST_CASE(&handle_sorryserver_connection_fail_test_thread)); + ts->add(BOOST_TEST_CASE(&handle_sorryserver_send_test)); + ts->add(BOOST_TEST_CASE(&handle_sorryserver_send_test_thread)); + ts->add(BOOST_TEST_CASE(&handle_realserver_recv_tcp_test)); + ts->add(BOOST_TEST_CASE(&handle_realserver_recv_tcp_test_thread)); + ts->add(BOOST_TEST_CASE(&handle_realserver_recv_udp_test)); + ts->add(BOOST_TEST_CASE(&handle_sorryserver_recv_test)); + ts->add(BOOST_TEST_CASE(&handle_sorryserver_recv_test_thread)); + ts->add(BOOST_TEST_CASE(&handle_response_send_inform_test)); + ts->add(BOOST_TEST_CASE(&handle_client_connection_check_test)); + ts->add(BOOST_TEST_CASE(&handle_client_connection_check_test_thread)); + ts->add(BOOST_TEST_CASE(&handle_client_select_test)); + ts->add(BOOST_TEST_CASE(&handle_client_send_test)); + ts->add(BOOST_TEST_CASE(&handle_client_send_test_thread)); + ts->add(BOOST_TEST_CASE(&handle_client_disconnect_test)); + ts->add(BOOST_TEST_CASE(&handle_sorry_enable_test)); + ts->add(BOOST_TEST_CASE(&handle_sorry_enable_test_thread)); + ts->add(BOOST_TEST_CASE(&handle_sorry_disable_test)); + ts->add(BOOST_TEST_CASE(&handle_sorry_disable_test_thread)); + ts->add(BOOST_TEST_CASE(&handle_realserver_disconnect_tcp_test)); + ts->add(BOOST_TEST_CASE(&handle_realserver_disconnect_tcp_test_thread)); + ts->add(BOOST_TEST_CASE(&handle_sorryserver_disconnect_test)); + ts->add(BOOST_TEST_CASE(&handle_sorryserver_disconnect_test_thread)); + ts->add(BOOST_TEST_CASE(&handle_realserver_close_test)); + ts->add(BOOST_TEST_CASE(&create_x_forwarded_for_test)); + ts->add(BOOST_TEST_CASE(&get_data_from_recvbuffer_test)); + ts->add(BOOST_TEST_CASE(&put_data_into_sendbuffer_test)); + + framework::master_test_suite().add(ts); + return 0; +} diff --git a/unit_tests/module_test/protocol_module_sessionless_test/Makefile b/unit_tests/module_test/protocol_module_sessionless_test/Makefile new file mode 100644 index 00000000..98e0466a --- /dev/null +++ b/unit_tests/module_test/protocol_module_sessionless_test/Makefile @@ -0,0 +1,37 @@ +# +# +# Makefile for protocol_module_sessionless unit test frameworks. +# +# +TARGET = sessionless_ut +CPP = g++ +CPPFLAGS = -g -Wall -Werror -pthread -O0 -DMAX_BUFFER_SIZE=65535u +INCLUDES = -I../../../logger \ + -I../../../parameter \ + -I../../../include \ + -I../../../src +LIBS = -lboost_system-gcc41-mt \ + -lboost_thread-gcc41-mt \ + -lboost_regex-gcc41-mt \ + -lboost_unit_test_framework-gcc41-mt + +LDFLAGS = -lrt -ldl + +SRCS = sessionless_ut.cpp + +OBJS = $(SRCS:.cpp=.o) + +all: $(TARGET) + +$(TARGET): $(OBJS) + @$(CPP) $(INCLUDES) -o $@ $(OBJS) $(LIBS) + @echo "make all done!(^_^)" + +clean: + @echo "clean...(>_<)" + @rm -f $(TARGET) $(OBJS) + @echo "clean done!" + +.cpp.o: + @$(CPP) $(CPPFLAGS) $(INCLUDES) -c $< + diff --git a/unit_tests/module_test/protocol_module_sessionless_test/sessionless_ut.cpp b/unit_tests/module_test/protocol_module_sessionless_test/sessionless_ut.cpp new file mode 100644 index 00000000..e17f1eff --- /dev/null +++ b/unit_tests/module_test/protocol_module_sessionless_test/sessionless_ut.cpp @@ -0,0 +1,12937 @@ +/* + * @file sessionless_ut.cpp + * @brief protocol module sessionless test file. + * + * L7VSD: Linux Virtual Server for Layer7 Load Balancing + * Copyright (C) 2009 NTT COMWARE Corporation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + **********************************************************************/ + +#include +#include "../../../module/protocol/http_protocol_module_base.cpp" +#include "../../../module/protocol/protocol_module_sessionless.cpp" + +#define REQUEST_BUFFER_SIZE 50u //REQUEST_BUFFER_SIZE +#define RESPONSE_BUFFER_SIZE 50u //RESPONSE_BUFFER_SIZE +#define USE_BUFFER_SIZE 90u //USE_BUFFER_SIZE +#define THREAD_COUNT 10 + +using namespace std; +using namespace boost; +using namespace boost::unit_test; +using namespace l7vs; + +//log stub function +char hostname[] = "127.0.0.1"; + +LOG_LEVEL_TAG stb_getloglevel(){ + return LOG_LV_DEBUG; +} +LOG_LEVEL_TAG stb_getloglevel_is_none(){ + return LOG_LV_NONE; +} + +void stb_putLogFatal( const unsigned int message_id, const std::string& message, const char* file, int line){ +// cout << boost::format( "%s%d%06d %s %s" ) +// % "PM" +// % LOG_LV_FATAL +// % message_id +// % message.c_str() +// % hostname; +// cout << endl; +} +void stb_putLogError( const unsigned int message_id, const std::string& message, const char* file, int line){ +// cout << boost::format( "%s%d%06d %s %s" ) +// % "PM" +// % LOG_LV_ERROR +// % message_id +// % message.c_str() +// % hostname; +// cout << endl; +} +void stb_putLogWarn( const unsigned int message_id, const std::string& message, const char* file, int line){ +// cout << boost::format( "%s%d%06d %s %s" ) +// % "PM" +// % LOG_LV_WARN +// % message_id +// % message.c_str() +// % hostname; +// cout << endl; +} +void stb_putLogInfo( const unsigned int message_id, const std::string& message, const char* file, int line){ +// cout << boost::format( "%s%d%06d %s %s" ) +// % "PM" +// % LOG_LV_INFO +// % message_id +// % message.c_str() +// % hostname; +// cout << endl; +} +void stb_putLogDebug( const unsigned int message_id, const std::string& message, const char* file, int line){ +// cout << boost::format( "%s%d%06d %s %s" ) +// % "PM" +// % LOG_LV_DEBUG +// % message_id +// % message.c_str() +// % hostname; +// cout << endl; +} + +//new operator function +static bool new_flg = false; +void new_install(){ + new_flg = true; +} +void new_uninstall(){ + new_flg = false; +} +void* operator new[](size_t size){ + if (new_flg) + throw std::bad_alloc(); + else + { + void* p = malloc(size); + return p; + } +} +void operator delete[](void* p){ + free(p); +} + +//RealServerリストの各操作関数 +//RealServerリスト先頭取得関数 +protocol_module_sessionless::realserverlist_type::iterator rslist_begin() { + return protocol_module_sessionless::realserverlist_type::iterator(); +} +//RealServerリスト末端取得関数 +protocol_module_sessionless::realserverlist_type::iterator rslist_end() { + return protocol_module_sessionless::realserverlist_type::iterator(); +} +//RealServerリスト次要素取得関数 +protocol_module_sessionless::realserverlist_type::iterator rslist_next( + protocol_module_sessionless::realserverlist_type::iterator iter) { + return protocol_module_sessionless::realserverlist_type::iterator(); +} +//RealServerリストロック関数 +void rslist_lock() { +} +//RealServerリストアンロック関数 +void rslist_unlock() { +} +//コンポーネント領域割り当て関数 +void* pay_memory(const std::string& str, unsigned int* pro) { + return 0 ; +} +//コンポーネント領域ロック関数 +void area_lock() {} +//コンポーネント領域アンロック関数 +void area_unlock() {} +//Client振り分け処理関数 +void schedule_tcp_stb( const boost::thread::id id, + protocol_module_base::rs_list_itr_func_type func_type1, + protocol_module_base::rs_list_itr_func_type func_type2, + protocol_module_base::rs_list_itr_next_func_type func_type3, + boost::asio::ip::tcp::endpoint& ) { +} + +//Thread function +void up_thread_func(){} +void down_thread_func(){} + +// using string to endpoint template function +template +boost::asio::ip::basic_endpoint string_to_endpoint(std::string str){ + std::string::size_type pos = str.find(":"); + std::string hostname = str.substr(0, pos); + std::string portname = str.substr(pos + 1, str.length()); + boost::asio::io_service io_service; + typename InternetProtocol::resolver resolver(io_service); + typename InternetProtocol::resolver::query query(hostname, portname); + typename InternetProtocol::resolver::iterator end; + typename InternetProtocol::resolver::iterator itr = resolver.resolve(query); + if (itr == end) + return typename InternetProtocol::endpoint(); + return *itr; +} + +//schedule function +void schedule_tcp_determinate(//endpoint = 決定 + const boost::thread::id thread_id, + protocol_module_base::rs_list_itr_func_type rs_list_begin, + protocol_module_base::rs_list_itr_func_type rs_list_end, + protocol_module_base::rs_list_itr_next_func_type rs_list_next, + boost::asio::ip::tcp::endpoint &rs_endpoint){ + rs_endpoint = string_to_endpoint ("10.10.10.10:8888"); +} + +void schedule_tcp_nodeterminate(//endpoint = 未決定 + const boost::thread::id thread_id, + protocol_module_base::rs_list_itr_func_type rs_list_begin, + protocol_module_base::rs_list_itr_func_type rs_list_end, + protocol_module_base::rs_list_itr_next_func_type rs_list_next, + boost::asio::ip::tcp::endpoint &rs_endpoint){ +} + +//test class +class protocol_module_sessionless_test_class : public protocol_module_sessionless +{ +public: +boost::mutex check_mutex; + +//stub log function install +void install_stb_log_func(){ + typedef boost::function< void ( const unsigned int, const std::string&, const char*, int ) > log_func_type; + + boost::function< LOG_LEVEL_TAG(void) > getloglevel = &stb_getloglevel; + log_func_type putLogFatal = &stb_putLogFatal; + log_func_type putLogError = &stb_putLogError; + log_func_type putLogWarn = &stb_putLogWarn; + log_func_type putLogInfo = &stb_putLogInfo; + log_func_type putLogDebug = &stb_putLogDebug; + this->init_logger_functions(getloglevel, putLogFatal, putLogError, + putLogWarn, putLogInfo, putLogDebug); + +} + +//initinalize session_thread_data_sessionless +void init_session_thread_data_sessionless(thread_data_ptr data, + boost::thread::id thread_id){ + data->thread_id = boost::this_thread::get_id(); + data->thread_division = THREAD_DIVISION_UP_STREAM; + data->pair_thread_id = thread_id; + data->accept_end_flag = ACCEPT_END_FLAG_OFF; + data->end_flag = END_FLAG_OFF; + data->sorry_flag = SORRY_FLAG_OFF; + data->sorryserver_switch_flag = SORRYSERVER_SWITCH_FLAG_OFF; + data->realserver_switch_flag = REALSERVER_SWITCH_FLAG_OFF; + data->last_status = INITIALIZE; + data->recive_data_map.clear(); +} + +//initinalize recive_data + void init_recive_data(recive_data& data){ + data.recive_buffer_max_size = 0; + data.recive_buffer_rest_size = 0; + data.send_status_list.clear(); +} +//initinalize send_status +void init_send_status(send_status& data){ + data.status = SEND_END; + data.send_end_size = 0; + data.send_rest_size = 0; + data.send_possible_size = 0; + data.send_offset = 0; + data.unsend_size = 0; + data.edit_division = EDIT_DIVISION_NO_EDIT; + data.edit_data_list.clear(); +} +//initinalize edit_data +void init_edit_data(edit_data& data) +{ + data.data = ""; + data.data_size = 0; + data.insert_posission = 0; + data.replace_size = 0; +} + +protocol_module_sessionless_test_class() +{ + install_stb_log_func(); +} + +//protocol_module_sessionless 馮家純 +void protocol_module_sessionless_test(){ + cout << "[1]--------------------------------------------- " << endl; + //unit_test[1] モジュール名に("sessionless")を設定する,forwarded_forにFORWARDED_FOR_OFFを設定する,sorry_uriに'\0'を設定する + //モジュール名に("sessionless")を設定する + BOOST_CHECK_EQUAL(this->name, "sessionless"); + //forwarded_forにFORWARDED_FOR_OFFを設定する + BOOST_CHECK_EQUAL(this->forwarded_for, FORWARDED_FOR_OFF); + char chk[MAX_OPTION_SIZE]; + memset(chk, '\0', MAX_OPTION_SIZE); + //sorry_uriに'\0'を設定する + BOOST_CHECK_EQUAL(memcmp(this->sorry_uri.data(), chk, MAX_OPTION_SIZE), 0); +} + +//is_tcp 馮家純 +void is_tcp_test(){ + cout << "[2]--------------------------------------------- " << endl; + //unit_test[2] is_tcp TRUEを返却する + BOOST_CHECK(this->is_tcp()); +} + +//is_udp 馮家純 +void is_udp_test(){ + cout << "[3]--------------------------------------------- " << endl; + //unit_test[3] is_udp FALSEを返却する + BOOST_CHECK_EQUAL(this->is_udp(), false); +} + +//get_name 馮家純 +void get_name_test(){ + cout << "[4]--------------------------------------------- " << endl; + //unit_test[4] モジュール名に("sessionless")を返却する + BOOST_CHECK_EQUAL(this->get_name(), "sessionless"); +} + +//initialize 董作方 +void initialize_test() { + cout << "[5]--------------------------------------------- " << endl; + //unit_test[5] RealServerリストの各操作関数メソッドinitializeのテスト + rs_list_itr_func_type inrslist_begin = rslist_begin; + rs_list_itr_func_type inrslist_end = rslist_end; + rs_list_itr_next_func_type inrslist_next = rslist_next; + boost::function inlist_lock = rslist_lock; + boost::function inlist_unlock = rslist_unlock; + + this->initialize(inrslist_begin, inrslist_end, inrslist_next, inlist_lock, inlist_unlock); + + BOOST_CHECK_EQUAL(this->rs_list_begin, rslist_begin); + BOOST_CHECK_EQUAL(this->rs_list_end, rslist_end); + BOOST_CHECK_EQUAL(this->rs_list_next, rslist_next); + BOOST_CHECK_EQUAL(this->rs_list_lock, rslist_lock); + BOOST_CHECK_EQUAL(this->rs_list_unlock, rslist_unlock); + + cout << "[6]--------------------------------------------- " << endl; + //unit_test[6] RealServerリストの各操作関数空のテスト + inrslist_begin.clear(); + inrslist_end.clear(); + inrslist_next.clear(); + inlist_lock.clear(); + inlist_unlock.clear(); + this->initialize(inrslist_begin,inrslist_end,inrslist_next,inlist_lock,inlist_unlock); + + BOOST_CHECK_EQUAL(this->rs_list_begin.empty(), true); + BOOST_CHECK_EQUAL(this->rs_list_end.empty(), true); + BOOST_CHECK_EQUAL(this->rs_list_next.empty(), true); + BOOST_CHECK_EQUAL(this->rs_list_lock.empty(), true); + BOOST_CHECK_EQUAL(this->rs_list_unlock.empty(), true); +} + +//finalize 董作方 +void finalize_test() { + cout << "[7]--------------------------------------------- " << endl; + //unit_test[7] 各操作関数を初期化する + //RealServerリストの各操作関数 + this->rs_list_begin = rslist_begin; + this->rs_list_end = rslist_end; + this->rs_list_next = rslist_next; + this->rs_list_lock = rslist_lock; + this->rs_list_unlock = rslist_unlock; + //Replicationの各操作関数 + this->replication_pay_memory = pay_memory; + this->replication_area_lock = area_lock; + this->replication_area_unlock = area_unlock; + //ScheduleModuleの振分関数 + this->schedule_tcp = schedule_tcp_stb; + //各モジュールオプション + this->forwarded_for = FORWARDED_FOR_ON; + this->sorry_uri.assign('a'); + + this->finalize(); + + BOOST_CHECK_EQUAL(this->getloglevel.empty() , true); + BOOST_CHECK_EQUAL(this->putLogFatal.empty(), true); + BOOST_CHECK_EQUAL(this->putLogError.empty(), true); + BOOST_CHECK_EQUAL(this->putLogWarn.empty(), true); + BOOST_CHECK_EQUAL(this->putLogInfo.empty(), true); + BOOST_CHECK_EQUAL(this->putLogDebug.empty(), true); + + BOOST_CHECK_EQUAL(this->rs_list_begin.empty(), true); + BOOST_CHECK_EQUAL(this->rs_list_end.empty(), true); + BOOST_CHECK_EQUAL(this->rs_list_next.empty(), true); + BOOST_CHECK_EQUAL(this->rs_list_lock.empty(), true); + BOOST_CHECK_EQUAL(this->rs_list_unlock.empty(), true); + + BOOST_CHECK_EQUAL(this->replication_pay_memory.empty(), true); + BOOST_CHECK_EQUAL(this->replication_area_lock.empty(), true); + BOOST_CHECK_EQUAL(this->replication_area_unlock.empty(), true); + + BOOST_CHECK_EQUAL(this->schedule_tcp.empty(), true); + BOOST_CHECK_EQUAL(this->schedule_udp.empty(), true); + + BOOST_CHECK_EQUAL(this->forwarded_for,FORWARDED_FOR_OFF); + BOOST_CHECK_EQUAL(this->sorry_uri[0],'\0'); +} + +//is_use_sorry 馬翠翠 +void is_use_sorry_test() { + cout << "[8]--------------------------------------------- " << endl; + // unit_test[8] 正常系で必ずtrueを返す + BOOST_CHECK_EQUAL(this->is_use_sorry(), true); +} + +//check_parameter 馬翠翠 +void check_parameter_test() { + check_message_result result; + vector args; + + cout << "[9]--------------------------------------------- " << endl; + // unit_test[9] オプション文字列にデータなし場合、チェック結果フラグにTRUEを設定する + result = this->check_parameter(args); + BOOST_CHECK_EQUAL(result.flag, true); + + cout << "[10]--------------------------------------------- " << endl; + // unit_test[10] オプション文字列 = "-F"の場合、チェック結果フラグにTRUEを設定する + args.push_back("-F"); + result = this->check_parameter(args); + BOOST_CHECK_EQUAL(result.flag, true); + + cout << "[11]--------------------------------------------- " << endl; + // unit_test[11] オプション文字列 = "--forwarded-for"の場合、チェック結果フラグにTRUEを設定する + args.clear(); + args.push_back("--forwarded-for"); + result = this->check_parameter(args); + BOOST_CHECK_EQUAL(result.flag, true); + + cout << "[12]--------------------------------------------- " << endl; + // unit_test[12] チェック結果フラグにFALSEを設定する、チェック結果メッセージに"'-S/--sorry-uri' option value '%s' is too long."(%sは次要素)を設定する + // unit_test[12] test data:オプション文字列 = "-S"、sorry-uri設定フラグ = OFF 次要素の文字列長 > 127の場合 + args.clear(); + args.push_back("-S"); + args.push_back("/bcdef1234567890/0123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/"); + result = this->check_parameter(args); + BOOST_CHECK_EQUAL(result.flag, false); + BOOST_CHECK_EQUAL(result.message, "'-S/--sorry-uri' option value '/bcdef1234567890/0123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/' is too long."); + + cout << "[13]--------------------------------------------- " << endl; + // unit_test[13] sorry-uri設定フラグをON、チェック結果メッセージに"Cannot set multiple option '-S/--sorry-uri'."を設定する + // unit_test[13] test data:オプション文字列 = "-S"、sorry-uri設定フラグ = OFF、次要素の文字列長 = 127 チェックOKの場合 + args.clear(); + args.push_back("-S"); + args.push_back("/bc78/0123456789/0123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/12345678/"); + args.push_back("--sorry-uri"); + args.push_back("/bc78/0123456789/0123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/12345678/"); + result = this->check_parameter(args); + BOOST_CHECK_EQUAL(result.message, "Cannot set multiple option '-S/--sorry-uri'."); + BOOST_CHECK_EQUAL(result.flag, false); + + cout << "[14]--------------------------------------------- " << endl; + // unit_test[14] チェック結果フラグにFALSEを設定する、チェック結果メッセージに"'-S/--sorry-uri' option value '%s' is not a valid URI."(%sは次要素)を設定する + // unit_test[14] test data:オプション文字列 = "-S"、sorry-uri設定フラグ = OFF、次要素の文字列長 = 127 チェックNGの場合 + args.clear(); + args.push_back("-S"); + args.push_back("/a\r\n/123456789/0123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/12345678/"); + result = this->check_parameter(args); + BOOST_CHECK_EQUAL(result.flag, false); + BOOST_CHECK_EQUAL(result.message, "'-S/--sorry-uri' option value '/a\r\n/123456789/0123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/12345678/' is not a valid URI."); + + cout << "[15]--------------------------------------------- " << endl; + // unit_test[15] sorry-uri設定フラグをON、チェック結果メッセージに"Cannot set multiple option '-S/--sorry-uri'."を設定する + // unit_test[15] test data:オプション文字列 = "-S"、sorry-uri設定フラグ = OFF、次要素の文字列長 < 127 チェックOKの場合 + args.clear(); + args.push_back("-S"); + args.push_back("/abc123"); + args.push_back("--sorry-uri"); + args.push_back("/abc123"); + result = this->check_parameter(args); + BOOST_CHECK_EQUAL(result.message, "Cannot set multiple option '-S/--sorry-uri'."); + BOOST_CHECK_EQUAL(result.flag, false); + + cout << "[16]--------------------------------------------- " << endl; + // unit_test[16] チェック結果フラグにFALSEを設定する、チェック結果メッセージに"'-S/--sorry-uri' option value '%s' is not a valid URI."(%sは次要素)を設定する + // unit_test[16] test data:オプション文字列 = "-S"、sorryURI設定フラグ = OFF、次要素の文字列長 < 127 チェックNGの場合 + args.clear(); + args.push_back("-S"); + args.push_back("123\r\n"); + result = this->check_parameter(args); + BOOST_CHECK_EQUAL(result.flag, false); + BOOST_CHECK_EQUAL(result.message, "'-S/--sorry-uri' option value '123\r\n' is not a valid URI."); + + cout << "[17]--------------------------------------------- " << endl; + // unit_test[17] チェック結果フラグにFALSEを設定する、チェック結果メッセージに"You have to set option value '-S/--sorry-uri'."を設定する + // unit_test[17] test data:オプション文字列 = "-S"、sorry-uri設定フラグ = OFF、次要素が存在しない場合 + args.clear(); + args.push_back("-S"); + result = this->check_parameter(args); + BOOST_CHECK_EQUAL(result.flag, false); + BOOST_CHECK_EQUAL(result.message, "You have to set option value '-S/--sorry-uri'."); + + cout << "[18]--------------------------------------------- " << endl; + // unit_test[18] チェック結果フラグにFALSEを設定する、チェック結果メッセージに"Cannot set multiple option '-S/--sorry-uri'."を設定する + // unit_test[18] test data:オプション文字列 = "-S"、sorry-uri設定フラグ = ONの場合 + args.clear(); + args.push_back("-S"); + args.push_back("/123/abc"); + args.push_back("-S"); + args.push_back("/123/999"); + result = this->check_parameter(args); + BOOST_CHECK_EQUAL(result.flag, false); + BOOST_CHECK_EQUAL(result.message, "Cannot set multiple option '-S/--sorry-uri'."); + + cout << "[19]--------------------------------------------- " << endl; + // unit_test[19] チェック結果フラグにFALSEを設定する、チェック結果メッセージに"Option error."を設定する + // unit_test[19] test data:オプション文字列"-F"、"-S" 以外の場合 + args.clear(); + args.push_back("-D"); + result = this->check_parameter(args); + BOOST_CHECK_EQUAL(result.flag, false); + BOOST_CHECK_EQUAL(result.message, "Option error."); + + cout << "[20]--------------------------------------------- " << endl; + // unit_test[20] オプション文字列"-S"、"--forwarded-for"の場合、チェック結果フラグにTRUEを設定する + args.clear(); + args.push_back("-S"); + args.push_back("/123/abc"); + args.push_back("--forwarded-for"); + result = this->check_parameter(args); + BOOST_CHECK_EQUAL(result.flag, true); + + cout << "[21]--------------------------------------------- " << endl; + // unit_test[21] オプション文字列"-F"、"--sorry-uri" の場合、チェック結果フラグにTRUEを設定する + args.clear(); + args.push_back("-F"); + args.push_back("--sorry-uri"); + args.push_back("/123/abc"); + result = this->check_parameter(args); + BOOST_CHECK_EQUAL(result.flag, true); + + cout << "[22]--------------------------------------------- " << endl; + // unit_test[22] オプション文字列"-F"、"--forwarded-for" の場合、チェック結果フラグにTRUEを設定する + args.clear(); + args.push_back("-F"); + args.push_back("--forwarded-for"); + result = this->check_parameter(args); + BOOST_CHECK_EQUAL(result.flag, true); + + cout << "[23]--------------------------------------------- " << endl; + // unit_test[23] チェック結果フラグにFALSEを設定する、チェック結果メッセージに"You have to set option value '-S/--sorry-uri'."を設定する + // unit_test[23] test data:オプション文字列"-F"、"-S" の場合 + args.clear(); + args.push_back("-F"); + args.push_back("-S"); + result = this->check_parameter(args); + BOOST_CHECK_EQUAL(result.flag, false); + BOOST_CHECK_EQUAL(result.message, "You have to set option value '-S/--sorry-uri'."); + + cout << "[24]--------------------------------------------- " << endl; + // unit_test[24] チェック結果フラグにFALSEを設定する、チェック結果メッセージに"You have to set option value '-S/--sorry-uri'."を設定する + // unit_test[24] test data:オプション文字列"--sorry-uri"、"--forwarded-for" の場合 + args.clear(); + args.push_back("--sorry-uri"); + args.push_back("--forwarded-for"); + result = this->check_parameter(args); + BOOST_CHECK_EQUAL(result.flag, false); + BOOST_CHECK_EQUAL(result.message, "You have to set option value '-S/--sorry-uri'."); + + cout << "[25]--------------------------------------------- " << endl; + // unit_test[25] チェック結果フラグにFALSEを設定する、チェック結果メッセージに"Option error."を設定する + // unit_test[25] test data:オプション文字列"--forwarded-for"、"-R"の場合 + args.clear(); + args.push_back("--forwarded-for"); + args.push_back("-R"); + result = this->check_parameter(args); + BOOST_CHECK_EQUAL(result.flag, false); + BOOST_CHECK_EQUAL(result.message, "Option error."); + + cout << "[26]--------------------------------------------- " << endl; + // unit_test[26] チェック結果フラグにFALSEを設定する、チェック結果メッセージに"You have to set option value '-S/--sorry-uri'."を設定する + // unit_test[26] test data:オプション文字列"S"、"-R"の場合 + args.clear(); + args.push_back("-S"); + args.push_back("-R"); + result = this->check_parameter(args); + BOOST_CHECK_EQUAL(result.flag, false); + BOOST_CHECK_EQUAL(result.message, "You have to set option value '-S/--sorry-uri'."); +} + +//set_parameter 馬翠翠 +void set_parameter_test() { + check_message_result result; + vector args; + + cout << "[27]--------------------------------------------- " << endl; + // unit_test[27] オプション文字列にデータなし場合、チェック結果フラグにTRUEを設定する + result = this->set_parameter(args); + BOOST_CHECK_EQUAL(result.flag, true); + + cout << "[28]--------------------------------------------- " << endl; + // unit_test[28] オプション文字列 = "-F"の場合、送信元設定指示設定フラグをON,チェック結果フラグにTRUEを設定する + args.push_back("-F"); + result = this->set_parameter(args); + BOOST_CHECK_EQUAL(this->forwarded_for, FORWARDED_FOR_ON); + BOOST_CHECK_EQUAL(result.flag, true); + + cout << "[29]--------------------------------------------- " << endl; + // unit_test[29] オプション文字列 = "--forwarded-for"の場合、送信元設定指示設定フラグをON,チェック結果フラグにTRUEを設定する + args.clear(); + args.push_back("--forwarded-for"); + result = this->set_parameter(args); + BOOST_CHECK_EQUAL(this->forwarded_for, FORWARDED_FOR_ON); + BOOST_CHECK_EQUAL(result.flag, true); + + cout << "[30]--------------------------------------------- " << endl; + // unit_test[30] チェック結果フラグにFALSEを設定する、チェック結果メッセージに"'-S/--sorry-uri' option value '%s' is too long."(%sは次要素)を設定する + // unit_test[30] test data:オプション文字列 = "-S"、sorry-uri設定フラグ = OFF、次要素の文字列長 > 127の場合 + args.clear(); + args.push_back("-S"); + args.push_back("/bcdef1234567890/0123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/"); + result = this->set_parameter(args); + BOOST_CHECK_EQUAL(result.flag, false); + BOOST_CHECK_EQUAL(result.message, "'-S/--sorry-uri' option value '/bcdef1234567890/0123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/' is too long."); + + cout << "[31]--------------------------------------------- " << endl; + // unit_test[31] sorry-uri設定フラグをON、チェック結果メッセージに"Cannot set multiple option '-S/--sorry-uri'."を設定する + // unit_test[31] test data:オプション文字列 = "-S"、sorry-uri設定フラグ = OFF、次要素の文字列長 = 127 チェックOKの場合 + args.clear(); + args.push_back("-S"); + args.push_back("/bcdef123456789/0123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/"); + args.push_back("--sorry-uri"); + args.push_back("/bcdef123456789/0123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/"); + result = this->set_parameter(args); + BOOST_CHECK_EQUAL(result.message, "Cannot set multiple option '-S/--sorry-uri'."); + BOOST_CHECK_EQUAL(result.flag, false); + + cout << "[32]--------------------------------------------- " << endl; + // unit_test[32] チェック結果フラグにFALSEを設定する、チェック結果メッセージに"'-S/--sorry-uri' option value '%s' is not a valid URI."(%sは次要素)を設定する + // unit_test[32] test data:オプション文字列 = "-S"、sorry-uri設定フラグ = OFF、次要素の文字列長 = 127 チェックNGの場合 + args.clear(); + args.push_back("-S"); + args.push_back("abcdef12345\r\n/0123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/"); + result = this->set_parameter(args); + BOOST_CHECK_EQUAL(result.flag, false); + BOOST_CHECK_EQUAL(result.message, "'-S/--sorry-uri' option value 'abcdef12345\r\n/0123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/123456789/' is not a valid URI."); + + cout << "[33]--------------------------------------------- " << endl; + // unit_test[33] sorry-uriに次要素の文字列を設定する + // unit_test[33] test data:オプション文字列 = "-S"、sorry-uri設定フラグ = OFF、次要素の文字列長 < 127 チェックOKの場合 + args.clear(); + args.push_back("-S"); + args.push_back("/abc/123"); + result = this->set_parameter(args); + int ret = strcmp(this->sorry_uri.data(), "/abc/123"); + BOOST_CHECK_EQUAL(ret, 0); + BOOST_CHECK_EQUAL(result.flag, true); + + cout << "[34]--------------------------------------------- " << endl; + // unit_test[34] チェック結果フラグにFALSEを設定する、チェック結果メッセージに"'-S/--sorry-uri' option value '%s' is not a valid URI."(%sは次要素)を設定する + // unit_test[34] test data:次要素の文字列長 < 127 チェックNGの場合 + args.clear(); + args.push_back("-S"); + args.push_back("abc\r\n"); + result = this->set_parameter(args); + BOOST_CHECK_EQUAL(result.flag, false); + BOOST_CHECK_EQUAL(result.message, "'-S/--sorry-uri' option value 'abc\r\n' is not a valid URI."); + + cout << "[35]--------------------------------------------- " << endl; + // unit_test[35] チェック結果フラグにFALSEを設定する、チェック結果メッセージに"You have to set option value '-S/--sorry-uri'."を設定する + // unit_test[35] test data:オプション文字列 = "-S"、sorry-uri設定フラグ = OFF、次要素が存在しない場合 + args.clear(); + args.push_back("-S"); + result = this->set_parameter(args); + BOOST_CHECK_EQUAL(result.flag, false); + BOOST_CHECK_EQUAL(result.message, "You have to set option value '-S/--sorry-uri'."); + + cout << "[36]--------------------------------------------- " << endl; + // unit_test[36] チェック結果フラグにFALSEを設定する、チェック結果メッセージに"Cannot set multiple option ''-S/--sorry-uri'."を設定する + // unit_test[36] test data:オプション文字列 = "-S"、sorry-uri設定フラグ = ONの場合 + args.clear(); + args.push_back("-S"); + args.push_back("/abc/123"); + args.push_back("-S"); + args.push_back("/abc/123"); + result = this->set_parameter(args); + BOOST_CHECK_EQUAL(result.flag, false); + BOOST_CHECK_EQUAL(result.message, "Cannot set multiple option '-S/--sorry-uri'."); + + cout << "[37]--------------------------------------------- " << endl; + // unit_test[37] チェック結果フラグにFALSEを設定する、チェック結果メッセージに"Option error."を設定する + // unit_test[37] test data:オプション文字列"-F"、"-S" 以外の場合 + args.clear(); + args.push_back("-D"); + result = this->set_parameter(args); + BOOST_CHECK_EQUAL(result.flag, false); + BOOST_CHECK_EQUAL(result.message, "Option error."); + + cout << "[38]--------------------------------------------- " << endl; + // unit_test[38] 送信元設定指示に0を設定する + // unit_test[38] test data:チェック結果フラグ = TRUE、送信元設定指示設定フラグ = OFFの場合 + args.clear(); + args.push_back("-S"); + args.push_back("/abc/123"); + this->set_parameter(args); + BOOST_CHECK_EQUAL(this->forwarded_for, FORWARDED_FOR_OFF); + + cout << "[39]--------------------------------------------- " << endl; + // unit_test[39] チェック結果フラグにTRUEを設定する、送信元設定指示に1を設定する + // unit_test[39] test data:オプション文字列"--forwarded-for"、"-S" の場合 + args.clear(); + args.push_back("--forwarded-for"); + args.push_back("-S"); + args.push_back("/abc/123"); + result = this->set_parameter(args); + BOOST_CHECK_EQUAL(result.flag, true); + BOOST_CHECK_EQUAL(this->forwarded_for, FORWARDED_FOR_ON); + + cout << "[40]--------------------------------------------- " << endl; + // unit_test[40] チェック結果フラグにTRUEを設定する、送信元設定指示に1を設定する + // unit_test[40] test data:オプション文字列"--sorry-uri"、"-F" の場合 + args.clear(); + args.push_back("--sorry-uri"); + args.push_back("/abc/123"); + args.push_back("-F"); + result = this->set_parameter(args); + BOOST_CHECK_EQUAL(result.flag, true); + BOOST_CHECK_EQUAL(this->forwarded_for, FORWARDED_FOR_ON); + + cout << "[41]--------------------------------------------- " << endl; + // unit_test[41] チェック結果フラグにTRUEを設定する、送信元設定指示に1を設定する + // unit_test[41] test data:オプション文字列"--forwarded-for"、"-F" の場合 + args.clear(); + args.push_back("--forwarded-for"); + args.push_back("-F"); + result = this->set_parameter(args); + BOOST_CHECK_EQUAL(result.flag, true); + BOOST_CHECK_EQUAL(this->forwarded_for, FORWARDED_FOR_ON); + + cout << "[42]--------------------------------------------- " << endl; + // unit_test[42] チェック結果フラグにFALSEを設定する、チェック結果メッセージに"You have to set option value '-S/--sorry-uri'."を設定する + // unit_test[42] test data:オプション文字列"-F"、"-S" の場合 + args.clear(); + args.push_back("-F"); + args.push_back("-S"); + result = this->set_parameter(args); + BOOST_CHECK_EQUAL(result.flag, false); + BOOST_CHECK_EQUAL(result.message, "You have to set option value '-S/--sorry-uri'."); + + cout << "[43]--------------------------------------------- " << endl; + // unit_test[43] チェック結果フラグにFALSEを設定する、チェック結果メッセージに"You have to set option value '-S/--sorry-uri'."を設定する + // unit_test[43] test data:オプション文字列"--sorry-uri"、"--forwarded-for" の場合 + args.clear(); + args.push_back("--sorry-uri"); + args.push_back("--forwarded-for"); + result = this->set_parameter(args); + BOOST_CHECK_EQUAL(result.flag, false); + BOOST_CHECK_EQUAL(result.message, "You have to set option value '-S/--sorry-uri'."); + + cout << "[44]--------------------------------------------- " << endl; + // unit_test[44] チェック結果フラグにFALSEを設定する、チェック結果メッセージに"Option error."を設定する + // unit_test[44] test data:オプション文字列"--forwarded-for"、"-R"の場合 + args.clear(); + args.push_back("--forwarded-for"); + args.push_back("-R"); + result = this->set_parameter(args); + BOOST_CHECK_EQUAL(result.flag, false); + BOOST_CHECK_EQUAL(result.message, "Option error."); + + cout << "[45]--------------------------------------------- " << endl; + // unit_test[45] チェック結果フラグにFALSEを設定する、チェック結果メッセージに"You have to set option value '-S/--sorry-uri'."を設定する + // unit_test[45] test data:オプション文字列"-S"、"-R"の場合 + args.clear(); + args.push_back("-S"); + args.push_back("-R"); + result = this->set_parameter(args); + BOOST_CHECK_EQUAL(result.flag, false); + BOOST_CHECK_EQUAL(result.message, "You have to set option value '-S/--sorry-uri'."); +} + +//add_parameter 馬翠翠 +void add_parameter_test() { + check_message_result result; + vector args; + + cout << "[46]--------------------------------------------- " << endl; + // unit_test[46] オプション文字列が存在しない場合,正常系で必ずtrueを返す + result = this->add_parameter(args); + BOOST_CHECK_EQUAL(result.flag, true); + + cout << "[47]--------------------------------------------- " << endl; + // unit_test[47] オプション文字列が存在する場合,チェック結果フラグにFALSEを設定する, チェック結果メッセージに"Cannot add option."を設定する + args.push_back("-F"); + result = this->add_parameter(args); + BOOST_CHECK_EQUAL(result.flag, false); + BOOST_CHECK_EQUAL(result.message, "Cannot add option."); +} + +//register_schedule(tcp) 董作方 +void register_schedule_tcp_test() { + cout << "[48]--------------------------------------------- " << endl; + // unit_test[48] Client振り分け処理関数のテスト + tcp_schedule_func_type func = schedule_tcp_stb; + this->register_schedule(func); + BOOST_CHECK_EQUAL(this->schedule_tcp, schedule_tcp_stb); + + cout << "[49]--------------------------------------------- " << endl; + // unit_test[49] Client振り分け処理関数空のテスト + func.clear(); + this->register_schedule(func); + BOOST_CHECK_EQUAL(this->schedule_tcp.empty(), true); +} + +//handle_session_initialize 董作方 +void handle_session_initialize_test() { + cout << "[50]--------------------------------------------- " << endl; + //unit_test[50] 遷移先ステータスを設定する status = ACCEPT + boost::thread down_thread(down_thread_func); + boost::asio::ip::tcp::endpoint ep_tcp = string_to_endpoint ("100.100.100.100:8888"); + boost::asio::ip::udp::endpoint ep_udp = string_to_endpoint ("100.100.100.100:8080"); + + EVENT_TAG ret = this->handle_session_initialize(boost::this_thread::get_id(), down_thread.get_id(),ep_tcp,ep_udp); + BOOST_CHECK_EQUAL(ret, ACCEPT); + + + cout << "[51]--------------------------------------------- " << endl; + //unit_test[51] マップの上りスレッドテスト + session_thread_data_map_it iter + = this->session_thread_data_map.find(boost::this_thread::get_id()); + bool bret = (iter != this->session_thread_data_map.end()); + BOOST_REQUIRE_EQUAL(bret, true); + thread_data_ptr data = iter->second; + bret = (data != NULL); + BOOST_REQUIRE_EQUAL(bret, true); + + BOOST_CHECK_EQUAL(data->thread_id, boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(data->thread_division, THREAD_DIVISION_UP_STREAM); + BOOST_CHECK_EQUAL(data->pair_thread_id, down_thread.get_id()); + BOOST_CHECK_EQUAL(data->recive_data_map.empty(), false); + BOOST_CHECK_EQUAL(data->end_flag, END_FLAG_OFF); + BOOST_CHECK_EQUAL(data->accept_end_flag, ACCEPT_END_FLAG_OFF); + BOOST_CHECK_EQUAL(data->sorry_flag, SORRY_FLAG_OFF); + BOOST_CHECK_EQUAL(data->sorryserver_switch_flag, SORRYSERVER_SWITCH_FLAG_OFF); + BOOST_CHECK_EQUAL(data->realserver_switch_flag, REALSERVER_SWITCH_FLAG_OFF); + BOOST_CHECK_EQUAL(data->client_endpoint_tcp, ep_tcp); + + cout << "[52]--------------------------------------------- " << endl; + //unit_test[52] 下りスレッドマップテスト + iter = this->session_thread_data_map.find(down_thread.get_id()); + bret = (iter != this->session_thread_data_map.end()); + BOOST_REQUIRE_EQUAL(bret, true); + data = iter->second; + bret = (data != NULL); + BOOST_REQUIRE_EQUAL(bret, true); + + BOOST_CHECK_EQUAL(data->thread_id, down_thread.get_id()); + BOOST_CHECK_EQUAL(data->thread_division, THREAD_DIVISION_DOWN_STREAM); + BOOST_CHECK_EQUAL(data->pair_thread_id, boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(data->recive_data_map.empty(), true); + BOOST_CHECK_EQUAL(data->end_flag, END_FLAG_OFF); + BOOST_CHECK_EQUAL(data->accept_end_flag, ACCEPT_END_FLAG_OFF); + BOOST_CHECK_EQUAL(data->sorry_flag, SORRY_FLAG_OFF); + BOOST_CHECK_EQUAL(data->sorryserver_switch_flag, SORRYSERVER_SWITCH_FLAG_OFF); + BOOST_CHECK_EQUAL(data->realserver_switch_flag, REALSERVER_SWITCH_FLAG_OFF); + BOOST_CHECK_EQUAL(data->client_endpoint_tcp, ep_tcp); +} + +//handle_session_initialize 董作方 +void handle_session_initialize_test_thread() { + boost::thread down_thread(down_thread_func); + boost::asio::ip::tcp::endpoint ep_tcp = string_to_endpoint ("100.100.100.100:8888"); + boost::asio::ip::udp::endpoint ep_udp = string_to_endpoint ("100.100.100.100:8080"); + + cout << "[53]--------------------------------------------- " << endl; + //unit_test[53] 多スレッドテスト + session_thread_data_map_it iter; + bool bret ; + EVENT_TAG ret = this->handle_session_initialize(boost::this_thread::get_id(), down_thread.get_id(),ep_tcp,ep_udp); + + { + boost::mutex::scoped_lock sclock(this->session_thread_data_map_mutex); + iter = this->session_thread_data_map.find(boost::this_thread::get_id()); + bret = (iter != this->session_thread_data_map.end()); + } + { + boost::mutex::scoped_lock sclock(check_mutex); + BOOST_CHECK_EQUAL(ret, ACCEPT); + BOOST_REQUIRE_EQUAL(bret, true); + thread_data_ptr data = iter->second; + bret = (data != NULL); + BOOST_REQUIRE_EQUAL(bret, true); + + BOOST_CHECK_EQUAL(data->thread_id, boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(data->thread_division, THREAD_DIVISION_UP_STREAM); + BOOST_CHECK_EQUAL(data->pair_thread_id, down_thread.get_id()); + BOOST_CHECK_EQUAL(data->recive_data_map.empty(), false); + BOOST_CHECK_EQUAL(data->end_flag, END_FLAG_OFF); + BOOST_CHECK_EQUAL(data->accept_end_flag, ACCEPT_END_FLAG_OFF); + BOOST_CHECK_EQUAL(data->sorry_flag, SORRY_FLAG_OFF); + BOOST_CHECK_EQUAL(data->sorryserver_switch_flag, SORRYSERVER_SWITCH_FLAG_OFF); + BOOST_CHECK_EQUAL(data->realserver_switch_flag, REALSERVER_SWITCH_FLAG_OFF); + BOOST_CHECK_EQUAL(data->client_endpoint_tcp, ep_tcp); + } +} + +//handle_session_finalize 董作方 +void handle_session_finalize_test() { + cout << "[54]--------------------------------------------- " << endl; + //unit_test[54] セッションスレッドに対応する終了処理 + //unit_test[54] test data:セッションスレッド初期化 + boost::thread down_thread(down_thread_func); + boost::asio::ip::tcp::endpoint ep_tcp = string_to_endpoint ("10.10.100.100:8800"); + boost::asio::ip::udp::endpoint ep_udp = string_to_endpoint ("10.10.100.100:8088"); + + this->handle_session_initialize(boost::this_thread::get_id(),down_thread.get_id(),ep_tcp,ep_udp); + protocol_module_base::EVENT_TAG ret = + this->handle_session_finalize(boost::this_thread::get_id(), down_thread.get_id()); + + //session_thread_data_map中にthis_thread無し + session_thread_data_map_it thread_map_iterator + = this->session_thread_data_map.find(boost::this_thread::get_id()); + bool bret = (thread_map_iterator == this->session_thread_data_map.end()); + BOOST_CHECK_EQUAL(bret,true); + + //session_thread_data_map中にdown_thread無し + thread_map_iterator = this->session_thread_data_map.find(down_thread.get_id()); + bret = (thread_map_iterator == this->session_thread_data_map.end()); + BOOST_CHECK_EQUAL(bret,true); + + //遷移先ステータスを設定する status = ACCEPT + BOOST_CHECK_EQUAL( ret, STOP); +} + +//handle_session_finalize 董作方 +void handle_session_finalize_test_thread() { + cout << "[55]--------------------------------------------- " << endl; + //unit_test[55] 多スレッドテスト/セッションスレッドに対応する終了処理 + //unit_test[55] test data:セッションスレッド初期化 + boost::thread down_thread(down_thread_func); + boost::asio::ip::tcp::endpoint ep_tcp = string_to_endpoint ("10.10.100.100:8800"); + boost::asio::ip::udp::endpoint ep_udp = string_to_endpoint ("10.10.100.100:8088"); + //session_thread_data_map中にthis_thread無し + session_thread_data_map_it thread_map_iterator; + bool bret; + this->handle_session_initialize(boost::this_thread::get_id(),down_thread.get_id(),ep_tcp,ep_udp); + protocol_module_base::EVENT_TAG ret = this->handle_session_finalize(boost::this_thread::get_id(), down_thread.get_id()); + { + boost::mutex::scoped_lock sclock(this->session_thread_data_map_mutex); + thread_map_iterator = this->session_thread_data_map.find(boost::this_thread::get_id()); + bret = (thread_map_iterator == this->session_thread_data_map.end()); + } + { + boost::mutex::scoped_lock sclock(check_mutex); + BOOST_CHECK_EQUAL(bret,true); + BOOST_CHECK_EQUAL(ret, STOP); + } +} + +//handle_accept 董作方 +void handle_accept_test() { + cout << "[56]--------------------------------------------- " << endl; + //unit_test[56] session_thread_data_map中にthread_id無し + EVENT_TAG ret = this->handle_accept(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(ret, FINALIZE); + + cout << "[57]--------------------------------------------- " << endl; + //unit_test[57] session_thread_data_map中にsession_thread_data無し + thread_data_ptr data1 ; + this->session_thread_data_map[boost::this_thread::get_id()] = data1; + ret = this->handle_accept(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(ret, FINALIZE); + + cout << "[58]--------------------------------------------- " << endl; + //unit_test[58] sorry状態の場合 + //unit_test[58] test data:accept_end_flag= on,sorry_flag= on + thread_data_ptr data_pro(new session_thread_data_sessionless); + data_pro->accept_end_flag = ACCEPT_END_FLAG_OFF; + data_pro->sorry_flag = SORRY_FLAG_ON; + this->session_thread_data_map.clear(); + this->session_thread_data_map[boost::this_thread::get_id()] = data_pro; + + ret = this->handle_accept(boost::this_thread::get_id()); + + BOOST_CHECK_EQUAL(data_pro->accept_end_flag, ACCEPT_END_FLAG_ON);//accept完了フラグをON + BOOST_CHECK_EQUAL(ret, SORRYSERVER_SELECT);//遷移先ステータス=SORRYSERVER_SELECT + + cout << "[59]--------------------------------------------- " << endl; + //unit_test[59] sorry状態以外の場合 + //unit_test[59] test data:accept_end_flag= on,sorry_flag= off + data_pro->accept_end_flag = ACCEPT_END_FLAG_OFF; + data_pro->sorry_flag = SORRY_FLAG_OFF; + this->session_thread_data_map.clear(); + this->session_thread_data_map[boost::this_thread::get_id()] = data_pro; + + ret = this->handle_accept(boost::this_thread::get_id()); + + BOOST_CHECK_EQUAL(data_pro->accept_end_flag, ACCEPT_END_FLAG_ON);//accept完了フラグをON + BOOST_CHECK_EQUAL(ret, REALSERVER_SELECT);//遷移先ステータス=REALSERVER_SELECT +} + +//handle_accept 董作方 +void handle_accept_test_thread() { + cout << "[60]--------------------------------------------- " << endl; + //unit_test[60] 多スレッドテスト/sorry状態の場合 + //unit_test[60] test data:accept_end_flag= on,sorry_flag= on + thread_data_ptr data_pro(new session_thread_data_sessionless); + data_pro->accept_end_flag = ACCEPT_END_FLAG_OFF; + data_pro->sorry_flag = SORRY_FLAG_ON; + { + boost::mutex::scoped_lock sclock(this->session_thread_data_map_mutex); + this->session_thread_data_map[boost::this_thread::get_id()] = data_pro; + } + EVENT_TAG ret = this->handle_accept(boost::this_thread::get_id()); + { + boost::mutex::scoped_lock sclock(check_mutex); + BOOST_CHECK_EQUAL(data_pro->accept_end_flag, ACCEPT_END_FLAG_ON);//accept完了フラグをON + BOOST_CHECK_EQUAL(ret, SORRYSERVER_SELECT);//遷移先ステータス=SORRYSERVER_SELECT + } +} + +//handle_client_recv 郎希倹 +void handle_client_recv_test(){ + size_t request_len = USE_BUFFER_SIZE; + EVENT_TAG ret; + boost::array request; + send_status send_status_temp; + boost::thread down_thread(&down_thread_func); + thread_data_ptr psession_thread_data(new session_thread_data_sessionless); + init_session_thread_data_sessionless(psession_thread_data, down_thread.get_id()); + recive_data recive_data_tmp; + + init_send_status(send_status_temp); + // recive_dataを作成する + init_recive_data(recive_data_tmp); + + //recive_data_mapを作成する + psession_thread_data->end_flag = END_FLAG_OFF; + psession_thread_data->last_status = CLIENT_RECV; + boost::asio::ip::tcp::endpoint endpoint_local; + endpoint_local = string_to_endpoint ("111.111.111.111:1111"); + boost::asio::ip::tcp::endpoint endpoint_not_used; + psession_thread_data->client_endpoint_tcp = endpoint_local; + endpoint_not_used = string_to_endpoint ("100.100.100.100:8888"); + + //session_thread_dataを作成する + psession_thread_data->recive_data_map.clear(); + psession_thread_data->recive_data_map[endpoint_local] = recive_data_tmp; + this->forwarded_for = 1; + + cout << "[61]--------------------------------------------- " << endl; + // unit_test[61] boost::this_thread::get_id()対応のデータsession_thread_dataなし + this->session_thread_data_map.clear(); + ret = handle_client_recv(boost::this_thread::get_id(), request, request_len); + BOOST_CHECK_EQUAL(ret, FINALIZE); + + cout << "[62]--------------------------------------------- " << endl; + // unit_test[62] boost::this_thread::get_id()対応のデータsession_thread_dataがNULL + this->session_thread_data_map.clear(); + thread_data_ptr p; + this->session_thread_data_map[boost::this_thread::get_id()] = p; + ret = handle_client_recv(boost::this_thread::get_id(), request, request_len); + BOOST_CHECK_EQUAL(ret, FINALIZE); + + this->session_thread_data_map.clear(); + this->session_thread_data_map[boost::this_thread::get_id()] = psession_thread_data; + + cout << "[63]--------------------------------------------- " << endl; + // unit_test[63] endpoint対応のrecive_dataなし + // requestを設定する + psession_thread_data->recive_data_map.clear(); + psession_thread_data->recive_data_map[endpoint_not_used] = recive_data_tmp; + + memcpy(request.c_array(), "GET / HTTP/1.0\r\nCookie: monkey=123456789012345\r\n\r\n", REQUEST_BUFFER_SIZE); + request_len = REQUEST_BUFFER_SIZE; + ret = handle_client_recv(boost::this_thread::get_id(), request, request_len); + BOOST_CHECK_EQUAL(ret, FINALIZE); + + psession_thread_data->recive_data_map.clear(); + psession_thread_data->recive_data_map[endpoint_local] = recive_data_tmp; + std::map::iterator it = + psession_thread_data->recive_data_map.find(endpoint_local); + recive_data& recive_data_global = it->second; + + cout << "[64]--------------------------------------------- " << endl; + // unit_test[64] recive_data.recive_buffer=Null + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = USE_BUFFER_SIZE; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = NULL; + ret = handle_client_recv(boost::this_thread::get_id(), request, request_len); + BOOST_CHECK_EQUAL(ret, FINALIZE); + + cout << "[65]--------------------------------------------- " << endl; + // unit_test[65] recive_data.recive_buffer1=Null + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 20; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer1 = NULL; + recive_data_global.recive_buffer = recive_data_global.recive_buffer2; + recive_data_global.send_status_list.clear(); + + memset(request.c_array(), 'n', 80); + request_len = 80; + + ret = handle_client_recv(boost::this_thread::get_id(), request, request_len); + BOOST_CHECK_EQUAL(ret, FINALIZE); + + cout << "[66]--------------------------------------------- " << endl; + // unit_test[66] recive_data.recive_buffer2=Null + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 20; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = NULL; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + memset(request.c_array(), 'n', 80); + request_len = 80; + + ret = handle_client_recv(boost::this_thread::get_id(), request, request_len); + BOOST_CHECK_EQUAL(ret, FINALIZE); + + cout << "[67]--------------------------------------------- " << endl; + // unit_test[67] new失敗の場合 + recive_data_global.recive_buffer_max_size = 0; + recive_data_global.recive_buffer_rest_size = 0; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = NULL; + recive_data_global.recive_buffer2 = NULL; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + memcpy(request.c_array(), "GET / HTTP/1.0\r\nCookie: monkey=123456789012345\r\n\r\n", REQUEST_BUFFER_SIZE); + request_len = REQUEST_BUFFER_SIZE; + + this->getloglevel = &stb_getloglevel_is_none; + new_install(); + ret = handle_client_recv(boost::this_thread::get_id(), request, request_len); + new_uninstall(); + this->getloglevel = &stb_getloglevel; + BOOST_CHECK_EQUAL(ret, FINALIZE); + + cout << "[68]--------------------------------------------- " << endl; + // unit_test[68] 終了フラグがONの場合、遷移先ステータスをチェックする + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = USE_BUFFER_SIZE; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + psession_thread_data->end_flag = END_FLAG_ON; + memcpy(request.c_array(), "GET / HTTP/1.0\r\nCookie: monkey=123456789012345\r\n\r\n", REQUEST_BUFFER_SIZE); + request_len = REQUEST_BUFFER_SIZE; + + ret = handle_client_recv(boost::this_thread::get_id(), request, MAX_BUFFER_SIZE); + BOOST_CHECK_EQUAL(ret, CLIENT_RECV); + psession_thread_data->end_flag = END_FLAG_OFF; + + cout << "[69]--------------------------------------------- " << endl; + // unit_test[69] リクエストサイズが0である + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = USE_BUFFER_SIZE; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + ret = handle_client_recv(boost::this_thread::get_id(), request, 0); + BOOST_CHECK_EQUAL(ret, CLIENT_RECV); + + cout << "[70]--------------------------------------------- " << endl; + // unit_test[70] リクエストサイズがUINT_MAXである リクエスト実際にサイズがMAX_BUFFER_SIZEである + recive_data_global.recive_buffer_max_size = MAX_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = MAX_BUFFER_SIZE; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + memset(request.c_array(), 'n', MAX_BUFFER_SIZE); + ret = handle_client_recv(boost::this_thread::get_id(), request, UINT_MAX); + BOOST_CHECK_EQUAL(ret, FINALIZE); + + cout << "[71]--------------------------------------------- " << endl; + // unit_test[71] リクエストサイズがMAX_BUFFER_SIZEである リクエスト実際にサイズがMAX_BUFFER_SIZEである + recive_data_global.recive_buffer_max_size = MAX_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = MAX_BUFFER_SIZE; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + memcpy(request.c_array(), "GET / HTTP/1.0\r\n", 16); + memset(request.c_array() + 16, 'n', MAX_BUFFER_SIZE - 16); + + ret = handle_client_recv(boost::this_thread::get_id(), request, MAX_BUFFER_SIZE); + BOOST_CHECK_EQUAL(ret, CLIENT_RECV); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_NO_EDIT); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, MAX_BUFFER_SIZE); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_max_size, MAX_BUFFER_SIZE); + + // unit_test_part1 begin: + //(異常系) + send_status status_END; + init_send_status(status_END); + status_END.status = SEND_END; + status_END.send_offset = 0; + status_END.send_end_size = 20; + + send_status status_OK; + init_send_status(status_OK); + status_OK.status = SEND_OK; + status_OK.send_offset = 0; + status_OK.send_possible_size = 20; + + send_status status_NG; + init_send_status(status_NG); + status_NG.status = SEND_NG; + status_NG.send_offset = 0; + status_NG.unsend_size = 20; + + send_status status_CONTINUE; + init_send_status(status_CONTINUE); + status_CONTINUE.status = SEND_CONTINUE; + status_CONTINUE.send_offset = 0; + status_CONTINUE.send_end_size = 20; + status_CONTINUE.send_rest_size = 20; + + send_status* send_status_NG[27][3] + = { + // unit_test 入力の送信状態リストは下記の通り:(異常系) + // unit_test[72] 送信状態リストの要素の送信状態が1:送信待の場合 + {&status_OK,NULL,NULL}, + // unit_test[73] 送信状態リストの要素の送信状態が1:送信済 2:送信待の場合 + {&status_END,&status_OK,NULL}, + // unit_test[74] 送信状態リストの要素の送信状態が1:送信継続 2:送信継続の場合 + {&status_CONTINUE,&status_CONTINUE,NULL}, + // unit_test[75] 送信状態リストの要素の送信状態が1:送信継続 2:送信不可の場合 + {&status_CONTINUE,&status_NG,NULL}, + // unit_test[76] 送信状態リストの要素の送信状態が1:送信継続 2:送信済の場合 + {&status_CONTINUE,&status_END,NULL}, + // unit_test[77] 送信状態リストの要素の送信状態が1:送信継続 2:送信待の場合 + {&status_CONTINUE,&status_OK,NULL}, + // unit_test[78] 送信状態リストの要素の送信状態が1:送信不可 2:送信継続の場合 + {&status_NG,&status_CONTINUE,NULL}, + // unit_test[79] 送信状態リストの要素の送信状態が1:送信不可 2:送信不可の場合 + {&status_NG,&status_NG,NULL}, + // unit_test[80] 送信状態リストの要素の送信状態が1:送信不可 2:送信済の場合 + {&status_NG,&status_END,NULL}, + // unit_test[81] 送信状態リストの要素の送信状態が1:送信不可 2:送信待の場合 + {&status_NG,&status_OK,NULL}, + // unit_test[82] 送信状態リストの要素の送信状態が1:送信待 2:送信継続の場合 + {&status_OK,&status_CONTINUE,NULL}, + // unit_test[83] 送信状態リストの要素の送信状態が1:送信待 2:送信不可の場合 + {&status_OK,&status_NG,NULL}, + // unit_test[84] 送信状態リストの要素の送信状態が1:送信待 2:送信済の場合 + {&status_OK,&status_END,NULL}, + // unit_test[85] 送信状態リストの要素の送信状態が1:送信待 2:送信待の場合 + {&status_OK,&status_OK,NULL}, + // unit_test[86] 送信状態リストの要素の送信状態が1:送信済 2:送信継続 3:送信継続の場合 + {&status_END,&status_CONTINUE,&status_CONTINUE}, + // unit_test[87] 送信状態リストの要素の送信状態が1:送信済 2:送信継続 3:送信不可の場合 + {&status_END,&status_CONTINUE,&status_NG}, + // unit_test[88] 送信状態リストの要素の送信状態が1:送信済 2:送信継続 3:送信済の場合 + {&status_END,&status_CONTINUE,&status_END}, + // unit_test[89] 送信状態リストの要素の送信状態が1:送信済 2:送信継続 3:送信待の場合 + {&status_END,&status_CONTINUE,&status_OK}, + // unit_test[90] 送信状態リストの要素の送信状態が1:送信済 2:送信不可 3:送信継続の場合 + {&status_END,&status_NG,&status_CONTINUE}, + // unit_test[91] 送信状態リストの要素の送信状態が1:送信済 2:送信不可 3:送信不可の場合 + {&status_END,&status_NG,&status_NG}, + // unit_test[92] 送信状態リストの要素の送信状態が1:送信済 2:送信不可 3:送信済の場合 + {&status_END,&status_NG,&status_END}, + // unit_test[93] 送信状態リストの要素の送信状態が1:送信済 2:送信不可 3:送信待の場合 + {&status_END,&status_NG,&status_OK}, + // unit_test[94] 送信状態リストの要素の送信状態が1:送信済 2:送信済 3:送信待の場合 + {&status_END,&status_END,&status_OK}, + // unit_test[95] 送信状態リストの要素の送信状態が1:送信済 2:送信待 3:送信継続の場合 + {&status_END,&status_OK,&status_CONTINUE}, + // unit_test[96] 送信状態リストの要素の送信状態が1:送信済 2:送信待 3:送信不可の場合 + {&status_END,&status_OK,&status_NG}, + // unit_test[97] 送信状態リストの要素の送信状態が1:送信済 2:送信待 3:送信済の場合 + {&status_END,&status_OK,&status_END}, + // unit_test[98] 送信状態リストの要素の送信状態が1:送信済 2:送信待 3:送信待の場合 + {&status_END,&status_OK,&status_OK}, + }; + + int i; + int j; + + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = USE_BUFFER_SIZE; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + memset(recive_data_global.recive_buffer, 'n', USE_BUFFER_SIZE); + memset(request.c_array(), 'm', USE_BUFFER_SIZE); + for (i = 0; i < 27; i++) + { + recive_data_global.send_status_list.clear(); + + for (j = 0; j < 3; j++) + { + if(send_status_NG[i][j] == NULL) + { + break; + } + + recive_data_global.send_status_list.push_back(*(send_status_NG[i][j])); + } + + ret = handle_client_recv(boost::this_thread::get_id(), request, request_len); + std::cout << "[" << 72 + i << "]------------------------------------------" << std::endl; + BOOST_CHECK_EQUAL(ret, FINALIZE); + } + + cout << "[99]--------------------------------------------- " << endl; + // unit_test[99] 送信状態リストの要素の送信状態が1:送信済 2:送信済 3:送信継続の場合 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 40; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_END; + send_status_temp.send_offset = 0; + send_status_temp.send_end_size = 20; + recive_data_global.send_status_list.push_back(send_status_temp); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_END; + send_status_temp.send_offset = 20; + send_status_temp.send_end_size = 20; + recive_data_global.send_status_list.push_back(send_status_temp); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_CONTINUE; + send_status_temp.send_offset = 40; + send_status_temp.send_end_size = 10; + send_status_temp.send_rest_size = 11; + recive_data_global.send_status_list.push_back(send_status_temp); + + memcpy(request.c_array(), "12345678901POST / HTTP/1.0\r\nContent-Length: 20\r\n\r\n", REQUEST_BUFFER_SIZE); + request_len = REQUEST_BUFFER_SIZE; + + ret = handle_client_recv(boost::this_thread::get_id(), request, request_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_CONNECT); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 2u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_NO_EDIT); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 11u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->edit_division, EDIT_DIVISION_EDIT); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_rest_size, 20u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_possible_size, 39u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_offset, 11u); + + cout << "[100]--------------------------------------------- " << endl; + // unit_test[100] 送信状態リストの要素の送信状態が1:送信済 2:送信済 3:送信不可の場合 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 40; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_END; + send_status_temp.send_offset = 0; + send_status_temp.send_end_size = 20; + recive_data_global.send_status_list.push_back(send_status_temp); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_END; + send_status_temp.send_offset = 20; + send_status_temp.send_end_size = 20; + recive_data_global.send_status_list.push_back(send_status_temp); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_NG; + send_status_temp.send_offset = 40; + send_status_temp.unsend_size = 10; + recive_data_global.send_status_list.push_back(send_status_temp); + //未送信データを生成する + memcpy(recive_data_global.recive_buffer + 40, "GET / HTTP/", 10); + + memcpy(request.c_array(), "/1.0\r\nCookie: monkey=12345678901234567890123456789", REQUEST_BUFFER_SIZE); + request_len = REQUEST_BUFFER_SIZE; + + ret = handle_client_recv(boost::this_thread::get_id(), request, request_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_RECV); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_NO_EDIT); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 60u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + + cout << "[101]--------------------------------------------- " << endl; + // unit_test[101] 送信状態リストの要素の送信状態が1:送信済 2:送信不可の場合 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 40; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_END; + send_status_temp.send_offset = 0; + send_status_temp.send_end_size = 40; + recive_data_global.send_status_list.push_back(send_status_temp); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_NG; + send_status_temp.send_offset = 40; + send_status_temp.unsend_size = 10; + recive_data_global.send_status_list.push_back(send_status_temp); + //未送信データを生成する + memcpy(recive_data_global.recive_buffer + 40, "GET / HTTP/", 10); + + memcpy(request.c_array(), "/1.0\r\nCookie: monkey=12345678901234567890123456789", REQUEST_BUFFER_SIZE); + request_len = REQUEST_BUFFER_SIZE; + + ret = handle_client_recv(boost::this_thread::get_id(), request, request_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_RECV); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_NO_EDIT); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 60u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + + cout << "[102]--------------------------------------------- " << endl; + // unit_test[102] 送信状態リストの要素の送信状態が1:送信済 2:送信継続の場合 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 40; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_END; + send_status_temp.send_offset = 0; + send_status_temp.send_end_size = 40; + recive_data_global.send_status_list.push_back(send_status_temp); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_CONTINUE; + send_status_temp.send_offset = 40; + send_status_temp.send_end_size = 10; + send_status_temp.send_rest_size = 11; + recive_data_global.send_status_list.push_back(send_status_temp); + + memcpy(request.c_array(), "12345678901POST / HTTP/1.0\r\nContent-Length: 20\r\n\r\n", REQUEST_BUFFER_SIZE); + request_len = REQUEST_BUFFER_SIZE; + + ret = handle_client_recv(boost::this_thread::get_id(), request, request_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_CONNECT); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 2u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_NO_EDIT); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 11u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->edit_division, EDIT_DIVISION_EDIT); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_rest_size, 20u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_possible_size, 39u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_offset, 11u); + + cout << "[103]--------------------------------------------- " << endl; + // unit_test[103] 送信状態リストの要素の送信状態が1:送信済 2:送信済の場合 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 10; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_END; + send_status_temp.send_offset = 0; + send_status_temp.send_end_size = 40; + recive_data_global.send_status_list.push_back(send_status_temp); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_END; + send_status_temp.send_offset = 40; + send_status_temp.send_end_size = 40; + recive_data_global.send_status_list.push_back(send_status_temp); + + memcpy(request.c_array(), "POST / HTTP/1.0\r\nContent-Length: 11\r\n\r\n12345678901", REQUEST_BUFFER_SIZE); + request_len = REQUEST_BUFFER_SIZE; + + ret = handle_client_recv(boost::this_thread::get_id(), request, request_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_CONNECT); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_EDIT); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 50u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + + cout << "[104]--------------------------------------------- " << endl; + // unit_test[104] 送信状態リストの要素の送信状態が1:送信不可の場合 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 40; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_NG; + send_status_temp.send_offset = 10; + send_status_temp.unsend_size = 10; + recive_data_global.send_status_list.push_back(send_status_temp); + //未送信データを生成する + memcpy(recive_data_global.recive_buffer + 10, "GET / HTTP/", 10); + + memcpy(request.c_array(), "/1.0\r\nCookie: monkey=1234567890123456789012345\r\n\r\n", REQUEST_BUFFER_SIZE); + request_len = REQUEST_BUFFER_SIZE; + + ret = handle_client_recv(boost::this_thread::get_id(), request, request_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_CONNECT); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_EDIT); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 60u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + + cout << "[105]--------------------------------------------- " << endl; + // unit_test[105] 送信状態リストの要素の送信状態が1:送信継続の場合 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 12; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_CONTINUE; + send_status_temp.send_offset = 40; + send_status_temp.send_end_size = 38; + send_status_temp.send_rest_size = 20; + + recive_data_global.send_status_list.push_back(send_status_temp); + //未送信データを生成する + memcpy(recive_data_global.recive_buffer + 40, "GET / HTTP/1.0\r\nContent-Length: 20\r\n\r\n", 38); + + memcpy(request.c_array(), "12345678901234567890POST / HTTP/1.0\r\nContent-Lengt", REQUEST_BUFFER_SIZE); + request_len = REQUEST_BUFFER_SIZE; + + ret = handle_client_recv(boost::this_thread::get_id(), request, request_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_CONNECT); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 2u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_NO_EDIT); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 20u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 0u); + + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->edit_division, EDIT_DIVISION_NO_EDIT); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_offset, 20u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->unsend_size, 30u); + + cout << "[106]--------------------------------------------- " << endl; + // unit_test[106] 送信状態リストの要素の送信状態が1:送信済の場合 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 10; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_END; + send_status_temp.send_offset = 0; + send_status_temp.send_end_size = 80; + recive_data_global.send_status_list.push_back(send_status_temp); + + memcpy(request.c_array(), "POST / HTTP/1.0\r\nContent-Length: 11\r\n\r\n12345678901", REQUEST_BUFFER_SIZE); + request_len = REQUEST_BUFFER_SIZE; + + ret = handle_client_recv(boost::this_thread::get_id(), request, request_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_CONNECT); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_EDIT); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 50u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + + cout << "[107]--------------------------------------------- " << endl; + // unit_test[107] 送信状態リストの要素数が0である場合 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 10; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + memcpy(request.c_array(), "POST / HTTP/1.0\r\nContent-Length: 11\r\n\r\n12345678901", REQUEST_BUFFER_SIZE); + request_len = REQUEST_BUFFER_SIZE; + + ret = handle_client_recv(boost::this_thread::get_id(), request, request_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_CONNECT); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_EDIT); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 50u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + + // unit_test_part2 begin: + cout << "[108]--------------------------------------------- " << endl; + // unit_test[108] データバッファ残サイズ < リクエストデータサイズ + // unit_test[108] ●データバッファMAXサイズ < 未送信データサイズ(0) + リクエストデータサイズ。 + // unit_test[108] ●メモリの内容をチェックする + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 80; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + memcpy(request.c_array(), "GET / HTTP/1.0\r\nHOST: 192.168.120.1\r\nCookie: " + "monkey=1\r\nContent-Length: 65455\r\n\r\n", 80); + memset(request.c_array() + 80, 'x', 65455); + request_len = MAX_BUFFER_SIZE; + + ret = handle_client_recv(boost::this_thread::get_id(), request, request_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_CONNECT); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer, recive_data_global.recive_buffer1); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_max_size, MAX_BUFFER_SIZE); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_rest_size, 0u); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + + //メモリの内容をチェックする + int cmp_ret = memcmp(request.c_array(), recive_data_global.recive_buffer, MAX_BUFFER_SIZE); + BOOST_CHECK_EQUAL(cmp_ret, 0); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_EDIT); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, MAX_BUFFER_SIZE); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 0u); + + cout << "[109]--------------------------------------------- " << endl; + // unit_test[109] データバッファ残サイズ < リクエストデータサイズ + // unit_test[109] ●データバッファMAXサイズ < 未送信データサイズ(0) + リクエストデータサイズ。 + // unit_test[109] ●データバッファ上限値 < 未送信データサイズ + リクエストデータサイズ + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 80; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_NG; + send_status_temp.send_offset = 10; + send_status_temp.unsend_size = MAX_SESSIONLESS_MODULE_BUFFER_SIZE; + recive_data_global.send_status_list.push_back(send_status_temp); + + memcpy(request.c_array(), "GET / HTTP/1.0\r\nHOST: 192.168.120.1\r\nCookie: " + "monkey=1\r\nContent-Length: 65455\r\n\r\n", 80); + memset(request.c_array() + 80, 'x', 65455); + request_len = MAX_BUFFER_SIZE; + + ret = handle_client_recv(boost::this_thread::get_id(), request, request_len); + + BOOST_CHECK_EQUAL(ret, FINALIZE); + + cout << "[110]--------------------------------------------- " << endl; + // unit_test[110] データバッファ残サイズ < リクエストデータサイズ + // unit_test[110] ●データバッファMAXサイズ < 未送信データサイズ(20) + リクエストデータサイズ。 + // unit_test[110] ●メモリの内容をチェックする + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 70; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_NG; + send_status_temp.send_offset = 0; + send_status_temp.send_end_size = 0; + send_status_temp.unsend_size = 20; + recive_data_global.send_status_list.push_back(send_status_temp); + + //未送信データ + memcpy(recive_data_global.recive_buffer, "GET / HTTP/1.0\r\nCook", 20); + + //リクエストデータ + memcpy(request.c_array(), "ie: monkey=", 11); + memset(request.c_array(), 'x', MAX_BUFFER_SIZE - 11); + request_len = MAX_BUFFER_SIZE; + + ret = handle_client_recv(boost::this_thread::get_id(), request, request_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_RECV); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer, recive_data_global.recive_buffer1); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_max_size, MAX_BUFFER_SIZE + 20); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_rest_size, 0u); + + //メモリの内容をチェックする + cmp_ret = memcmp(recive_data_global.recive_buffer, "GET / HTTP/1.0\r\nCook", 20); + BOOST_CHECK_EQUAL(cmp_ret, 0); + cmp_ret = memcmp(recive_data_global.recive_buffer + 20, request.c_array(), MAX_BUFFER_SIZE); + BOOST_CHECK_EQUAL(cmp_ret, 0); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_NO_EDIT); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, MAX_BUFFER_SIZE + 20); + + cout << "[111]--------------------------------------------- " << endl; + // unit_test[111] データバッファ残サイズ < リクエストデータサイズ + // unit_test[111] ●使用中データバッファがデータバッファ1の場合、データバッファMAXサイズ > 未送信データサイズ(0) + リクエストデータサイズ。 + // unit_test[111] ●メモリの内容をチェックする + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 70; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + memcpy(request.c_array(), "GET / HTTP/1.0\r\nCookie: monkey=12345678901234567890123456789012345678901", 72); + request_len = 72; + + ret = handle_client_recv(boost::this_thread::get_id(), request, request_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_RECV); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_max_size, USE_BUFFER_SIZE); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_rest_size, 18u); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer, recive_data_global.recive_buffer2); + //メモリの内容をチェックする + cmp_ret = memcmp(recive_data_global.recive_buffer, request.c_array(), 72); + BOOST_CHECK_EQUAL(cmp_ret, 0); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_NO_EDIT); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 72u); + + cout << "[112]--------------------------------------------- " << endl; + // unit_test[112] データバッファ残サイズ < リクエストデータサイズ + // unit_test[112] ●使用中データバッファがデータバッファ1の場合、データバッファMAXサイズ = 未送信データサイズ(0) + リクエストデータサイズ。 + // unit_test[112] ●メモリの内容をチェックする + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 70; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + memcpy(request.c_array(), "GET / HTTP/1.0\r\nCookie: monkey=12345678901234567890123456789012345678901234567890123456789", 90); + request_len = 90; + + ret = handle_client_recv(boost::this_thread::get_id(), request, request_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_RECV); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_max_size, USE_BUFFER_SIZE); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer, recive_data_global.recive_buffer2); + //メモリの内容をチェックする + cmp_ret = memcmp(recive_data_global.recive_buffer, request.c_array(), 90); + BOOST_CHECK_EQUAL(cmp_ret, 0); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_NO_EDIT); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 90u); + + cout << "[113]--------------------------------------------- " << endl; + // unit_test[113] データバッファ残サイズ < リクエストデータサイズ + // unit_test[113] ●使用中データバッファがデータバッファ1の場合、データバッファMAXサイズ > 未送信データサイズ(20) + リクエストデータサイズ。 + // unit_test[113] ●メモリの内容をチェックする + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 50; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_NG; + send_status_temp.send_offset = 20; + send_status_temp.unsend_size = 20; + recive_data_global.send_status_list.push_back(send_status_temp); + + //未送信データ + memcpy(recive_data_global.recive_buffer + 20, "GET / HTTP/1.0\r\nCook", 20); + + //リクエストデータ + memcpy(request.c_array(), "ie: monkey=12345678901234567890123456789012345678901", 52); + request_len = 52; + + ret = handle_client_recv(boost::this_thread::get_id(), request, request_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_RECV); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_max_size, USE_BUFFER_SIZE); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_rest_size, 18u); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer, recive_data_global.recive_buffer2); + + //メモリの内容をチェックする + cmp_ret = memcmp(recive_data_global.recive_buffer, "GET / HTTP/1.0\r\nCook", 20); + BOOST_CHECK_EQUAL(cmp_ret, 0); + cmp_ret = memcmp(recive_data_global.recive_buffer + 20, request.c_array(), 52); + BOOST_CHECK_EQUAL(cmp_ret, 0); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_NO_EDIT); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 72u); + + cout << "[114]--------------------------------------------- " << endl; + // unit_test[114] データバッファ残サイズ < リクエストデータサイズ + // unit_test[114] ●使用中データバッファがデータバッファ1の場合、データバッファMAXサイズ = 未送信データサイズ(20) + リクエストデータサイズ。 + // unit_test[114] ●メモリの内容をチェックする + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 50; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_NG; + send_status_temp.send_offset = 20; + send_status_temp.unsend_size = 20; + recive_data_global.send_status_list.push_back(send_status_temp); + + //未送信データ + memcpy(recive_data_global.recive_buffer + 20, "GET / HTTP/1.0\r\nCook", 20); + + //リクエストデータ + memcpy(request.c_array(), "ie: monkey=12345678901234567890123456789012345678901234567890123456789", 70); + request_len = 70; + + ret = handle_client_recv(boost::this_thread::get_id(), request, request_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_RECV); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_max_size, USE_BUFFER_SIZE); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer, recive_data_global.recive_buffer2); + + //メモリの内容をチェックする + cmp_ret = memcmp(recive_data_global.recive_buffer, "GET / HTTP/1.0\r\nCook", 20); + BOOST_CHECK_EQUAL(cmp_ret, 0); + cmp_ret = memcmp(recive_data_global.recive_buffer + 20, request.c_array(), 70); + BOOST_CHECK_EQUAL(cmp_ret, 0); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_NO_EDIT); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 90u); + + cout << "[115]--------------------------------------------- " << endl; + // unit_test[115] データバッファ残サイズ < リクエストデータサイズ + // unit_test[115] ●使用中データバッファがデータバッファ2の場合、データバッファMAXサイズ > 未送信データサイズ(0) + リクエストデータサイズ。 + // unit_test[115] ●メモリの内容をチェックする + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 70; + recive_data_global.recive_buffer = recive_data_global.recive_buffer2; + recive_data_global.send_status_list.clear(); + + memcpy(request.c_array(), "GET / HTTP/1.0\r\nCookie: monkey=12345678901234567890123456789012345678901", 72); + request_len = 72; + + ret = handle_client_recv(boost::this_thread::get_id(), request, request_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_RECV); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_max_size, USE_BUFFER_SIZE); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_rest_size, 18u); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer, recive_data_global.recive_buffer1); + + //メモリの内容をチェックする + cmp_ret = memcmp(recive_data_global.recive_buffer, request.c_array(), 72); + BOOST_CHECK_EQUAL(cmp_ret, 0); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_NO_EDIT); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 72u); + + cout << "[116]--------------------------------------------- " << endl; + // unit_test[116] データバッファ残サイズ < リクエストデータサイズ + // unit_test[116] ●使用中データバッファがデータバッファ2の場合、データバッファMAXサイズ = 未送信データサイズ(0) + リクエストデータサイズ。 + // unit_test[116] ●メモリの内容をチェックする + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 70; + recive_data_global.recive_buffer = recive_data_global.recive_buffer2; + recive_data_global.send_status_list.clear(); + + memcpy(request.c_array(), + "GET / HTTP/1.0\r\nCookie: monkey=12345678901234567890123456789012345678901234567890123456789", 90); + request_len = 90; + + ret = handle_client_recv(boost::this_thread::get_id(), request, request_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_RECV); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_max_size, USE_BUFFER_SIZE); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer, recive_data_global.recive_buffer1); + + //メモリの内容をチェックする + cmp_ret = memcmp(recive_data_global.recive_buffer, request.c_array(), 90); + BOOST_CHECK_EQUAL(cmp_ret, 0); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_NO_EDIT); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 90u); + + cout << "[117]--------------------------------------------- " << endl; + // unit_test[117] データバッファ残サイズ < リクエストデータサイズ + // unit_test[117] ●使用中データバッファがデータバッファ2の場合、データバッファMAXサイズ > 未送信データサイズ(20) + リクエストデータサイズ。 + // unit_test[117] ●メモリの内容をチェックする + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 50; + recive_data_global.recive_buffer = recive_data_global.recive_buffer2; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_NG; + send_status_temp.send_offset = 20; + send_status_temp.unsend_size = 20; + recive_data_global.send_status_list.push_back(send_status_temp); + + //未送信データ + memcpy(recive_data_global.recive_buffer + 20, "GET / HTTP/1.0\r\nCook", 20); + + //リクエストデータ + memcpy(request.c_array(), "ie: monkey=12345678901234567890123456789012345678901", 52); + request_len = 52; + + ret = handle_client_recv(boost::this_thread::get_id(), request, request_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_RECV); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_max_size, USE_BUFFER_SIZE); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_rest_size, 18u); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer, recive_data_global.recive_buffer1); + + //メモリの内容をチェックする + cmp_ret = memcmp(recive_data_global.recive_buffer, "GET / HTTP/1.0\r\nCook", 20); + BOOST_CHECK_EQUAL(cmp_ret, 0); + cmp_ret = memcmp(recive_data_global.recive_buffer + 20, request.c_array(), 52); + BOOST_CHECK_EQUAL(cmp_ret, 0); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_NO_EDIT); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 72u); + + cout << "[118]--------------------------------------------- " << endl; + // unit_test[118] データバッファ残サイズ < リクエストデータサイズ + // unit_test[118] ●使用中データバッファがデータバッファ2の場合、データバッファMAXサイズ = 未送信データサイズ(20) + リクエストデータサイズ。 + // unit_test[118] ●メモリの内容をチェックする + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 50; + recive_data_global.recive_buffer = recive_data_global.recive_buffer2; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_NG; + send_status_temp.send_offset = 20; + send_status_temp.unsend_size = 20; + recive_data_global.send_status_list.push_back(send_status_temp); + + //未送信データ + memcpy(recive_data_global.recive_buffer + 20, "GET / HTTP/1.0\r\nCook", 20); + + //リクエストデータ + memcpy(request.c_array(), "ie: monkey=12345678901234567890123456789012345678901234567890123456789", 70); + request_len = 70; + + ret = handle_client_recv(boost::this_thread::get_id(), request, request_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_RECV); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_max_size, USE_BUFFER_SIZE); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer, recive_data_global.recive_buffer1); + + //メモリの内容をチェックする + cmp_ret = memcmp(recive_data_global.recive_buffer, "GET / HTTP/1.0\r\nCook", 20); + BOOST_CHECK_EQUAL(cmp_ret, 0); + cmp_ret = memcmp(recive_data_global.recive_buffer + 20, request.c_array(), 70); + BOOST_CHECK_EQUAL(cmp_ret, 0); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_NO_EDIT); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 90u); + + cout << "[119]--------------------------------------------- " << endl; + // unit_test[119] データバッファ残サイズ > リクエストデータサイズ + // unit_test[119] ●メモリの内容をチェックする + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 70; + recive_data_global.recive_buffer = recive_data_global.recive_buffer2; + recive_data_global.send_status_list.clear(); + + memcpy(request.c_array(), "GET / HTTP/1.0\r\nCookie: monkey=1234567890123456789012345678901", 62); + request_len = 62; + + ret = handle_client_recv(boost::this_thread::get_id(), request, request_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_RECV); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_max_size, USE_BUFFER_SIZE); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_rest_size, 8u); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer, recive_data_global.recive_buffer2); + + //メモリの内容をチェックする + cmp_ret = memcmp(recive_data_global.recive_buffer + 20, request.c_array(), 62); + BOOST_CHECK_EQUAL(cmp_ret, 0); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_NO_EDIT); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 20u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 62u); + + cout << "[120]--------------------------------------------- " << endl; + // unit_test[120] データバッファ残サイズ = リクエストデータサイズ + // unit_test[120] ●メモリの内容をチェックする + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 70; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + memcpy(request.c_array(), "GET / HTTP/1.0\r\nCookie: monkey=123456789012345678901234567890123456789", 70); + request_len = 70; + + ret = handle_client_recv(boost::this_thread::get_id(), request, request_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_RECV); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_max_size, USE_BUFFER_SIZE); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer, recive_data_global.recive_buffer1); + + //メモリの内容をチェックする + cmp_ret = memcmp(recive_data_global.recive_buffer + 20, request.c_array(), 70); + BOOST_CHECK_EQUAL(cmp_ret, 0); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_NO_EDIT); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 20u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 70u); + + // unit_test_part3 begin: + cout << "[121]--------------------------------------------- " << endl; + // unit_test[121] 送信状態リストの要素の送信状態が送信継続 + // unit_test[121] ●送信データ残サイズ < リクエストデータ残サイズ + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 11; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_CONTINUE; + send_status_temp.send_offset = 40; + send_status_temp.send_end_size = 39; + send_status_temp.send_rest_size = 20; + recive_data_global.send_status_list.push_back(send_status_temp); + //未送信データを生成する + memcpy(recive_data_global.recive_buffer + 40, "POST / HTTP/1.0\r\nContent-Length: 20\r\n\r\n", 39); + + memcpy(request.c_array(), "12345678901234567890POST / HTTP/1.0\r\nContent-Lengt", REQUEST_BUFFER_SIZE); + request_len = REQUEST_BUFFER_SIZE; + + ret = handle_client_recv(boost::this_thread::get_id(), request, request_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_CONNECT); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 2u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_NO_EDIT); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 20u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->edit_division, EDIT_DIVISION_NO_EDIT); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_offset, 20u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->unsend_size, 30u); + + cout << "[122]--------------------------------------------- " << endl; + // unit_test[122] 送信状態リストの要素の送信状態が送信継続 + // unit_test[122] ●送信データ残サイズ = リクエストデータ残サイズ + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 11; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_CONTINUE; + send_status_temp.send_offset = 40; + send_status_temp.send_end_size = 39; + send_status_temp.send_rest_size = 50; + recive_data_global.send_status_list.push_back(send_status_temp); + //未送信データを生成する + memcpy(recive_data_global.recive_buffer + 40, "POST / HTTP/1.0\r\nContent-Length: 50\r\n\r\n", 39); + + memcpy(request.c_array(), "12345678901234567890123456789012345678901234567890", REQUEST_BUFFER_SIZE); + request_len = REQUEST_BUFFER_SIZE; + + ret = handle_client_recv(boost::this_thread::get_id(), request, request_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_CONNECT); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_NO_EDIT); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 50u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + + cout << "[123]--------------------------------------------- " << endl; + // unit_test[123] 送信状態リストの要素の送信状態が送信継続 + // unit_test[123] ●送信データ残サイズ > リクエストデータ残サイズ + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 11; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_CONTINUE; + send_status_temp.send_offset = 40; + send_status_temp.send_end_size = 39; + send_status_temp.send_rest_size = 80; + recive_data_global.send_status_list.push_back(send_status_temp); + // 未送信データを生成する + memcpy(recive_data_global.recive_buffer + 40, "POST / HTTP/1.0\r\nContent-Length: 80\r\n\r\n", 39); + + memcpy(request.c_array(), "12345678901234567890123456789012345678901234567890", REQUEST_BUFFER_SIZE); + request_len = REQUEST_BUFFER_SIZE; + + ret = handle_client_recv(boost::this_thread::get_id(), request, request_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_CONNECT); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_NO_EDIT); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 30u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 50u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + + cout << "[124]--------------------------------------------- " << endl; + // unit_test[124] 送信状態が送信不可の場合 + // unit_test[124] ●HTTPメソッドの妥当性をチェックして、チェック不可の場合 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 0; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_NG; + send_status_temp.send_offset = 89; + send_status_temp.unsend_size = 1; + recive_data_global.send_status_list.push_back(send_status_temp); + //未送信データを生成する + recive_data_global.recive_buffer[89] = 'P'; + + memcpy(request.c_array(), "OST /HTTP ", 10); + request_len = 10; + + ret = handle_client_recv(boost::this_thread::get_id(), request, request_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_RECV); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 11u); + + cout << "[125]--------------------------------------------- " << endl; + // unit_test[125] 送信状態が送信不可の場合 + // unit_test[125] ●HTTPメソッドの妥当性をチェックして、チェック異常の場合 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 0; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_NG; + send_status_temp.send_offset = 89; + send_status_temp.unsend_size = 1; + recive_data_global.send_status_list.push_back(send_status_temp); + //未送信データを生成する + recive_data_global.recive_buffer[89] = 'P'; + + memcpy(request.c_array(), "EST / HTTP/1.0\r\n4567890123456789012345678901234567", REQUEST_BUFFER_SIZE); + request_len = REQUEST_BUFFER_SIZE; + + ret = handle_client_recv(boost::this_thread::get_id(), request, request_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_CONNECT); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 51u); + + cout << "[126]--------------------------------------------- " << endl; + // unit_test[126] 送信状態が送信不可の場合 + // unit_test[126] ●HTTPバージョンの妥当性をチェックして、異常の場合 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 0; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_NG; + send_status_temp.send_offset = 89; + send_status_temp.unsend_size = 1; + recive_data_global.send_status_list.push_back(send_status_temp); + //未送信データを生成する + recive_data_global.recive_buffer[89] = 'P'; + + memcpy(request.c_array(), "OST / HTTP/1.2234\r\n7890123456789012345678901234567", REQUEST_BUFFER_SIZE); + request_len = REQUEST_BUFFER_SIZE; + + ret = handle_client_recv(boost::this_thread::get_id(), request, request_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_CONNECT); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 51u); + + cout << "[127]--------------------------------------------- " << endl; + // unit_test[127] 送信状態が送信不可の場合 + // unit_test[127] ●HTTPバージョンの妥当性をチェックして、チェック不可の場合 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 0; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_NG; + send_status_temp.send_offset = 89; + send_status_temp.unsend_size = 1; + recive_data_global.send_status_list.push_back(send_status_temp); + //未送信データを生成する + recive_data_global.recive_buffer[89] = 'P'; + + memcpy(request.c_array(), "OST / HTT", 10); + request_len = 10; + + ret = handle_client_recv(boost::this_thread::get_id(), request, request_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_RECV); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 11u); + + cout << "[128]--------------------------------------------- " << endl; + // unit_test[128] 送信状態が送信不可の場合 + // unit_test[128] ●HTTPヘッダの妥当性をチェックして、不可の場合 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 0; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + send_status_temp.status = SEND_NG; + send_status_temp.send_offset = 89; + send_status_temp.unsend_size = 1; + recive_data_global.send_status_list.push_back(send_status_temp); + //未送信データを生成する + recive_data_global.recive_buffer[89] = 'P'; + + memcpy(request.c_array(), "OST / HTTP/1.0\r\nCookie: monkey=1111111111111111111", REQUEST_BUFFER_SIZE); + request_len = REQUEST_BUFFER_SIZE; + + ret = handle_client_recv(boost::this_thread::get_id(), request, request_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_RECV); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 51u); + + cout << "[129]--------------------------------------------- " << endl; + // unit_test[129] 送信状態が送信不可の場合 + // unit_test[129] ●HTTPヘッダ(ContentLength)があり + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 0; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + send_status_temp.status = SEND_NG; + send_status_temp.send_offset = 89; + send_status_temp.unsend_size = 1; + recive_data_global.send_status_list.push_back(send_status_temp); + //未送信データを生成する + recive_data_global.recive_buffer[89] = 'P'; + + memcpy(request.c_array(), "OST / HTTP/1.0\r\nContent-Length: 15\r\n\r\n123456789012", REQUEST_BUFFER_SIZE); + request_len = REQUEST_BUFFER_SIZE; + + ret = handle_client_recv(boost::this_thread::get_id(), request, request_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_CONNECT); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 3u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 51u); + + cout << "[130]--------------------------------------------- " << endl; + // unit_test[130] 送信状態が送信不可の場合 + // unit_test[130] ●HTTPヘッダ(ContentLength)なし + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 0; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + send_status_temp.status = SEND_NG; + send_status_temp.send_offset = 89; + send_status_temp.unsend_size = 1; + recive_data_global.send_status_list.push_back(send_status_temp); + //未送信データを生成する + recive_data_global.recive_buffer[89] = 'P'; + + memcpy(request.c_array(), "OST / HTTP/1.0\r\nCookie: monkey=111111111111111\r\n\r\n", REQUEST_BUFFER_SIZE); + request_len = REQUEST_BUFFER_SIZE; + + ret = handle_client_recv(boost::this_thread::get_id(), request, request_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_CONNECT); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 51u); + + cout << "[131]--------------------------------------------- " << endl; + // unit_test[131] 送信状態が送信不可の場合 + // unit_test[131] ●送信データ残サイズ > 未送信データサイズ + リクエストデータ残サイズ + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 70; + recive_data_global.recive_buffer = recive_data_global.recive_buffer2; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_NG; + send_status_temp.send_offset = 0; + send_status_temp.unsend_size = 20; + recive_data_global.send_status_list.push_back(send_status_temp); + + //未送信データ + memcpy(recive_data_global.recive_buffer, "GET / HTTP/1.0\r\nCook", 20); + + //リクエストデータ + memcpy(request.c_array(), "ie: monkey=123456789012345678901\r\n\r\nGET ", 40); + request_len = 40; + + ret = handle_client_recv(boost::this_thread::get_id(), request, request_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_CONNECT); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_max_size, USE_BUFFER_SIZE); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_rest_size, 30u); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 2u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_EDIT); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 56u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->edit_division, EDIT_DIVISION_NO_EDIT); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_offset, 56u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->unsend_size, 4u); + + cout << "[132]--------------------------------------------- " << endl; + // unit_test[132] 送信状態が送信不可の場合 + // unit_test[132] ●送信データ残サイズ < 未送信データサイズ + リクエストデータ残サイズ + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 70; + recive_data_global.recive_buffer = recive_data_global.recive_buffer2; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_NG; + send_status_temp.send_offset = 0; + send_status_temp.unsend_size = 20; + recive_data_global.send_status_list.push_back(send_status_temp); + + //未送信データ + memcpy(recive_data_global.recive_buffer, "POST / HTTP/1.0\r\nCoo", 20); + + //リクエストデータ + memcpy(request.c_array(), "kie: monkey=123\r\nContent-Length: 100\r\n\r\n0123456789", 50); + request_len = 50; + + ret = handle_client_recv(boost::this_thread::get_id(), request, request_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_CONNECT); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_max_size, USE_BUFFER_SIZE); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_rest_size, 20u); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_EDIT); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 90u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 70u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 0u); + + cout << "[133]--------------------------------------------- " << endl; + // unit_test[133] 送信状態が送信不可の場合 + // unit_test[133] ●送信データ残サイズ = 未送信データサイズ + リクエストデータ残サイズ + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 70; + recive_data_global.recive_buffer = recive_data_global.recive_buffer2; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_NG; + send_status_temp.send_offset = 0; + send_status_temp.unsend_size = 20; + recive_data_global.send_status_list.push_back(send_status_temp); + + //未送信データ + memcpy(recive_data_global.recive_buffer, "POST / HTTP/1.0\r\nCoo", 20); + + //リクエストデータ + memcpy(request.c_array(), "kie: monkey=123\r\nContent-Length: 11\r\n\r\n01234567890", 50); + request_len = 50; + + ret = handle_client_recv(boost::this_thread::get_id(), request, request_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_CONNECT); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_max_size, USE_BUFFER_SIZE); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_rest_size, 20u); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_EDIT); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 70u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 0u); + + cout << "[134]--------------------------------------------- " << endl; + // unit_test[134] リクエストデータ残サイズ < 0 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 70; + recive_data_global.recive_buffer = recive_data_global.recive_buffer2; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_NG; + send_status_temp.send_offset = 0; + send_status_temp.unsend_size = 20; + recive_data_global.send_status_list.push_back(send_status_temp); + + //未送信データ + memcpy(recive_data_global.recive_buffer, "GET / HTTP/1.0\r\nCook", 20); + + //リクエストデータ + memcpy(request.c_array(), "ie: monkey=123456789012345678901\r\n\r\nGET ", 40); + request_len = 40; + + ret = handle_client_recv(boost::this_thread::get_id(), request, request_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_CONNECT); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_max_size, USE_BUFFER_SIZE); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_rest_size, 30u); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 2u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_EDIT); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 56u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->edit_division, EDIT_DIVISION_NO_EDIT); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_offset, 56u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->unsend_size, 4u); + + cout << "[135]--------------------------------------------- " << endl; + // unit_test[135] リクエストデータ残サイズ = 0 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 70; + recive_data_global.recive_buffer = recive_data_global.recive_buffer2; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_NG; + send_status_temp.send_offset = 0; + send_status_temp.unsend_size = 20; + recive_data_global.send_status_list.push_back(send_status_temp); + + //未送信データ + memcpy(recive_data_global.recive_buffer, "POST / HTTP/1.0\r\nCoo", 20); + + //リクエストデータ + memcpy(request.c_array(), "kie: monkey=123\r\nContent-Length: 11\r\n\r\n01234567890", 50); + request_len = 50; + + ret = handle_client_recv(boost::this_thread::get_id(), request, request_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_CONNECT); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_max_size, USE_BUFFER_SIZE); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_rest_size, 20u); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_EDIT); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 70u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 0u); + + // unit_test_part4 begin: + cout << "[136]--------------------------------------------- " << endl; + // unit_test[136] リクエストデータ残サイズ > 0 + // unit_test[136] ●HTTPメソッドの妥当性をチェックして、チェック不可の場合 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = USE_BUFFER_SIZE; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + psession_thread_data->sorry_flag = SORRY_FLAG_OFF; + + memcpy(request.c_array(), "GET / HTTP/1.0\r\nContent-Length: 10\r\n\r\n1234567890GE", REQUEST_BUFFER_SIZE); + request_len = REQUEST_BUFFER_SIZE; + + ret = handle_client_recv(boost::this_thread::get_id(), request, request_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_CONNECT); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 2u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_EDIT); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 48u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 0u); + + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->edit_division, EDIT_DIVISION_NO_EDIT); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_offset, 48u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->unsend_size, 2u); + + cout << "[137]--------------------------------------------- " << endl; + // unit_test[137] リクエストデータ残サイズ > 0 + // unit_test[137] ●HTTPメソッドの妥当性をチェックして、異常の場合 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = USE_BUFFER_SIZE; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + memcpy(request.c_array(), "EST / HTTP/1.0\r\n4567890123456789012345678901234567", REQUEST_BUFFER_SIZE); + request_len = REQUEST_BUFFER_SIZE; + + ret = handle_client_recv(boost::this_thread::get_id(), request, request_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_CONNECT); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 50u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_NO_EDIT); + + cout << "[138]--------------------------------------------- " << endl; + // unit_test[138] リクエストデータ残サイズ > 0 + // unit_test[138] ●HTTPバージョンの妥当性をチェックして、不可の場合 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = USE_BUFFER_SIZE; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + psession_thread_data->sorry_flag = SORRY_FLAG_OFF; + + memcpy(request.c_array(), "GET / HTTP/1.0\r\nContent-Length: 10\r\n\r\n1234567890GE", REQUEST_BUFFER_SIZE); + request_len = REQUEST_BUFFER_SIZE; + + ret = handle_client_recv(boost::this_thread::get_id(), request, request_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_CONNECT); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 2u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_EDIT); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 48u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 0u); + + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->edit_division, EDIT_DIVISION_NO_EDIT); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_offset, 48u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->unsend_size, 2u); + + cout << "[139]--------------------------------------------- " << endl; + // unit_test[139] リクエストデータ残サイズ > 0 + // unit_test[139] ●HTTPバージョンの妥当性をチェックして、異常の場合 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + memcpy(request.c_array(), "GET / HTTP/1.22\r\n567890123456789012345678901234567", REQUEST_BUFFER_SIZE); + request_len = REQUEST_BUFFER_SIZE; + + ret = handle_client_recv(boost::this_thread::get_id(), request, request_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_CONNECT); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 50u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_NO_EDIT); + + cout << "[140]--------------------------------------------- " << endl; + // unit_test[140] リクエストデータ残サイズ > 0 + // unit_test[140] ●HTTPヘッダの妥当性をチェックして、不可の場合 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + memcpy(request.c_array(), "GET / HTTP/1.0\r\nCookie: monkey=1111111111111111111", REQUEST_BUFFER_SIZE); + request_len = REQUEST_BUFFER_SIZE; + + ret = handle_client_recv(boost::this_thread::get_id(), request, request_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_RECV); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 50u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_NO_EDIT); + + cout << "[141]--------------------------------------------- " << endl; + // unit_test[141] リクエストデータ残サイズ > 0 + // unit_test[141] ●HTTPヘッダ(ContentLength)があり + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + memcpy(request.c_array(), "POST / HTTP/1.0\r\nContent-Length: 15\r\n\r\n12345678901", REQUEST_BUFFER_SIZE); + request_len = REQUEST_BUFFER_SIZE; + + ret = handle_client_recv(boost::this_thread::get_id(), request, request_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_CONNECT); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 4u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 50u); + + cout << "[142]--------------------------------------------- " << endl; + // unit_test[142] リクエストデータ残サイズ > 0 + // unit_test[142] ●HTTPヘッダ(ContentLength)なし + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 0; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + memcpy(request.c_array(), "GET / HTTP/1.0\r\nCookie: monkey=111111111111111\r\n\r\n", REQUEST_BUFFER_SIZE); + request_len = REQUEST_BUFFER_SIZE; + + ret = handle_client_recv(boost::this_thread::get_id(), request, request_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_CONNECT); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 50u); + + cout << "[143]--------------------------------------------- " << endl; + // unit_test[143] リクエストデータ残サイズ > 0 + // unit_test[143] ●送信データ残サイズ = リクエストデータ残サイズ + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 0; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + memcpy(request.c_array(), "GET / HTTP/1.0\r\nCookie: monkey=111111111111111\r\n\r\n", REQUEST_BUFFER_SIZE); + request_len = REQUEST_BUFFER_SIZE; + + ret = handle_client_recv(boost::this_thread::get_id(), request, request_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_CONNECT); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 50u); + + cout << "[144]--------------------------------------------- " << endl; + // unit_test[144] リクエストデータ残サイズ > 0 + // unit_test[144] ●送信データ残サイズ < リクエストデータ残サイズ + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 0; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + memcpy(request.c_array(), "POST / HTTP/1.0\r\nContent-Length: 0\r\n\r\nPOST / HTTP/", REQUEST_BUFFER_SIZE); + request_len = REQUEST_BUFFER_SIZE; + + ret = handle_client_recv(boost::this_thread::get_id(), request, request_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_CONNECT); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 2u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 38u); + + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_offset, 38u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->unsend_size, 12u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_possible_size, 0u); + + cout << "[145]--------------------------------------------- " << endl; + // unit_test[145] リクエストデータ残サイズ > 0 + // unit_test[145] ●送信データ残サイズ > リクエストデータ残サイズ + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + memcpy(request.c_array(), "GET / HTTP/1.0\r\nContent-Length: 20\r\n\r\n123456789012", REQUEST_BUFFER_SIZE); + request_len = REQUEST_BUFFER_SIZE; + + ret = handle_client_recv(boost::this_thread::get_id(), request, request_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_CONNECT); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_EDIT); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 8u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, REQUEST_BUFFER_SIZE); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + + cout << "[146]--------------------------------------------- " << endl; + // unit_test[146] リクエストデータ残サイズ > 0 + // unit_test[146] ●出力の送信状態リスト: 1:送信待 2:送信待 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 78; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_NG; + send_status_temp.send_offset = 0; + send_status_temp.send_end_size = 0; + send_status_temp.unsend_size = 12; + recive_data_global.send_status_list.push_back(send_status_temp); + + //未送信データ + memcpy(recive_data_global.recive_buffer, "GET / HTTP/1", 12); + + memcpy(request.c_array(), ".0\r\nCookie: m=1\r\n\r\nGET / HTTP/1.0\r\nCookie: m=1\r\n\r\n", 50); + request_len = 50; + + ret = handle_client_recv(boost::this_thread::get_id(), request, request_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_CONNECT); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 2u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_EDIT); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 31u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + + BOOST_CHECK_EQUAL((recive_data_global.send_status_list.rbegin())->status, SEND_OK); + BOOST_CHECK_EQUAL((recive_data_global.send_status_list.rbegin())->edit_division, EDIT_DIVISION_EDIT); + BOOST_CHECK_EQUAL((recive_data_global.send_status_list.rbegin())->send_rest_size, 0u); + BOOST_CHECK_EQUAL((recive_data_global.send_status_list.rbegin())->send_possible_size, 31u); + BOOST_CHECK_EQUAL((recive_data_global.send_status_list.rbegin())->send_offset, 31u); + + cout << "[147]--------------------------------------------- " << endl; + // unit_test[147] リクエストデータ残サイズ > 0 + // unit_test[147] ●出力の送信状態リスト: 1:送信待 2:送信不可 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = USE_BUFFER_SIZE; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + psession_thread_data->sorry_flag = SORRY_FLAG_OFF; + + memcpy(request.c_array(), "GET / HTTP/1.0\r\nContent-Length: 10\r\n\r\n1234567890GE", REQUEST_BUFFER_SIZE); + request_len = REQUEST_BUFFER_SIZE; + + ret = handle_client_recv(boost::this_thread::get_id(), request, request_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_CONNECT); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 2u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_EDIT); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 48u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 0u); + + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->edit_division, EDIT_DIVISION_NO_EDIT); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->unsend_size, 2u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_offset, 48u); + + cout << "[148]--------------------------------------------- " << endl; + // unit_test[148] リクエストデータ残サイズ > 0 + // unit_test[148] ●出力の送信状態リスト: 1:送信待 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + memcpy(request.c_array(), "POST / HTTP/1.0\r\nContent-Length: 15\r\n\r\n12345678901", REQUEST_BUFFER_SIZE); + request_len = REQUEST_BUFFER_SIZE; + + ret = handle_client_recv(boost::this_thread::get_id(), request, request_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_CONNECT); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 4u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 50u); + + cout << "[149]--------------------------------------------- " << endl; + // unit_test[149] リクエストデータ残サイズ > 0 + // unit_test[149] ●出力の送信状態リスト: 1:送信不可 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = USE_BUFFER_SIZE; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + memcpy(request.c_array(), "GET / HTTP/1.0\r\n4567890123456789012345678901234567", REQUEST_BUFFER_SIZE); + request_len = REQUEST_BUFFER_SIZE; + + ret = handle_client_recv(boost::this_thread::get_id(), request, request_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_RECV); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 50u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_NO_EDIT); + + cout << "[150]--------------------------------------------- " << endl; + // unit_test[150] 送信可能データがあり + // unit_test[150] ●SORRY状態の場合 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = USE_BUFFER_SIZE; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + psession_thread_data->sorry_flag = SORRY_FLAG_ON; + + memcpy(request.c_array(), "GET / HTTP/1.0\r\nHOST: KKKK\r\n\r\nGNT / HTTP/1.1\r\nHOST", REQUEST_BUFFER_SIZE); + request_len = REQUEST_BUFFER_SIZE; + + ret = handle_client_recv(boost::this_thread::get_id(), request, request_len); + + BOOST_CHECK_EQUAL(ret, SORRYSERVER_CONNECT); + psession_thread_data->sorry_flag = SORRY_FLAG_OFF; + + cout << "[151]--------------------------------------------- " << endl; + // unit_test[151] 送信可能データがあり + // unit_test[151] ●SORRY状態以外の場合 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = USE_BUFFER_SIZE; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + psession_thread_data->sorry_flag = SORRY_FLAG_OFF; + + memcpy(request.c_array(), "GET / HTTP/1.0\r\nHOST: KKKK\r\n\r\nGNT / HTTP/1.1\r\nHOST", REQUEST_BUFFER_SIZE); + request_len = REQUEST_BUFFER_SIZE; + + ret = handle_client_recv(boost::this_thread::get_id(), request, request_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_CONNECT); + psession_thread_data->sorry_flag = SORRY_FLAG_OFF; + + cout << "[152]--------------------------------------------- " << endl; + // unit_test[152] 送信可能データなし + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + memcpy(request.c_array(), "GET / HTTP/1.0\r\nCookie: monkey=1111111111111111111", REQUEST_BUFFER_SIZE); + request_len = REQUEST_BUFFER_SIZE; + + ret = handle_client_recv(boost::this_thread::get_id(), request, request_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_RECV); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_NO_EDIT); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 50u); +} + +//handle_client_recv_test_thread +void handle_client_recv_test_thread(){ + size_t request_len = USE_BUFFER_SIZE; + EVENT_TAG ret; + boost::array request; + send_status send_status_temp; + recive_data recive_data_tmp; + boost::thread down_thread(&down_thread_func); + boost::asio::ip::tcp::endpoint endpoint_local = string_to_endpoint("10.10.10.1:8080"); + thread_data_ptr psession_thread_data(new session_thread_data_sessionless); + init_session_thread_data_sessionless(psession_thread_data, down_thread.get_id()); + psession_thread_data->client_endpoint_tcp = endpoint_local; + + { + boost::mutex::scoped_lock sclock(this->session_thread_data_map_mutex); + this->session_thread_data_map[boost::this_thread::get_id()] = psession_thread_data; + this->forwarded_for = 1; + } + + init_recive_data(recive_data_tmp); + + psession_thread_data->recive_data_map[endpoint_local] = recive_data_tmp; + std::map::iterator it = + psession_thread_data->recive_data_map.find(endpoint_local); + recive_data& recive_data_global = it->second; + + cout << "[153]--------------------------------------------- " << endl; + // unit_test[153] リクエストデータ残サイズ > 0 + // unit_test[153] ●出力の送信状態リスト: 1:送信待 2:送信不可 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 78; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_NG; + send_status_temp.send_offset = 0; + send_status_temp.send_end_size = 0; + send_status_temp.unsend_size = 12; + recive_data_global.send_status_list.push_back(send_status_temp); + + //未送信データ + memcpy(recive_data_global.recive_buffer, "GET / HTTP/1", 12); + + memcpy(request.c_array(), ".0\r\nCookie: m=1\r\n\r\nGET / HTTP/1.0\r\nCookie: m=1\r\n\r", 49); + request_len = 49; + + ret = handle_client_recv(boost::this_thread::get_id(), request, request_len); + + { + boost::mutex::scoped_lock sclock(check_mutex); + BOOST_CHECK_EQUAL(ret, REALSERVER_CONNECT); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 2u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_EDIT); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 31u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + + BOOST_CHECK_EQUAL((recive_data_global.send_status_list.rbegin())->status, SEND_NG); + BOOST_CHECK_EQUAL((recive_data_global.send_status_list.rbegin())->edit_division, EDIT_DIVISION_NO_EDIT); + BOOST_CHECK_EQUAL((recive_data_global.send_status_list.rbegin())->send_rest_size, 0u); + BOOST_CHECK_EQUAL((recive_data_global.send_status_list.rbegin())->unsend_size, 30u); + BOOST_CHECK_EQUAL((recive_data_global.send_status_list.rbegin())->send_offset, 31u); + } +} + +//handle_realserver_select(tcp) 馮家純 +void handle_realserver_select_tcp_test(){ + EVENT_TAG ret; + + cout << "[154]--------------------------------------------- " << endl; + //unit_test[154] 異常系 functionがなし場合遷移先ステータスにFINALIZEを設定する + //register function + tcp_schedule_func_type func_err1 = NULL; + this->register_schedule(func_err1); + boost::asio::ip::tcp::endpoint ep_err1; + + ret = this->handle_realserver_select(boost::this_thread::get_id(), ep_err1); + + //遷移先ステータスを設定する status = FINALIZE + BOOST_CHECK_EQUAL(ret, FINALIZE); + + cout << "[155]--------------------------------------------- " << endl; + //unit_test[155] 異常系 session_thread_data_map中にThreadID対応のデータがない + this->session_thread_data_map.clear(); + //register function + tcp_schedule_func_type func_cerr2 = &schedule_tcp_determinate; + this->register_schedule(func_cerr2); + this->session_thread_data_map[boost::this_thread::get_id()].reset(); + boost::asio::ip::tcp::endpoint ep_err2; + ret = this->handle_realserver_select(boost::this_thread::get_id(), ep_err2); + + //遷移先ステータスを設定する status = FINALIZE + BOOST_CHECK_EQUAL(ret, FINALIZE); + + cout << "[156]--------------------------------------------- " << endl; + //unit_test[156] 異常系 session_thread_data_map中にThreadIDなし場合のテスト + this->session_thread_data_map.clear(); + ret = this->handle_realserver_select(boost::this_thread::get_id(), ep_err2); + + //遷移先ステータスを設定する status = FINALIZE + BOOST_CHECK_EQUAL(ret, FINALIZE); + + cout << "[157]--------------------------------------------- " << endl; + //unit_test[157] endpoint = 決定 rs endpointなし場合 + boost::thread down_thread1(down_thread_func); + thread_data_ptr dataup1(new session_thread_data_sessionless); + thread_data_ptr datadown1(new session_thread_data_sessionless); + this->session_thread_data_map[boost::this_thread::get_id()] = dataup1; + this->session_thread_data_map[down_thread1.get_id()] = datadown1; + dataup1->thread_division = THREAD_DIVISION_UP_STREAM; + dataup1->pair_thread_id = down_thread1.get_id(); + datadown1->thread_division = THREAD_DIVISION_DOWN_STREAM; + datadown1->pair_thread_id = boost::this_thread::get_id(); + datadown1->recive_data_map.clear(); + //register function + tcp_schedule_func_type func1 = &schedule_tcp_determinate; + + this->register_schedule(func1); + + boost::asio::ip::tcp::endpoint ep1; + ret = this->handle_realserver_select(boost::this_thread::get_id(), ep1); + + //endpoint = 決定 + BOOST_CHECK_EQUAL(ep1, string_to_endpoint ("10.10.10.10:8888")); + //遷移先ステータスを設定する status = FINALIZE + BOOST_CHECK_EQUAL(ret, FINALIZE); + + cout << "[158]--------------------------------------------- " << endl; + //unit_test[158] realserverが決定済みで、送信可能データがない場合、CLIENT_RECVを返す。 + this->session_thread_data_map.clear(); + boost::asio::ip::tcp::endpoint ep_1; + thread_data_ptr data_1(new session_thread_data_sessionless); + data_1->client_endpoint_tcp = ep_1; + data_1->recive_data_map[ep_1]; + this->session_thread_data_map[boost::this_thread::get_id()] = data_1; + + //register function + tcp_schedule_func_type func_1 = &schedule_tcp_determinate; + + this->register_schedule(func_1); + + ret = this->handle_realserver_select(boost::this_thread::get_id(), ep_1); + //endpoint = 決定 + BOOST_CHECK_EQUAL(ep_1, string_to_endpoint ("10.10.10.10:8888")); + //遷移先ステータスを設定する status = CLIENT_RECV + BOOST_CHECK_EQUAL(ret, CLIENT_RECV); + + cout << "[159]--------------------------------------------- " << endl; + //unit_test[159] realserverが決定済みで、送信可能データがある場合、REALSERVER_CONNECTを返す。 + this->session_thread_data_map.clear(); + boost::asio::ip::tcp::endpoint ep_2; + thread_data_ptr data_2(new session_thread_data_sessionless); + data_2->client_endpoint_tcp = ep_2; + send_status s_t2; + s_t2.status = SEND_OK; + s_t2.send_possible_size = 2u; + data_2->recive_data_map[ep_2].send_status_list.push_back(s_t2); + this->session_thread_data_map[boost::this_thread::get_id()] = data_2; + + //register function + tcp_schedule_func_type func_2 = &schedule_tcp_determinate; + + this->register_schedule(func_2); + + ret = this->handle_realserver_select(boost::this_thread::get_id(), ep_2); + //endpoint = 決定 + BOOST_CHECK_EQUAL(ep_2, string_to_endpoint ("10.10.10.10:8888")); + //遷移先ステータスを設定する status = REALSERVER_CONNECT + BOOST_CHECK_EQUAL(ret, REALSERVER_CONNECT); + + cout << "[160]--------------------------------------------- " << endl; + //unit_test[160] endpoint = 未決定 + this->session_thread_data_map.clear(); + + thread_data_ptr dataup2(new session_thread_data_sessionless); + this->session_thread_data_map[boost::this_thread::get_id()] = dataup2; + dataup2->end_flag = END_FLAG_OFF; + //register function + tcp_schedule_func_type func2 = &schedule_tcp_nodeterminate; + + this->register_schedule(func2); + + boost::asio::ip::tcp::endpoint ep2, ep_chk2; + ret = this->handle_realserver_select(boost::this_thread::get_id(), ep2); + + //endpoint = 未決定 + BOOST_CHECK_EQUAL(ep_chk2, ep2); + //終了フラグをONにする + BOOST_CHECK_EQUAL(dataup2->end_flag, END_FLAG_ON); + //遷移先ステータスを設定する status = CLIENT_DISCONNECT + BOOST_CHECK_EQUAL(ret, CLIENT_DISCONNECT); +} + +//handle_realserver_select(tcp)_thread 馮家純 +void handle_realserver_select_tcp_test_thread(){ + EVENT_TAG ret; + cout << "[161]--------------------------------------------- " << endl; + //unit_test[161] endpoint = 決定 + boost::thread down_thread(down_thread_func); + thread_data_ptr dataup(new session_thread_data_sessionless); + thread_data_ptr datadown(new session_thread_data_sessionless); + dataup->thread_division = THREAD_DIVISION_UP_STREAM; + dataup->pair_thread_id = down_thread.get_id(); + datadown->thread_division = THREAD_DIVISION_DOWN_STREAM; + datadown->pair_thread_id = boost::this_thread::get_id(); + datadown->recive_data_map.clear(); + + { + boost::mutex::scoped_lock sclock(this->session_thread_data_map_mutex); + this->session_thread_data_map[boost::this_thread::get_id()] = dataup; + this->session_thread_data_map[down_thread.get_id()] = datadown; + } + + boost::asio::ip::tcp::endpoint ep; + ret = this->handle_realserver_select(boost::this_thread::get_id(), ep); + + { + boost::mutex::scoped_lock sclock(check_mutex); + //endpoint = 決定 + BOOST_CHECK_EQUAL(ep, string_to_endpoint ("10.10.10.10:8888")); + //遷移先ステータスを設定する status = CLIENT_RECV + BOOST_CHECK_EQUAL(ret, FINALIZE); + } +} + +//handle_realserver_select(udp) 馮家純 +void handle_realserver_select_udp_test(){ + + cout << "[162]--------------------------------------------- " << endl; + //unit_test[162] handle_realserver_select_udp_test 戻り値が「STOP」に設定する。 + boost::asio::ip::udp::endpoint ep; + boost::array sbf; + std::size_t d; + + EVENT_TAG ret = this->handle_realserver_select(boost::this_thread::get_id(), ep, sbf, d); + + BOOST_CHECK_EQUAL(ret, STOP); +} + +//handle_realserver_connect 郎希倹 +void handle_realserver_connect_test(){ + size_t send_buffer_len = USE_BUFFER_SIZE; + EVENT_TAG ret; + boost::array send_buffer; + send_status send_status_temp; + edit_data edit_data_temp; + boost::thread down_thread(&down_thread_func); + thread_data_ptr psession_thread_data(new session_thread_data_sessionless); + init_session_thread_data_sessionless(psession_thread_data, down_thread.get_id()); + recive_data recive_data_tmp; + init_send_status(send_status_temp); + // recive_dataを作成する + init_recive_data(recive_data_tmp); + recive_data_tmp.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_tmp.recive_buffer_rest_size = USE_BUFFER_SIZE; + + //recive_data_mapを作成する + psession_thread_data->end_flag = END_FLAG_OFF; + psession_thread_data->last_status = CLIENT_RECV; + boost::asio::ip::tcp::endpoint endpoint_local = string_to_endpoint("10.10.10.1:8080");; + + //session_thread_dataを作成する + psession_thread_data->recive_data_map.clear(); + psession_thread_data->recive_data_map[endpoint_local] = recive_data_tmp; + psession_thread_data->client_endpoint_tcp = endpoint_local; + this->forwarded_for = 1; + + cout << "[163]--------------------------------------------- " << endl; + // unit_test[163] boost::this_thread::get_id()対応のデータなし + this->session_thread_data_map.clear(); + ret = handle_realserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + BOOST_CHECK_EQUAL(ret, FINALIZE); + + cout << "[164]--------------------------------------------- " << endl; + // unit_test[164] boost::this_thread::get_id()対応のデータsession_thread_dataがNULL + this->session_thread_data_map.clear(); + thread_data_ptr p; + this->session_thread_data_map[boost::this_thread::get_id()] = p; + ret = handle_realserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + BOOST_CHECK_EQUAL(ret, FINALIZE); + + this->session_thread_data_map.clear(); + this->session_thread_data_map[boost::this_thread::get_id()] = psession_thread_data; + + cout << "[165]--------------------------------------------- " << endl; + // unit_test[165] endpoint対応のrecive_dataなし + psession_thread_data->recive_data_map.clear(); + send_buffer_len = 0; + memset(send_buffer.c_array(), 0, MAX_BUFFER_SIZE); + + ret = handle_realserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + BOOST_CHECK_EQUAL(ret, FINALIZE); + + psession_thread_data->recive_data_map[endpoint_local] = recive_data_tmp; + std::map::iterator it = + psession_thread_data->recive_data_map.find(endpoint_local); + recive_data& recive_data_global = it->second; + + cout << "[166]--------------------------------------------- " << endl; + // unit_test[166] recive_data.recive_buffer=Null + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = USE_BUFFER_SIZE; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = NULL; + send_buffer_len = 0; + memset(send_buffer.c_array(), 0, MAX_BUFFER_SIZE); + + ret = handle_realserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + BOOST_CHECK_EQUAL(ret, FINALIZE); + + cout << "[167]--------------------------------------------- " << endl; + // unit_test[167] 送信状態リストが空の場合 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = USE_BUFFER_SIZE; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + + recive_data_global.send_status_list.clear(); + ret = handle_realserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + BOOST_CHECK_EQUAL(ret, FINALIZE); + + cout << "[168]--------------------------------------------- " << endl; + // unit_test[168] 送信状態リストの要素の送信状態が1:送信待 2:送信待の場合 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = USE_BUFFER_SIZE; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + send_buffer_len = 0; + memset(send_buffer.c_array(), 0, MAX_BUFFER_SIZE); + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_OK; + send_status_temp.send_offset = 0; + send_status_temp.send_end_size = 0; + send_status_temp.edit_division = EDIT_DIVISION_NO_EDIT; + send_status_temp.send_possible_size = 30; + recive_data_global.send_status_list.push_back(send_status_temp); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_OK; + send_status_temp.send_offset = 30; + send_status_temp.send_end_size = 0; + send_status_temp.edit_division = EDIT_DIVISION_NO_EDIT; + send_status_temp.send_possible_size = 35; + recive_data_global.send_status_list.push_back(send_status_temp); + + memcpy(recive_data_global.recive_buffer, + "GET / HTTP/1.0\r\nHOST: KKKK\r\n\r\nGET / HTTP/1.0\r\nHOST: KKKKKKKKK\r\n\r\n", 65); + + ret = handle_realserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_SEND); + BOOST_CHECK_EQUAL(send_buffer_len, 30u); + //送信バッファの内容をチェックする。 + int cmp_ret = memcmp(recive_data_global.recive_buffer, send_buffer.c_array(), 30u); + BOOST_CHECK_EQUAL(cmp_ret, 0); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 2u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_end_size, 30u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_end_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_possible_size, 35u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_offset, 30u); + + cout << "[169]--------------------------------------------- " << endl; + // unit_test[169] 送信状態リストの要素の送信状態が1:送信待 2:送信不可の場合 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = USE_BUFFER_SIZE; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + send_buffer_len = 0; + memset(send_buffer.c_array(), 0, MAX_BUFFER_SIZE); + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_OK; + send_status_temp.send_offset = 0; + send_status_temp.send_end_size = 0; + send_status_temp.send_possible_size = 30; + send_status_temp.edit_division = EDIT_DIVISION_NO_EDIT; + recive_data_global.send_status_list.push_back(send_status_temp); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_NG; + send_status_temp.send_offset = 30; + send_status_temp.send_end_size = 0; + send_status_temp.unsend_size = 34; + send_status_temp.edit_division = EDIT_DIVISION_NO_EDIT; + recive_data_global.send_status_list.push_back(send_status_temp); + + memcpy(recive_data_global.recive_buffer, + "GET / HTTP/1.0\r\nHOST: KKKK\r\n\r\nGET / HTTP/1.0\r\nHOST: KKKKKKKKK\r\n\r", 64); + + ret = handle_realserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_SEND); + BOOST_CHECK_EQUAL(send_buffer_len, 30u); + //送信バッファの内容をチェックする。 + cmp_ret = memcmp(recive_data_global.recive_buffer, send_buffer.c_array(), 30); + BOOST_CHECK_EQUAL(cmp_ret, 0); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 2u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_end_size, 30u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_end_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->unsend_size, 34u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_offset, 30u); + + cout << "[170]--------------------------------------------- " << endl; + // unit_test[170] 送信状態リストの要素の送信状態が1:送信待の場合 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = USE_BUFFER_SIZE; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + send_buffer_len = 0; + memset(send_buffer.c_array(), 0, MAX_BUFFER_SIZE); + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_OK; + send_status_temp.send_offset = 0; + send_status_temp.send_end_size = 0; + send_status_temp.edit_division = EDIT_DIVISION_NO_EDIT; + send_status_temp.send_possible_size = 50; + recive_data_global.send_status_list.push_back(send_status_temp); + + memcpy(recive_data_global.recive_buffer, "GET / HTTP/1.0\r\nHOST: KKKKKKKKKKKKKKKKKKKKKKKK\r\n\r\n", 50); + + ret = handle_realserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_SEND); + BOOST_CHECK_EQUAL(send_buffer_len, 50u); + //送信バッファの内容をチェックする。 + cmp_ret = memcmp(recive_data_global.recive_buffer, send_buffer.c_array(), 50); + BOOST_CHECK_EQUAL(cmp_ret, 0); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_end_size, 50u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_NO_EDIT); + + const char* forwarded_exist = "POST / HTTP/1.0\r\nX-Forwarded-For: 10.10.2.2\r\nContent-Length: 65465\r\n\r\n"; + const char* forwarded_not_exist = "POST / HTTP/1.0\r\nContent-Length: 65493\r\n\r\n"; + const int exist_len = 70; + const int exist_leave_len = 65465; + const int not_exist_leave_len = 65493; + const int not_exist_len = 42; + const int forwarded_offset = 17; + + cout << "[171]--------------------------------------------- " << endl; + // unit_test[171] 編集区分 = 編集あり、編集データリストが空の場合 + // unit_test[171] ●送信可能データからHTTPヘッダ(X-Forwarded-For)の検索結果 = 該当あり。 + recive_data_global.recive_buffer_max_size = MAX_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 0; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + send_buffer_len = 0; + memset(send_buffer.c_array(), 0, MAX_BUFFER_SIZE); + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_OK; + send_status_temp.send_offset = 0; + send_status_temp.send_end_size = 0; + send_status_temp.edit_division = EDIT_DIVISION_EDIT; + send_status_temp.send_possible_size = MAX_BUFFER_SIZE; + recive_data_global.send_status_list.push_back(send_status_temp); + + memcpy(recive_data_global.recive_buffer, forwarded_exist, exist_len); + memset(recive_data_global.recive_buffer + exist_len, 'x', exist_leave_len); + + ret = handle_realserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_SEND); + BOOST_CHECK_EQUAL(send_buffer_len, MAX_BUFFER_SIZE); + //送信バッファの内容をチェックする。 + cmp_ret = memcmp(send_buffer.c_array(), recive_data_global.recive_buffer, forwarded_offset); + BOOST_CHECK_EQUAL(cmp_ret, 0); + cmp_ret = memcmp(send_buffer.c_array() + forwarded_offset, "X-Forwarded-For: 10.10.2.2, 10.10.10.1\r\n", 40); + BOOST_CHECK_EQUAL(cmp_ret, 0); + cmp_ret = memcmp(send_buffer.c_array() + forwarded_offset + 40, recive_data_global.recive_buffer + forwarded_offset + + 28, MAX_BUFFER_SIZE - forwarded_offset - 40); + BOOST_CHECK_EQUAL(cmp_ret, 0); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.begin()->edit_data_list.size(), 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_end_size, MAX_BUFFER_SIZE - 12u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 12u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_NO_EDIT); + + cout << "[172]--------------------------------------------- " << endl; + // unit_test[172] 編集区分 = 編集あり、編集データリストが空の場合 + // unit_test[172] ●送信可能データからHTTPヘッダ(X-Forwarded-For)の検索結果 = 該当なし。 + recive_data_global.recive_buffer_max_size = MAX_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 0; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + send_buffer_len = 0; + memset(send_buffer.c_array(), 0, MAX_BUFFER_SIZE); + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_OK; + send_status_temp.send_offset = 0; + send_status_temp.send_end_size = 0; + send_status_temp.edit_division = EDIT_DIVISION_EDIT; + send_status_temp.send_possible_size = MAX_BUFFER_SIZE; + recive_data_global.send_status_list.push_back(send_status_temp); + + memcpy(recive_data_global.recive_buffer, forwarded_not_exist, not_exist_len); + memset(recive_data_global.recive_buffer + not_exist_len, 'x', not_exist_leave_len); + + ret = handle_realserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_SEND); + BOOST_CHECK_EQUAL(send_buffer_len, MAX_BUFFER_SIZE); + //送信バッファの内容をチェックする。 + cmp_ret = memcmp(send_buffer.c_array(), recive_data_global.recive_buffer, forwarded_offset); + BOOST_CHECK_EQUAL(cmp_ret, 0); + cmp_ret = memcmp(send_buffer.c_array() + forwarded_offset, "X-Forwarded-For: 10.10.10.1\r\n", 29); + BOOST_CHECK_EQUAL(cmp_ret, 0); + cmp_ret = memcmp(send_buffer.c_array() + forwarded_offset + 29, + recive_data_global.recive_buffer + forwarded_offset, MAX_BUFFER_SIZE - forwarded_offset - 29); + BOOST_CHECK_EQUAL(cmp_ret, 0); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.begin()->edit_data_list.size(), 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_end_size, MAX_BUFFER_SIZE - 29u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 29u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_NO_EDIT); + + cout << "[173]--------------------------------------------- " << endl; + // unit_test[173] 編集区分 = 編集あり、編集データリストが空でないの場合 + recive_data_global.recive_buffer_max_size = MAX_BUFFER_SIZE + 32; + recive_data_global.recive_buffer_rest_size = 0; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + send_buffer_len = 0; + memset(send_buffer.c_array(), 0, MAX_BUFFER_SIZE); + recive_data_global.send_status_list.clear(); + + memcpy(recive_data_global.recive_buffer, "POST / HTTP/1.0\r\nHOST:123456789012345678901\r\nCookie: monkey=", 60); + memset(recive_data_global.recive_buffer + 60, 'x', MAX_BUFFER_SIZE - 60); + memcpy(recive_data_global.recive_buffer + MAX_BUFFER_SIZE, "\r\nX-Forwarded-For: 10.10.2.2\r\n\r\n", 32); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_OK; + send_status_temp.send_offset = 0; + send_status_temp.send_end_size = MAX_BUFFER_SIZE; + send_status_temp.send_possible_size = 32; + send_status_temp.edit_division = EDIT_DIVISION_EDIT; + recive_data_global.send_status_list.push_back(send_status_temp); + + init_edit_data(edit_data_temp); + edit_data_temp.data = "X-Forwarded-For: 10.10.2.2, 10.10.10.1\r\n"; + edit_data_temp.data_size = 40; + edit_data_temp.insert_posission = MAX_BUFFER_SIZE + 2; + edit_data_temp.replace_size = 28; + recive_data_global.send_status_list.begin()->edit_data_list.clear(); + recive_data_global.send_status_list.begin()->edit_data_list.push_back(edit_data_temp); + + ret = handle_realserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_SEND); + BOOST_CHECK_EQUAL(send_buffer_len, 44u); + //送信バッファの内容をチェックする。 + cmp_ret = memcmp(send_buffer.c_array(), recive_data_global.recive_buffer + MAX_BUFFER_SIZE, 2); + BOOST_CHECK_EQUAL(cmp_ret, 0); + cmp_ret = memcmp(send_buffer.c_array() + 2, "X-Forwarded-For: 10.10.2.2, 10.10.10.1\r\n", 40); + BOOST_CHECK_EQUAL(cmp_ret, 0); + cmp_ret = memcmp(send_buffer.c_array() + 42, recive_data_global.recive_buffer + MAX_BUFFER_SIZE + 30, 2); + BOOST_CHECK_EQUAL(cmp_ret, 0); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.begin()->edit_data_list.size(), 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_end_size, MAX_BUFFER_SIZE + 32u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_NO_EDIT); + + cout << "[174]--------------------------------------------- " << endl; + // unit_test[174] 編集データリストが空の場合 + // unit_test[174] ●送信バッファ残サイズ > 0 かつ 送信可能データサイズ > 0 + // unit_test[174] ●送信バッファ残サイズ > 送信可能データサイズ + recive_data_global.recive_buffer_max_size = MAX_BUFFER_SIZE + 32; + recive_data_global.recive_buffer_rest_size = 0; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + send_buffer_len = 0; + memset(send_buffer.c_array(), 0, MAX_BUFFER_SIZE); + recive_data_global.send_status_list.clear(); + + memcpy(recive_data_global.recive_buffer, "POST / HTTP/1.0\r\nHOST:123456789012345678901\r\nCookie: monkey=", 60); + memset(recive_data_global.recive_buffer + 60, 'x', MAX_BUFFER_SIZE - 60); + memcpy(recive_data_global.recive_buffer + MAX_BUFFER_SIZE, "\r\nX-Forwarded-For: 10.10.2.2\r\n\r\n", 32); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_OK; + send_status_temp.send_offset = 0; + send_status_temp.send_end_size = MAX_BUFFER_SIZE; + send_status_temp.send_possible_size = 32; + send_status_temp.edit_division = EDIT_DIVISION_EDIT; + recive_data_global.send_status_list.push_back(send_status_temp); + + init_edit_data(edit_data_temp); + edit_data_temp.data = "X-Forwarded-For: 10.10.2.2, 10.10.10.1\r\n"; + edit_data_temp.data_size = 40; + edit_data_temp.insert_posission = MAX_BUFFER_SIZE + 2; + edit_data_temp.replace_size = 28; + recive_data_global.send_status_list.begin()->edit_data_list.clear(); + recive_data_global.send_status_list.begin()->edit_data_list.push_back(edit_data_temp); + + ret = handle_realserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_SEND); + BOOST_CHECK_EQUAL(send_buffer_len, 44u); + //送信バッファの内容をチェックする。 + cmp_ret = memcmp(send_buffer.c_array(), recive_data_global.recive_buffer + MAX_BUFFER_SIZE, 2); + BOOST_CHECK_EQUAL(cmp_ret, 0); + cmp_ret = memcmp(send_buffer.c_array() + 2, "X-Forwarded-For: 10.10.2.2, 10.10.10.1\r\n", 40); + BOOST_CHECK_EQUAL(cmp_ret, 0); + cmp_ret = memcmp(send_buffer.c_array() + 42, recive_data_global.recive_buffer + MAX_BUFFER_SIZE + 30, 2); + BOOST_CHECK_EQUAL(cmp_ret, 0); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.begin()->edit_data_list.size(), 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_end_size, MAX_BUFFER_SIZE + 32u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_NO_EDIT); + + cout << "[175]--------------------------------------------- " << endl; + // unit_test[175] 編集データリストが空の場合 + // unit_test[175] ●送信バッファ残サイズ > 0 かつ 送信可能データサイズ > 0 + // unit_test[175] ●送信バッファ残サイズ = 送信可能データサイズ + recive_data_global.recive_buffer_max_size = MAX_BUFFER_SIZE - 12; + recive_data_global.recive_buffer_rest_size = 0; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + send_buffer_len = 0; + memset(send_buffer.c_array(), 0, MAX_BUFFER_SIZE); + recive_data_global.send_status_list.clear(); + + memcpy(recive_data_global.recive_buffer, "POST / HTTP/1.0\r\nHOST:123456789012345678901\r\nCookie: monkey=", 60); + memset(recive_data_global.recive_buffer + 60, 'x', MAX_BUFFER_SIZE - 104); + memcpy(recive_data_global.recive_buffer + MAX_BUFFER_SIZE - 44, "\r\nX-Forwarded-For: 10.10.2.2\r\n\r\n", 32); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_OK; + send_status_temp.send_offset = 0; + send_status_temp.send_end_size = 0; + send_status_temp.send_possible_size = MAX_BUFFER_SIZE - 12; + send_status_temp.edit_division = EDIT_DIVISION_EDIT; + recive_data_global.send_status_list.push_back(send_status_temp); + + ret = handle_realserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_SEND); + BOOST_CHECK_EQUAL(send_buffer_len, MAX_BUFFER_SIZE); + //送信バッファの内容をチェックする。 + cmp_ret = memcmp(send_buffer.c_array(), recive_data_global.recive_buffer, MAX_BUFFER_SIZE - 42); + BOOST_CHECK_EQUAL(cmp_ret, 0); + cmp_ret = memcmp(send_buffer.c_array() + MAX_BUFFER_SIZE - 42, "X-Forwarded-For: 10.10.2.2, 10.10.10.1\r\n", 40); + BOOST_CHECK_EQUAL(cmp_ret, 0); + cmp_ret = memcmp(send_buffer.c_array() + MAX_BUFFER_SIZE - 2, recive_data_global.recive_buffer + MAX_BUFFER_SIZE + - 14, 2); + BOOST_CHECK_EQUAL(cmp_ret, 0); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.begin()->edit_data_list.size(), 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_end_size, MAX_BUFFER_SIZE - 12u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_NO_EDIT); + + cout << "[176]--------------------------------------------- " << endl; + // unit_test[176] 編集データリストが空の場合 + // unit_test[176] ●送信バッファ残サイズ > 0 かつ 送信可能データサイズ > 0 + // unit_test[176] ●送信バッファ残サイズ < 送信可能データサイズ + recive_data_global.recive_buffer_max_size = MAX_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 0; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + send_buffer_len = 0; + memset(send_buffer.c_array(), 0, MAX_BUFFER_SIZE); + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_OK; + send_status_temp.send_offset = 0; + send_status_temp.send_end_size = 0; + send_status_temp.edit_division = EDIT_DIVISION_EDIT; + send_status_temp.send_possible_size = MAX_BUFFER_SIZE; + recive_data_global.send_status_list.push_back(send_status_temp); + + memcpy(recive_data_global.recive_buffer, forwarded_exist, exist_len); + memset(recive_data_global.recive_buffer + exist_len, 'x', exist_leave_len); + + ret = handle_realserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_SEND); + BOOST_CHECK_EQUAL(send_buffer_len, MAX_BUFFER_SIZE); + //送信バッファの内容をチェックする。 + cmp_ret = memcmp(send_buffer.c_array(), recive_data_global.recive_buffer, forwarded_offset); + BOOST_CHECK_EQUAL(cmp_ret, 0); + cmp_ret = memcmp(send_buffer.c_array() + forwarded_offset, "X-Forwarded-For: 10.10.2.2, 10.10.10.1\r\n", 40); + BOOST_CHECK_EQUAL(cmp_ret, 0); + cmp_ret = memcmp(send_buffer.c_array() + forwarded_offset + 40, recive_data_global.recive_buffer + forwarded_offset + + 28, MAX_BUFFER_SIZE - forwarded_offset - 40); + BOOST_CHECK_EQUAL(cmp_ret, 0); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.begin()->edit_data_list.size(), 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_end_size, MAX_BUFFER_SIZE - 12u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 12u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_NO_EDIT); + + cout << "[177]--------------------------------------------- " << endl; + // unit_test[177] 編集データリストが空の場合 + // unit_test[177] ●送信バッファ残サイズ = 0 + recive_data_global.recive_buffer_max_size = MAX_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 0; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + send_buffer_len = 0; + memset(send_buffer.c_array(), 0, MAX_BUFFER_SIZE); + recive_data_global.send_status_list.clear(); + + memcpy(recive_data_global.recive_buffer, "POST / HTTP/1.0\r\nHOST:123456789012345678901\r\nCookie: monkey=", 60); + memset(recive_data_global.recive_buffer + 60, 'x', MAX_BUFFER_SIZE - 102); + memcpy(recive_data_global.recive_buffer + MAX_BUFFER_SIZE - 42, "\r\nX-Forwarded-For: 10.10.2.2\r\n\r\n", 32); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_OK; + send_status_temp.send_offset = 0; + send_status_temp.send_end_size = 0; + send_status_temp.send_possible_size = MAX_BUFFER_SIZE - 10; + send_status_temp.edit_division = EDIT_DIVISION_EDIT; + recive_data_global.send_status_list.push_back(send_status_temp); + + ret = handle_realserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_SEND); + BOOST_CHECK_EQUAL(send_buffer_len, MAX_BUFFER_SIZE); + //送信バッファの内容をチェックする。 + cmp_ret = memcmp(send_buffer.c_array(), recive_data_global.recive_buffer, MAX_BUFFER_SIZE - 40); + BOOST_CHECK_EQUAL(cmp_ret, 0); + cmp_ret = memcmp(send_buffer.c_array() + MAX_BUFFER_SIZE - 40, "X-Forwarded-For: 10.10.2.2, 10.10.10.1\r\n", 40); + BOOST_CHECK_EQUAL(cmp_ret, 0); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.begin()->edit_data_list.size(), 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_end_size, MAX_BUFFER_SIZE - 12u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 2u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_NO_EDIT); + + cout << "[178]--------------------------------------------- " << endl; + // unit_test[178] 編集データリストが空の場合 + // unit_test[178] ●送信可能データサイズ = 0 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = USE_BUFFER_SIZE; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + send_buffer_len = 0; + memset(send_buffer.c_array(), 0, MAX_BUFFER_SIZE); + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_OK; + send_status_temp.send_offset = 0; + send_status_temp.send_end_size = 0; + send_status_temp.edit_division = EDIT_DIVISION_EDIT; + send_status_temp.send_possible_size = 50; + recive_data_global.send_status_list.push_back(send_status_temp); + + memcpy(recive_data_global.recive_buffer, "GET / HTTP/1.0\r\nHOST: KKKKKKKKKKKKKKKKKKKKKKKK\r\n\r\n", 50); + + ret = handle_realserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_SEND); + BOOST_CHECK_EQUAL(send_buffer_len, 79u); + //送信バッファの内容をチェックする。 + cmp_ret = memcmp(send_buffer.c_array(), + "GET / HTTP/1.0\r\nX-Forwarded-For: 10.10.10.1\r\nHOST: KKKKKKKKKKKKKKKKKKKKKKKK\r\n\r\n", 79); + BOOST_CHECK_EQUAL(cmp_ret, 0); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_end_size, 50u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_NO_EDIT); + + cout << "[179]--------------------------------------------- " << endl; + // unit_test[179] 編集データリストが空でない場合 + // unit_test[179] ●送信バッファ残サイズ > 編集データ設定位置 - 送信済サイズ + // unit_test[179] ●送信バッファ残サイズ > 編集データサイズ + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = USE_BUFFER_SIZE; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + send_buffer_len = 0; + memset(send_buffer.c_array(), 0, MAX_BUFFER_SIZE); + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_OK; + send_status_temp.send_offset = 0; + send_status_temp.send_end_size = 0; + send_status_temp.edit_division = EDIT_DIVISION_EDIT; + send_status_temp.send_possible_size = 50; + recive_data_global.send_status_list.push_back(send_status_temp); + + memcpy(recive_data_global.recive_buffer, "GET / HTTP/1.0\r\nHOST: KKKKKKKKKKKKKKKKKKKKKKKK\r\n\r\n", 50); + + ret = handle_realserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_SEND); + BOOST_CHECK_EQUAL(send_buffer_len, 79u); + //送信バッファの内容をチェックする。 + cmp_ret = memcmp(send_buffer.c_array(), recive_data_global.recive_buffer, 16); + BOOST_CHECK_EQUAL(cmp_ret, 0); + cmp_ret = memcmp(send_buffer.c_array() + 16, "X-Forwarded-For: 10.10.10.1\r\n", 29); + BOOST_CHECK_EQUAL(cmp_ret, 0); + cmp_ret = memcmp(send_buffer.c_array() + 45, recive_data_global.recive_buffer + 16, 34); + BOOST_CHECK_EQUAL(cmp_ret, 0); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.begin()->edit_data_list.size(), 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_end_size, 50u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_NO_EDIT); + + cout << "[180]--------------------------------------------- " << endl; + // unit_test[180] 編集データリストが空でない場合 + // unit_test[180] ●送信バッファ残サイズ > 編集データ設定位置 - 送信済サイズ + // unit_test[180] ●送信バッファ残サイズ = 編集データサイズ + recive_data_global.recive_buffer_max_size = MAX_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 0; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + send_buffer_len = 0; + memset(send_buffer.c_array(), 0, MAX_BUFFER_SIZE); + recive_data_global.send_status_list.clear(); + + memcpy(recive_data_global.recive_buffer, "POST / HTTP/1.0\r\nHOST:123456789012345678901\r\nCookie: monkey=", 60); + memset(recive_data_global.recive_buffer + 60, 'x', MAX_BUFFER_SIZE - 102); + memcpy(recive_data_global.recive_buffer + MAX_BUFFER_SIZE - 42, "\r\nX-Forwarded-For: 10.10.2.2\r\n\r\n", 32); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_OK; + send_status_temp.send_offset = 0; + send_status_temp.send_end_size = 0; + send_status_temp.send_possible_size = MAX_BUFFER_SIZE - 10; + send_status_temp.edit_division = EDIT_DIVISION_EDIT; + recive_data_global.send_status_list.push_back(send_status_temp); + + ret = handle_realserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_SEND); + BOOST_CHECK_EQUAL(send_buffer_len, MAX_BUFFER_SIZE); + //送信バッファの内容をチェックする。 + cmp_ret = memcmp(send_buffer.c_array(), recive_data_global.recive_buffer, MAX_BUFFER_SIZE - 40); + BOOST_CHECK_EQUAL(cmp_ret, 0); + cmp_ret = memcmp(send_buffer.c_array() + MAX_BUFFER_SIZE - 40, "X-Forwarded-For: 10.10.2.2, 10.10.10.1\r\n", 40); + BOOST_CHECK_EQUAL(cmp_ret, 0); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.begin()->edit_data_list.size(), 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_end_size, MAX_BUFFER_SIZE - 12u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 2u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_NO_EDIT); + + cout << "[181]--------------------------------------------- " << endl; + // unit_test[181] 編集データリストが空でない場合 + // unit_test[181] ●送信バッファ残サイズ > 編集データ設定位置 - 送信済サイズ + // unit_test[181] ●送信バッファ残サイズ < 編集データサイズ + recive_data_global.recive_buffer_max_size = MAX_BUFFER_SIZE + 29; + recive_data_global.recive_buffer_rest_size = 0; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + send_buffer_len = 0; + memset(send_buffer.c_array(), 0, MAX_BUFFER_SIZE); + recive_data_global.send_status_list.clear(); + + memcpy(recive_data_global.recive_buffer, "POST / HTTP/1.0\r\nHOST:123456789012345678901\r\nCookie: monkey=", 60); + memset(recive_data_global.recive_buffer + 60, 'x', MAX_BUFFER_SIZE - 63); + memcpy(recive_data_global.recive_buffer + MAX_BUFFER_SIZE - 3, "\r\nX", 3); + memcpy(recive_data_global.recive_buffer + MAX_BUFFER_SIZE, "-Forwarded-For: 10.10.2.2\r\n\r\n", 29); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_OK; + send_status_temp.send_offset = 0; + send_status_temp.send_end_size = 0; + send_status_temp.send_possible_size = MAX_BUFFER_SIZE + 29; + send_status_temp.edit_division = EDIT_DIVISION_EDIT; + recive_data_global.send_status_list.push_back(send_status_temp); + + ret = handle_realserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_SEND); + BOOST_CHECK_EQUAL(send_buffer_len, MAX_BUFFER_SIZE - 1u); + + //送信バッファの内容をチェックする。 + cmp_ret = memcmp(send_buffer.c_array(), recive_data_global.recive_buffer, MAX_BUFFER_SIZE - 1); + BOOST_CHECK_EQUAL(cmp_ret, 0); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.begin()->edit_data_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_end_size, MAX_BUFFER_SIZE - 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 30u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_EDIT); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_data_list.begin()->data, + "X-Forwarded-For: 10.10.2.2, 10.10.10.1"); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_data_list.begin()->data_size, 38u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_data_list.begin()->insert_posission, + MAX_BUFFER_SIZE - 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_data_list.begin()->replace_size, 26u); + + cout << "[182]--------------------------------------------- " << endl; + // unit_test[182] 編集データリストが空でない場合 + // unit_test[182] ●送信バッファ残サイズ = 編集データ設定位置 - 送信済サイズ + // unit_test[182] ●送信バッファ残サイズ < 編集データサイズ + recive_data_global.recive_buffer_max_size = MAX_BUFFER_SIZE + 30; + recive_data_global.recive_buffer_rest_size = 0; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + send_buffer_len = 0; + memset(send_buffer.c_array(), 0, MAX_BUFFER_SIZE); + recive_data_global.send_status_list.clear(); + + memcpy(recive_data_global.recive_buffer, "POST / HTTP/1.0\r\nHOST:123456789012345678901\r\nCookie: monkey=", 60); + memset(recive_data_global.recive_buffer + 60, 'x', MAX_BUFFER_SIZE - 62); + memcpy(recive_data_global.recive_buffer + MAX_BUFFER_SIZE - 2, "\r\n", 2); + memcpy(recive_data_global.recive_buffer + MAX_BUFFER_SIZE, "X-Forwarded-For: 10.10.2.2\r\n\r\n", 30); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_OK; + send_status_temp.send_offset = 0; + send_status_temp.send_end_size = 0; + send_status_temp.send_possible_size = MAX_BUFFER_SIZE + 30; + send_status_temp.edit_division = EDIT_DIVISION_EDIT; + recive_data_global.send_status_list.push_back(send_status_temp); + + ret = handle_realserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_SEND); + BOOST_CHECK_EQUAL(send_buffer_len, MAX_BUFFER_SIZE); + //送信バッファの内容をチェックする。 + cmp_ret = memcmp(send_buffer.c_array(), recive_data_global.recive_buffer, MAX_BUFFER_SIZE); + BOOST_CHECK_EQUAL(cmp_ret, 0); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.begin()->edit_data_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_end_size, MAX_BUFFER_SIZE); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 30u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_EDIT); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_data_list.begin()->data, + "X-Forwarded-For: 10.10.2.2, 10.10.10.1"); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_data_list.begin()->data_size, 38u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_data_list.begin()->insert_posission, + MAX_BUFFER_SIZE); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_data_list.begin()->replace_size, 26u); + + cout << "[183]--------------------------------------------- " << endl; + // unit_test[183] 編集データリストが空でない場合 + // unit_test[183] ●送信バッファ残サイズ < 編集データ設定位置 - 送信済サイズ + recive_data_global.recive_buffer_max_size = MAX_BUFFER_SIZE + 32; + recive_data_global.recive_buffer_rest_size = 0; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + send_buffer_len = 0; + memset(send_buffer.c_array(), 0, MAX_BUFFER_SIZE); + recive_data_global.send_status_list.clear(); + + memcpy(recive_data_global.recive_buffer, "POST / HTTP/1.0\r\nHOST:123456789012345678901\r\nCookie: monkey=", 60); + memset(recive_data_global.recive_buffer + 60, 'x', MAX_BUFFER_SIZE - 60); + memcpy(recive_data_global.recive_buffer + MAX_BUFFER_SIZE, "\r\nX-Forwarded-For: 10.10.2.2\r\n\r\n", 32); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_OK; + send_status_temp.send_offset = 0; + send_status_temp.send_end_size = 0; + send_status_temp.send_possible_size = MAX_BUFFER_SIZE + 32; + send_status_temp.edit_division = EDIT_DIVISION_EDIT; + recive_data_global.send_status_list.push_back(send_status_temp); + + ret = handle_realserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_SEND); + BOOST_CHECK_EQUAL(send_buffer_len, MAX_BUFFER_SIZE); + //送信バッファの内容をチェックする。 + cmp_ret = memcmp(send_buffer.c_array(), recive_data_global.recive_buffer, MAX_BUFFER_SIZE); + BOOST_CHECK_EQUAL(cmp_ret, 0); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.begin()->edit_data_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_end_size, MAX_BUFFER_SIZE); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 32u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_EDIT); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_data_list.begin()->data, + "X-Forwarded-For: 10.10.2.2, 10.10.10.1"); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_data_list.begin()->data_size, 38u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_data_list.begin()->insert_posission, + MAX_BUFFER_SIZE + 2u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_data_list.begin()->replace_size, 26u); + + cout << "[184]--------------------------------------------- " << endl; + // unit_test[184] 編集区分 = 編集なし + // unit_test[184] ●送信バッファサイズ > 送信可能データサイズ + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = USE_BUFFER_SIZE; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + send_buffer_len = 0; + memset(send_buffer.c_array(), 0, MAX_BUFFER_SIZE); + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_OK; + send_status_temp.send_offset = 0; + send_status_temp.send_end_size = 0; + send_status_temp.edit_division = EDIT_DIVISION_NO_EDIT; + send_status_temp.send_possible_size = 50; + recive_data_global.send_status_list.push_back(send_status_temp); + + memcpy(recive_data_global.recive_buffer, "GET / HTTP/1.0\r\nHOST: KKKKKKKKKKKKKKKKKKKKKKKK\r\n\r\n", 50); + + ret = handle_realserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_SEND); + BOOST_CHECK_EQUAL(send_buffer_len, 50u); + //送信バッファの内容をチェックする。 + cmp_ret = memcmp(recive_data_global.recive_buffer, send_buffer.c_array(), 50); + BOOST_CHECK_EQUAL(cmp_ret, 0); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_end_size, 50u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_NO_EDIT); + + cout << "[185]--------------------------------------------- " << endl; + // unit_test[185] 編集区分 = 編集なし + // unit_test[185] ●送信バッファサイズ = 送信可能データサイズ + recive_data_global.recive_buffer_max_size = MAX_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 0; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + send_buffer_len = 0; + memset(send_buffer.c_array(), 0, MAX_BUFFER_SIZE); + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_OK; + send_status_temp.send_offset = 0; + send_status_temp.send_end_size = 0; + send_status_temp.edit_division = EDIT_DIVISION_NO_EDIT; + send_status_temp.send_possible_size = MAX_BUFFER_SIZE; + recive_data_global.send_status_list.push_back(send_status_temp); + + memcpy(recive_data_global.recive_buffer, forwarded_exist, exist_len); + memset(recive_data_global.recive_buffer + exist_len, 'x', exist_leave_len); + + ret = handle_realserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_SEND); + BOOST_CHECK_EQUAL(send_buffer_len, MAX_BUFFER_SIZE); + //送信バッファの内容をチェックする。 + cmp_ret = memcmp(recive_data_global.recive_buffer, send_buffer.c_array(), MAX_BUFFER_SIZE); + BOOST_CHECK_EQUAL(cmp_ret, 0); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_end_size, MAX_BUFFER_SIZE); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_NO_EDIT); + + cout << "[186]--------------------------------------------- " << endl; + // unit_test[186] 編集区分 = 編集なし + // unit_test[186] ●送信バッファサイズ < 送信可能データサイズ + recive_data_global.recive_buffer_max_size = MAX_BUFFER_SIZE + 1; + recive_data_global.recive_buffer_rest_size = 0; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + send_buffer_len = 0; + memset(send_buffer.c_array(), 0, MAX_BUFFER_SIZE); + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_OK; + send_status_temp.send_offset = 0; + send_status_temp.send_end_size = 0; + send_status_temp.edit_division = EDIT_DIVISION_NO_EDIT; + send_status_temp.send_possible_size = MAX_BUFFER_SIZE + 1; + recive_data_global.send_status_list.push_back(send_status_temp); + + memcpy(recive_data_global.recive_buffer, forwarded_exist, exist_len); + memset(recive_data_global.recive_buffer + exist_len, 'x', exist_leave_len + 1); + + ret = handle_realserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_SEND); + BOOST_CHECK_EQUAL(send_buffer_len, MAX_BUFFER_SIZE); + //送信バッファの内容をチェックする。 + cmp_ret = memcmp(recive_data_global.recive_buffer, send_buffer.c_array(), MAX_BUFFER_SIZE); + BOOST_CHECK_EQUAL(cmp_ret, 0); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_end_size, MAX_BUFFER_SIZE); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_NO_EDIT); + + cout << "[187]--------------------------------------------- " << endl; + // unit_test[187] forwarded_forを設定するの場合、編集区分が1である。 + this->forwarded_for = 1; + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = USE_BUFFER_SIZE; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + send_buffer_len = 0; + memset(send_buffer.c_array(), 0, MAX_BUFFER_SIZE); + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_OK; + send_status_temp.send_offset = 0; + send_status_temp.send_end_size = 0; + send_status_temp.edit_division = EDIT_DIVISION_EDIT; + send_status_temp.send_possible_size = 50; + recive_data_global.send_status_list.push_back(send_status_temp); + + memcpy(recive_data_global.recive_buffer, "GET / HTTP/1.0\r\nHOST: KKKKKKKKKKKKKKKKKKKKKKKK\r\n\r\n", 50); + + ret = handle_realserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_SEND); + BOOST_CHECK_EQUAL(send_buffer_len, 79u); + //送信バッファの内容をチェックする。 + cmp_ret = memcmp(send_buffer.c_array(), recive_data_global.recive_buffer, 16); + BOOST_CHECK_EQUAL(cmp_ret, 0); + cmp_ret = memcmp(send_buffer.c_array() + 16, "X-Forwarded-For: 10.10.10.1\r\n", 29); + BOOST_CHECK_EQUAL(cmp_ret, 0); + cmp_ret = memcmp(send_buffer.c_array() + 45, recive_data_global.recive_buffer + 16, 34); + BOOST_CHECK_EQUAL(cmp_ret, 0); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.begin()->edit_data_list.size(), 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_end_size, 50u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_NO_EDIT); + + cout << "[188]--------------------------------------------- " << endl; + // unit_test[188] forwarded_forを設定しないの場合、編集区分が1である。 + this->forwarded_for = 0; + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = USE_BUFFER_SIZE; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + send_buffer_len = 0; + memset(send_buffer.c_array(), 0, MAX_BUFFER_SIZE); + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_OK; + send_status_temp.send_offset = 0; + send_status_temp.send_end_size = 0; + send_status_temp.edit_division = EDIT_DIVISION_EDIT; + send_status_temp.send_possible_size = 50; + recive_data_global.send_status_list.push_back(send_status_temp); + + memcpy(recive_data_global.recive_buffer, "GET / HTTP/1.0\r\nHOST: KKKKKKKKKKKKKKKKKKKKKKKK\r\n\r\n", 50); + + ret = handle_realserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_SEND); + BOOST_CHECK_EQUAL(send_buffer_len, 50u); + //送信バッファの内容をチェックする。 + cmp_ret = memcmp(send_buffer.c_array(), recive_data_global.recive_buffer, 50); + BOOST_CHECK_EQUAL(cmp_ret, 0); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.begin()->edit_data_list.size(), 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_end_size, 50u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_EDIT); +} + +//handle_realserver_connect_test_thread +void handle_realserver_connect_test_thread(){ + EVENT_TAG ret; + boost::array send_buffer; + send_status send_status_temp; + recive_data recive_data_tmp; + boost::thread down_thread(&down_thread_func); + boost::asio::ip::tcp::endpoint endpoint_local = string_to_endpoint("10.10.10.1:8080"); + thread_data_ptr psession_thread_data(new session_thread_data_sessionless); + init_session_thread_data_sessionless(psession_thread_data, down_thread.get_id()); + psession_thread_data->client_endpoint_tcp = endpoint_local; + + { + boost::mutex::scoped_lock sclock(this->session_thread_data_map_mutex); + this->session_thread_data_map[boost::this_thread::get_id()] = psession_thread_data; + this->forwarded_for = 1; + } + + init_recive_data(recive_data_tmp); + + psession_thread_data->recive_data_map[endpoint_local] = recive_data_tmp; + std::map::iterator it = + psession_thread_data->recive_data_map.find(endpoint_local); + recive_data& recive_data_global = it->second; + + const char* forwarded_exist = "POST / HTTP/1.0\r\nX-Forwarded-For: 10.10.2.2\r\nContent-Length: 65465\r\n\r\n"; + const int exist_len = 70; + const int exist_leave_len = 65465; + const int forwarded_offset = 17; + + cout << "[189]--------------------------------------------- " << endl; + // unit_test[189] 編集データリストが空の場合 + // unit_test[189] ●送信バッファ残サイズ > 0 かつ 送信可能データサイズ > 0 + // unit_test[189] ●送信バッファ残サイズ < 送信可能データサイズ + recive_data_global.recive_buffer_max_size = MAX_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 0; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + size_t send_buffer_len = 0; + memset(send_buffer.c_array(), 0, MAX_BUFFER_SIZE); + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_OK; + send_status_temp.send_offset = 0; + send_status_temp.send_end_size = 0; + send_status_temp.edit_division = EDIT_DIVISION_EDIT; + send_status_temp.send_possible_size = MAX_BUFFER_SIZE; + recive_data_global.send_status_list.push_back(send_status_temp); + + memcpy(recive_data_global.recive_buffer, forwarded_exist, exist_len); + memset(recive_data_global.recive_buffer + exist_len, 'x', exist_leave_len); + + ret = handle_realserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + + { + boost::mutex::scoped_lock sclock(check_mutex); + BOOST_CHECK_EQUAL(ret, REALSERVER_SEND); + BOOST_CHECK_EQUAL(send_buffer_len, MAX_BUFFER_SIZE); + //送信バッファの内容をチェックする。 + int cmp_ret = memcmp(send_buffer.c_array(), recive_data_global.recive_buffer, forwarded_offset); + BOOST_CHECK_EQUAL(cmp_ret, 0); + cmp_ret = memcmp(send_buffer.c_array() + forwarded_offset, "X-Forwarded-For: 10.10.2.2, 10.10.10.1\r\n", 40); + BOOST_CHECK_EQUAL(cmp_ret, 0); + cmp_ret = memcmp(send_buffer.c_array() + forwarded_offset + 40, recive_data_global.recive_buffer + forwarded_offset + + 28, MAX_BUFFER_SIZE - forwarded_offset - 40); + BOOST_CHECK_EQUAL(cmp_ret, 0); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.begin()->edit_data_list.size(), 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_end_size, MAX_BUFFER_SIZE - 12u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 12u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_NO_EDIT); + } +} + +//handle_realserver_connection_fail 馮家純 +void handle_realserver_connection_fail_test() { + EVENT_TAG ret; + + cout << "[190]--------------------------------------------- " << endl; + //unit_test[190] 異常系 session_thread_data_map中にThreadID対応のデータがない + this->session_thread_data_map.clear(); + + this->session_thread_data_map[boost::this_thread::get_id()].reset(); + boost::asio::ip::tcp::endpoint ep_err1; + ret = this->handle_realserver_connection_fail(boost::this_thread::get_id(), ep_err1); + + //遷移先ステータスを設定する status = FINALIZE + BOOST_CHECK_EQUAL(ret, FINALIZE); + + cout << "[191]--------------------------------------------- " << endl; + //unit_test[191] 異常系 session_thread_data_map中にThreadIDなし場合のテスト + this->session_thread_data_map.clear(); + + ret = this->handle_realserver_connection_fail(boost::this_thread::get_id(), ep_err1); + + //遷移先ステータスを設定する status = FINALIZE + BOOST_CHECK_EQUAL(ret, FINALIZE); + + cout << "[192]--------------------------------------------- " << endl; + //unit_test[192] 終了フラグ,遷移先ステータス + boost::asio::ip::tcp::endpoint ep; + + thread_data_ptr data(new session_thread_data_sessionless); + data->thread_id = boost::this_thread::get_id(); + this->session_thread_data_map[boost::this_thread::get_id()] = data; + + ret = this->handle_realserver_connection_fail(boost::this_thread::get_id(), ep); + + //終了フラグをON + BOOST_CHECK_EQUAL(data->end_flag, END_FLAG_ON); + //遷移先ステータス status = CLIENT_DISCONNECT + BOOST_CHECK_EQUAL(ret, CLIENT_DISCONNECT); +} + +//handle_realserver_connection_fail_thread 馮家純 +void handle_realserver_connection_fail_test_thread() { + cout << "[193]--------------------------------------------- " << endl; + //unit_test[193] 終了フラグ,遷移先ステータス + EVENT_TAG ret; + boost::asio::ip::tcp::endpoint ep; + + thread_data_ptr data(new session_thread_data_sessionless); + data->thread_id = boost::this_thread::get_id(); + { + boost::mutex::scoped_lock sclock(this->session_thread_data_map_mutex); + this->session_thread_data_map[boost::this_thread::get_id()] = data; + } + + ret = this->handle_realserver_connection_fail(boost::this_thread::get_id(), ep); + + { + boost::mutex::scoped_lock sclock(check_mutex); + //終了フラグをON + BOOST_CHECK_EQUAL(data->end_flag, END_FLAG_ON); + //遷移先ステータス status = CLIENT_DISCONNECT + BOOST_CHECK_EQUAL(ret, CLIENT_DISCONNECT); + } +} + +//handle_realserver_send 董作方 +void handle_realserver_send_test(){ + boost::asio::ip::tcp::endpoint endpoint = string_to_endpoint ("10.10.100.100:8800"); + send_status real_send_status ,real_send_status1 ; + recive_data real_recive_data; + thread_data_ptr data_pro(new session_thread_data_sessionless); + + cout << "[194]--------------------------------------------- " << endl; + //unit_test[194] session_thread_data_map中にthread_id無し + EVENT_TAG event_status + = this->handle_realserver_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(event_status, FINALIZE); + + cout << "[195]--------------------------------------------- " << endl; + //unit_test[195] session_thread_data_map中にsession_thread_data_sessionless無し + thread_data_ptr thread_data1 ; + + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data1; + event_status = this->handle_realserver_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(event_status, FINALIZE); + + cout << "[196]--------------------------------------------- " << endl; + //unit_test[196] recive_data_map中にendpoint無し + this->session_thread_data_map.clear(); + this->session_thread_data_map[boost::this_thread::get_id()] = data_pro; + event_status = this->handle_realserver_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(event_status, FINALIZE); + + cout << "[197]--------------------------------------------- " << endl; + //unit_test[197] send_status_list中にsend_status無し + real_recive_data.send_status_list.clear(); + data_pro->recive_data_map[endpoint] = real_recive_data; + + this->session_thread_data_map.clear(); + this->session_thread_data_map[boost::this_thread::get_id()] = data_pro; + + event_status = this->handle_realserver_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(event_status, FINALIZE); + + cout << "[198]--------------------------------------------- " << endl; + //unit_test[198] 送信状態->SEND_OK,送信可能データサイズ > 0/送信可能データあり + //unit_test[198] test data: 送信状態に送信待を設定,送信データオフセットに送信済データサイズを加算する,送信済データサイズに0を設定する,遷移先ステータスを設定する + real_send_status.send_possible_size = 1u;//送信可能データサイズ > 0 + real_send_status.edit_data_list.clear();//編集データリスト=0 + real_send_status.send_offset = 0u; + real_send_status.send_end_size = 1u; + real_send_status.status = SEND_OK;//送信状態->SEND_OK + real_recive_data.send_status_list.push_back(real_send_status); + + data_pro->client_endpoint_tcp = endpoint; + data_pro->recive_data_map.clear(); + data_pro->recive_data_map.insert(std::pair(endpoint,real_recive_data)); + + this->session_thread_data_map.clear(); + this->session_thread_data_map[boost::this_thread::get_id()] = data_pro; + event_status = this->handle_realserver_send(boost::this_thread::get_id()); + + BOOST_CHECK_EQUAL(event_status, REALSERVER_CONNECT);//遷移先ステータスを設定する + + SEND_STATUS_TAG send_status = data_pro->recive_data_map[endpoint].send_status_list.front().status; + size_t offset = data_pro->recive_data_map[endpoint].send_status_list.front().send_offset; + size_t end_size = data_pro->recive_data_map[endpoint].send_status_list.front().send_end_size; + + BOOST_CHECK_EQUAL(send_status,SEND_OK); //送信状態に送信待を設定する + BOOST_CHECK_EQUAL(offset,1u);//送信データオフセットに送信済データサイズを加算する + BOOST_CHECK_EQUAL(end_size,0u); //送信済データサイズに0を設定する + + cout << "[199]--------------------------------------------- " << endl; + //unit_test[199] 送信状態->SEND_NG + //unit_test[199] test data:遷移先ステータスを設定する + real_send_status.status = SEND_NG;//送信状態->SEND_NG + real_recive_data.send_status_list.clear(); + real_recive_data.send_status_list.push_back(real_send_status); + data_pro->recive_data_map.clear(); + data_pro->client_endpoint_tcp = endpoint; + data_pro->recive_data_map.insert(std::pair(endpoint,real_recive_data)); + + this->session_thread_data_map.clear(); + this->session_thread_data_map[boost::this_thread::get_id()] = data_pro; + event_status = this->handle_realserver_send(boost::this_thread::get_id()); + + BOOST_CHECK_EQUAL(event_status, FINALIZE); //遷移先ステータスを設定する + + cout << "[200]--------------------------------------------- " << endl; + //unit_test[200] 送信状態->SEND_CONTINUE + //unit_test[200] test data:遷移先ステータスを設定する + real_send_status.status = SEND_CONTINUE; //送信状態->SEND_CONTINUE + real_recive_data.send_status_list.clear(); + real_recive_data.send_status_list.push_back(real_send_status); + + data_pro->client_endpoint_tcp = endpoint; + data_pro->recive_data_map.clear(); + data_pro->recive_data_map.insert(std::pair(endpoint,real_recive_data)); + + this->session_thread_data_map.clear(); + this->session_thread_data_map[boost::this_thread::get_id()] = data_pro; + event_status = this->handle_realserver_send(boost::this_thread::get_id()); + + BOOST_CHECK_EQUAL(event_status, FINALIZE); //遷移先ステータスを設定する + + cout << "[201]--------------------------------------------- " << endl; + //unit_test[201] 送信状態->SEND_OK,送信可能データサイズ = 0/送信データ残サイズ > 0/送信可能データなし + //unit_test[201] test data: 送信状態に送信待を設定 + real_send_status.send_possible_size = 0u;//送信可能データサイズ=0 + real_send_status.send_rest_size = 1u;//送信データ残サイズ > 0 + real_send_status.status = SEND_OK; + real_recive_data.send_status_list.clear(); + real_recive_data.send_status_list.push_back(real_send_status); + + data_pro->client_endpoint_tcp = endpoint; + data_pro->recive_data_map.clear(); + data_pro->recive_data_map.insert(std::pair(endpoint,real_recive_data)); + + this->session_thread_data_map.clear(); + this->session_thread_data_map[boost::this_thread::get_id()] = data_pro; + event_status = this->handle_realserver_send(boost::this_thread::get_id()); + send_status = data_pro->recive_data_map[endpoint].send_status_list.front().status; + + BOOST_CHECK_EQUAL(event_status, CLIENT_RECV); //遷移先ステータスを設定する + BOOST_CHECK_EQUAL(send_status, SEND_CONTINUE); //送信状態に送信待を設定する + + cout << "[202]--------------------------------------------- " << endl; + //unit_test[202] 送信状態->SEND_OK,送信可能データサイズ = 0/送信データ残サイズ = 0/送信可能データなし + //unit_test[202] test data: 送信状態に送信待を設定 + real_send_status.send_possible_size = 0u;//送信可能データサイズ=0 + real_send_status.send_rest_size = 0u;//送信データ残サイズ = 0 + real_send_status.status = SEND_OK;//送信状態->SEND_OK + real_recive_data.send_status_list.clear(); + real_recive_data.send_status_list.push_back(real_send_status); + + data_pro->client_endpoint_tcp = endpoint; + data_pro->recive_data_map.clear(); + data_pro->recive_data_map.insert(std::pair(endpoint,real_recive_data)); + + this->session_thread_data_map.clear(); + this->session_thread_data_map[boost::this_thread::get_id()] = data_pro; + event_status = this->handle_realserver_send(boost::this_thread::get_id()); + send_status = data_pro->recive_data_map[endpoint].send_status_list.front().status; + + BOOST_CHECK_EQUAL(event_status, CLIENT_RECV); //遷移先ステータスを設定する + BOOST_CHECK_EQUAL(send_status, SEND_END); //送信状態に送信待を設定する + + cout << "[203]--------------------------------------------- " << endl; + //unit_test[203] 送信状態->SEND_OK,SEND_OK,送信可能データサイズ = 0,送信データ残サイズ > 0 + //unit_test[203] test data: 送信状態に送信継続を設定,遷移先ステータスを設定する + real_send_status.send_possible_size = 0u;//送信可能データサイズ = 0 + real_send_status.status = SEND_OK; //送信状態->SEND_OK + real_send_status.send_rest_size = 1u; //送信データ残サイズ > 0 + real_send_status1.status = SEND_OK; + real_recive_data.send_status_list.clear(); + real_recive_data.send_status_list.push_back(real_send_status); + real_recive_data.send_status_list.push_back(real_send_status1); + + data_pro->client_endpoint_tcp = endpoint; + data_pro->recive_data_map.clear(); + data_pro->recive_data_map.insert(std::pair(endpoint,real_recive_data)); + + this->session_thread_data_map.clear(); + this->session_thread_data_map[boost::this_thread::get_id()] = data_pro; + event_status = this->handle_realserver_send(boost::this_thread::get_id()); + + BOOST_CHECK_EQUAL(event_status, FINALIZE); //遷移先ステータスを設定する + + cout << "[204]--------------------------------------------- " << endl; + //unit_test[204] 送信状態->SEND_OK,SEND_OK,送信可能データサイズ = 0/送信データ残サイズ = 0 + //unit_test[204] test data: 送信状態に送信継続を設定,遷移先ステータスを設定する + real_send_status.send_possible_size = 0u;//送信可能データサイズ = 0 + real_send_status.status = SEND_OK; //送信状態->SEND_OK + real_send_status.send_rest_size = 0u; //送信データ残サイズ = 0 + real_send_status1.status = SEND_OK; + real_recive_data.send_status_list.clear(); + real_recive_data.send_status_list.push_back(real_send_status); + real_recive_data.send_status_list.push_back(real_send_status1); + + data_pro->client_endpoint_tcp = endpoint; + data_pro->recive_data_map.clear(); + data_pro->recive_data_map.insert(std::pair(endpoint,real_recive_data)); + + this->session_thread_data_map.clear(); + this->session_thread_data_map[boost::this_thread::get_id()] = data_pro; + event_status = this->handle_realserver_send(boost::this_thread::get_id()); + send_status = data_pro->recive_data_map[endpoint].send_status_list.front().status; + + BOOST_CHECK_EQUAL(event_status, REALSERVER_CONNECT); //遷移先ステータスを設定する + BOOST_CHECK_EQUAL(send_status, SEND_END); //送信データ残サイズ = 0,送信状態に送信済を設定する + + cout << "[205]--------------------------------------------- " << endl; + //unit_test[205] 送信状態->SEND_OK,SEND_NG,送信可能データサイズ = 0/送信データ残サイズ > 0 + //unit_test[205] test data: 遷移先ステータスを設定する + real_send_status.send_possible_size = 0u;//送信可能データサイズ = 0 + real_send_status.status = SEND_OK; //送信状態->SEND_OK + real_send_status.send_rest_size = 1u; //送信データ残サイズ > 0 + real_send_status1.status = SEND_NG; + real_recive_data.send_status_list.clear(); + real_recive_data.send_status_list.push_back(real_send_status); + real_recive_data.send_status_list.push_back(real_send_status1); + + data_pro->client_endpoint_tcp = endpoint; + data_pro->recive_data_map.clear(); + data_pro->recive_data_map.insert(std::pair(endpoint,real_recive_data)); + + this->session_thread_data_map.clear(); + this->session_thread_data_map[boost::this_thread::get_id()] = data_pro; + event_status = this->handle_realserver_send(boost::this_thread::get_id()); + + BOOST_CHECK_EQUAL(event_status, FINALIZE); //遷移先ステータスを設定する + + cout << "[206]--------------------------------------------- " << endl; + //unit_test[206] 送信状態->SEND_OK,SEND_NG,送信可能データサイズ = 0/送信データ残サイズ = 0 + //unit_test[206] test data: 送信状態に送信継続を設定,遷移先ステータスを設定する + real_send_status.send_possible_size = 0u;//送信可能データサイズ = 0 + real_send_status.status = SEND_OK; //送信状態->SEND_OK + real_send_status.send_rest_size = 0u; //送信データ残サイズ = 0 + real_send_status1.status = SEND_NG; + real_recive_data.send_status_list.clear(); + real_recive_data.send_status_list.push_back(real_send_status); + real_recive_data.send_status_list.push_back(real_send_status1); + + data_pro->client_endpoint_tcp = endpoint; + data_pro->recive_data_map.clear(); + data_pro->recive_data_map.insert(std::pair(endpoint,real_recive_data)); + + this->session_thread_data_map.clear(); + this->session_thread_data_map[boost::this_thread::get_id()] = data_pro; + event_status = this->handle_realserver_send(boost::this_thread::get_id()); + send_status = data_pro->recive_data_map[endpoint].send_status_list.front().status; + + BOOST_CHECK_EQUAL(event_status, CLIENT_RECV); //遷移先ステータスを設定する + BOOST_CHECK_EQUAL(send_status, SEND_END); //送信データ残サイズ = 0,送信状態に送信済を設定する + + cout << "[207]--------------------------------------------- " << endl; + //unit_test[207] 送信状態->SEND_END,SEND_OK,送信可能データサイズ > 0 + //unit_test[207] test data: 送信状態に送信継続を設定,遷移先ステータスを設定する + real_send_status.status = SEND_END; //送信状態->SEND_OK + real_send_status1.send_possible_size = 1u; + real_send_status1.status = SEND_OK; + real_recive_data.send_status_list.clear(); + real_recive_data.send_status_list.push_back(real_send_status); + real_recive_data.send_status_list.push_back(real_send_status1); + + data_pro->client_endpoint_tcp = endpoint; + data_pro->recive_data_map.clear(); + data_pro->recive_data_map.insert(std::pair(endpoint,real_recive_data)); + + this->session_thread_data_map.clear(); + this->session_thread_data_map[boost::this_thread::get_id()] = data_pro; + event_status = this->handle_realserver_send(boost::this_thread::get_id()); + send_status = data_pro->recive_data_map[endpoint].send_status_list.back().status; + + BOOST_CHECK_EQUAL(event_status, REALSERVER_CONNECT); //遷移先ステータスを設定する + BOOST_CHECK_EQUAL(send_status, SEND_OK); //送信データ残サイズ > 0,送信状態に送信継続を設定する + + cout << "[208]--------------------------------------------- " << endl; + //unit_test[208] 送信状態->SEND_END,SEND_OK,送信可能データサイズ = 0/送信データ残サイズ > 0 + //unit_test[208] test data: 送信状態に送信継続を設定,遷移先ステータスを設定する + real_send_status.status = SEND_END; //送信状態->SEND_END + real_send_status1.send_rest_size = 1u; //送信データ残サイズ > 0 + real_send_status1.send_possible_size = 0u;//送信可能データサイズ = 0 + real_send_status1.status = SEND_OK; + real_recive_data.send_status_list.clear(); + real_recive_data.send_status_list.push_back(real_send_status); + real_recive_data.send_status_list.push_back(real_send_status1); + + data_pro->client_endpoint_tcp = endpoint; + data_pro->recive_data_map.clear(); + data_pro->recive_data_map.insert(std::pair(endpoint,real_recive_data)); + + this->session_thread_data_map.clear(); + this->session_thread_data_map[boost::this_thread::get_id()] = data_pro; + event_status = this->handle_realserver_send(boost::this_thread::get_id()); + send_status = data_pro->recive_data_map[endpoint].send_status_list.back().status; + + BOOST_CHECK_EQUAL(event_status, CLIENT_RECV); //遷移先ステータスを設定する + BOOST_CHECK_EQUAL(send_status, SEND_CONTINUE); //送信データ残サイズ > 0,送信状態に送信済を設定する + + cout << "[209]--------------------------------------------- " << endl; + //unit_test[209] 送信状態->SEND_END + //unit_test[209] test data:遷移先ステータスを設定する + real_send_status.status = SEND_END; //送信状態->SEND_END + real_recive_data.send_status_list.clear(); + real_recive_data.send_status_list.push_back(real_send_status); + + data_pro->client_endpoint_tcp = endpoint; + data_pro->recive_data_map.clear(); + data_pro->recive_data_map.insert(std::pair(endpoint,real_recive_data)); + + this->session_thread_data_map.clear(); + this->session_thread_data_map[boost::this_thread::get_id()] = data_pro; + event_status = this->handle_realserver_send(boost::this_thread::get_id()); + + BOOST_CHECK_EQUAL(event_status, FINALIZE); //遷移先ステータスを設定する + + cout << "[210]--------------------------------------------- " << endl; + //unit_test[210] 送信状態->SEND_END,SEND_OK/送信可能データサイズ = 0/送信データ残サイズ = 0 + real_send_status.status = SEND_END; //送信状態->SEND_END + real_send_status1.status = SEND_OK; //送信状態->SEND_OK + real_send_status1.send_possible_size = 0u; + real_send_status1.send_rest_size = 0u;//送信データ残サイズ = 0 + real_recive_data.send_status_list.clear(); + real_recive_data.send_status_list.push_back(real_send_status); + real_recive_data.send_status_list.push_back(real_send_status1); + + data_pro->client_endpoint_tcp = endpoint; + data_pro->recive_data_map.clear(); + data_pro->recive_data_map.insert(std::pair(endpoint,real_recive_data)); + + this->session_thread_data_map.clear(); + this->session_thread_data_map[boost::this_thread::get_id()] = data_pro; + event_status = this->handle_realserver_send(boost::this_thread::get_id()); + send_status = data_pro->recive_data_map[endpoint].send_status_list.back().status; + + BOOST_CHECK_EQUAL(event_status, CLIENT_RECV); //遷移先ステータスを設定する + BOOST_CHECK_EQUAL(send_status, SEND_END); //送信状態に送信済を設定する + + cout << "[211]--------------------------------------------- " << endl; + //unit_test[211] 送信状態->SEND_CONTINUE,SEND_OK/送信データ残サイズ > 0 + //unit_test[211] test data: 送信状態に送信待を設定,遷移先ステータスを設定する + real_send_status.status = SEND_CONTINUE; //送信状態->SEND_CONTINUE + real_send_status.send_rest_size = 1u; //送信データ残サイズ > 0 + real_send_status.send_possible_size = 0u;//送信可能データサイズ = 0 + real_send_status1.status = SEND_OK; //送信状態->SEND_OK + real_recive_data.send_status_list.clear(); + real_recive_data.send_status_list.push_back(real_send_status); + real_recive_data.send_status_list.push_back(real_send_status1); + + data_pro->client_endpoint_tcp = endpoint; + data_pro->recive_data_map.clear(); + data_pro->recive_data_map.insert(std::pair(endpoint,real_recive_data)); + + this->session_thread_data_map.clear(); + this->session_thread_data_map[boost::this_thread::get_id()] = data_pro; + event_status = this->handle_realserver_send(boost::this_thread::get_id()); + send_status = data_pro->recive_data_map[endpoint].send_status_list.front().status; + + BOOST_CHECK_EQUAL(send_status,SEND_CONTINUE); //送信状態に送信待を設定する + BOOST_CHECK_EQUAL(event_status, FINALIZE); //遷移先ステータスを設定する +} + +//handle_realserver_send 董作方 +void handle_realserver_send_test_thread(){ + boost::asio::ip::tcp::endpoint endpoint = string_to_endpoint ("10.10.100.100:8800"); + send_status real_send_status; + recive_data real_recive_data; + thread_data_ptr data_pro(new session_thread_data_sessionless); + + cout << "[212]--------------------------------------------- " << endl; + //unit_test[212] 多スレッドテスト/送信状態->SEND_OK,送信可能データサイズ = 0/送信データ残サイズ > 0/送信可能データなし + //unit_test[212] test data: 送信状態に送信待を設定 + real_send_status.send_possible_size = 0u;//送信可能データサイズ=0 + real_send_status.send_rest_size = 1u;//送信データ残サイズ > 0 + real_send_status.status = SEND_OK; + real_recive_data.send_status_list.clear(); + real_recive_data.send_status_list.push_back(real_send_status); + + data_pro->client_endpoint_tcp = endpoint; + data_pro->recive_data_map.clear(); + data_pro->recive_data_map.insert(std::pair(endpoint,real_recive_data)); + + { + boost::mutex::scoped_lock sclock(this->session_thread_data_map_mutex); + this->session_thread_data_map[boost::this_thread::get_id()] = data_pro; + } + EVENT_TAG event_status = this->handle_realserver_send(boost::this_thread::get_id()); + SEND_STATUS_TAG send_status = data_pro->recive_data_map[endpoint].send_status_list.front().status; + + { + boost::mutex::scoped_lock sclock(check_mutex); + BOOST_CHECK_EQUAL(event_status, CLIENT_RECV); //遷移先ステータスを設定する + BOOST_CHECK_EQUAL(send_status, SEND_CONTINUE); //送信状態に送信待を設定する + } +} + +//handle_sorryserver_select 馮家純 +void handle_sorryserver_select_test(){ + cout << "[213]--------------------------------------------- " << endl; + //unit_test[213] 該当スレッドの送信可能データを取得する,下りスレッドにsorryserver受信バッファを確保する,送信先endpoint,遷移先ステータス + boost::thread downt(down_thread_func); + boost::asio::ip::tcp::endpoint ep; + + //up,down thread map + thread_data_ptr dataup(new session_thread_data_sessionless); + thread_data_ptr datadown(new session_thread_data_sessionless); + this->session_thread_data_map[boost::this_thread::get_id()] = dataup; + this->session_thread_data_map[downt.get_id()] = datadown; + dataup->thread_id = boost::this_thread::get_id(); + dataup->thread_division = THREAD_DIVISION_UP_STREAM; + dataup->pair_thread_id = downt.get_id(); + datadown->thread_id = downt.get_id(); + datadown->thread_division = THREAD_DIVISION_DOWN_STREAM; + datadown->pair_thread_id = boost::this_thread::get_id(); + datadown->recive_data_map.clear(); + + //send_status送信可能データ + send_status st; + st.status = SEND_OK; + st.send_possible_size = 2u; + dataup->recive_data_map[ep].send_status_list.push_back(st); + + EVENT_TAG ret = this->handle_sorryserver_select(boost::this_thread::get_id(), ep); + + //送信先endpointにendpointを設定する + BOOST_CHECK_EQUAL(dataup->target_endpoint, ep); + //遷移先ステータス status = CLIENT_RECV + BOOST_CHECK_EQUAL(ret, SORRYSERVER_CONNECT); + + cout << "[214]--------------------------------------------- " << endl; + //unit_test[214] session_thread_data_map中に上りスレッド中にThreadID対応のデータがない + this->session_thread_data_map[boost::this_thread::get_id()].reset(); + ret = this->handle_sorryserver_select(boost::this_thread::get_id(), ep); + + //遷移先ステータスを設定する status = FINALIZE + BOOST_CHECK_EQUAL(ret, FINALIZE); + + cout << "[215]--------------------------------------------- " << endl; + //unit_test[215] session_thread_data_map中に上りスレッドのデータ無し場合のテスト + this->session_thread_data_map.erase(boost::this_thread::get_id()); + ret = this->handle_sorryserver_select(boost::this_thread::get_id(), ep); + + //遷移先ステータスを設定する status = FINALIZE + BOOST_CHECK_EQUAL(ret, FINALIZE); + + cout << "[216]--------------------------------------------- " << endl; + //unit_test[216] session_thread_data_map中に上りスレッドと下りスレッドのデータ無し場合のテスト + this->session_thread_data_map.clear(); + ret = this->handle_sorryserver_select(boost::this_thread::get_id(), ep); + + //遷移先ステータスを設定する status = FINALIZE + BOOST_CHECK_EQUAL(ret, FINALIZE); + + cout << "[217]--------------------------------------------- " << endl; + //unit_test[217] session_thread_data_map中に下りスレッドのデータ無し場合のテスト + this->session_thread_data_map.clear(); + this->session_thread_data_map[boost::this_thread::get_id()] = dataup; + ret = this->handle_sorryserver_select(boost::this_thread::get_id(), ep); + //送信先endpointにendpointを設定する + BOOST_CHECK_EQUAL(dataup->target_endpoint, ep); + //遷移先ステータス status = SORRYSERVER_CONNECT + BOOST_CHECK_EQUAL(ret, SORRYSERVER_CONNECT); + + cout << "[218]--------------------------------------------- " << endl; + //unit_test[218] sorryserverが決定済みで、送信可能データがない場合、CLIENT_RECVを返す。 + this->session_thread_data_map.clear(); + boost::asio::ip::tcp::endpoint ep_1; + thread_data_ptr data_1(new session_thread_data_sessionless); + data_1->client_endpoint_tcp = ep_1; + data_1->recive_data_map[ep_1]; + this->session_thread_data_map[boost::this_thread::get_id()] = data_1; + ret = this->handle_sorryserver_select(boost::this_thread::get_id(), ep_1); + //送信先endpointにendpointを設定する + BOOST_CHECK_EQUAL(dataup->target_endpoint, ep_1); + //遷移先ステータス status = CLIENT_RECV + BOOST_CHECK_EQUAL(ret, CLIENT_RECV); + + cout << "[219]--------------------------------------------- " << endl; + //unit_test[219] sorryserverが決定済みで、送信可能データがある場合、SORRYSERVER_CONNECTを返す + this->session_thread_data_map.clear(); + boost::asio::ip::tcp::endpoint ep_2; + thread_data_ptr data_2(new session_thread_data_sessionless); + data_2->client_endpoint_tcp = ep_2; + //send_status送信可能データ + send_status s_t; + s_t.status = SEND_OK; + s_t.send_possible_size = 2u; + data_2->recive_data_map[ep_2]; + data_2->recive_data_map[ep_2].send_status_list.push_back(s_t); + this->session_thread_data_map[boost::this_thread::get_id()] = data_2; + ret = this->handle_sorryserver_select(boost::this_thread::get_id(), ep_2); + //送信先endpointにendpointを設定する + BOOST_CHECK_EQUAL(dataup->target_endpoint, ep_1); + //遷移先ステータス status = SORRYSERVER_CONNECT + BOOST_CHECK_EQUAL(ret, SORRYSERVER_CONNECT); +} + + +void handle_sorryserver_select_test_thread(){ + cout << "[220]--------------------------------------------- " << endl; + //unit_test[220] 該当スレッドの送信可能データを取得する,下りスレッドにsorryserver受信バッファを確保する,送信先endpoint,遷移先ステータス + boost::thread downt(down_thread_func); + boost::asio::ip::tcp::endpoint ep; + + //up,down thread map + thread_data_ptr dataup(new session_thread_data_sessionless); + thread_data_ptr datadown(new session_thread_data_sessionless); + dataup->thread_id = boost::this_thread::get_id(); + dataup->thread_division = THREAD_DIVISION_UP_STREAM; + dataup->pair_thread_id = downt.get_id(); + datadown->thread_id = downt.get_id(); + datadown->thread_division = THREAD_DIVISION_DOWN_STREAM; + datadown->pair_thread_id = boost::this_thread::get_id(); + datadown->recive_data_map.clear(); + + { + boost::mutex::scoped_lock sclock(this->session_thread_data_map_mutex); + this->session_thread_data_map[boost::this_thread::get_id()] = dataup; + this->session_thread_data_map[downt.get_id()] = datadown; + } + + //send_status送信可能データ + send_status st; + st.status = SEND_OK; + st.send_possible_size = 2u; + dataup->recive_data_map[ep].send_status_list.push_back(st); + + EVENT_TAG ret = this->handle_sorryserver_select(boost::this_thread::get_id(), ep); + + { + boost::mutex::scoped_lock sclock(check_mutex); + //送信先endpointにendpointを設定する + BOOST_CHECK_EQUAL(dataup->target_endpoint, ep); + //遷移先ステータス status = CLIENT_RECV + BOOST_CHECK_EQUAL(ret, SORRYSERVER_CONNECT); + } +} + +//handle_sorryserver_connect 郎希倹 +void handle_sorryserver_connect_test(){ + size_t send_buffer_len = USE_BUFFER_SIZE; + EVENT_TAG ret; + boost::array send_buffer; + send_status send_status_temp; + edit_data edit_data_temp; + boost::thread up_thread(&up_thread_func); + thread_data_ptr psession_thread_data(new session_thread_data_sessionless); + init_session_thread_data_sessionless(psession_thread_data, up_thread.get_id()); + recive_data recive_data_tmp; + init_send_status(send_status_temp); + // recive_dataを作成する + init_recive_data(recive_data_tmp); + recive_data_tmp.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_tmp.recive_buffer_rest_size = USE_BUFFER_SIZE; + + //recive_data_mapを作成する + psession_thread_data->end_flag = END_FLAG_OFF; + psession_thread_data->last_status = CLIENT_RECV; + boost::asio::ip::tcp::endpoint endpoint_local = string_to_endpoint("10.10.10.1:8080"); + + //session_thread_dataを作成する + psession_thread_data->recive_data_map.clear(); + psession_thread_data->recive_data_map[endpoint_local] = recive_data_tmp; + psession_thread_data->client_endpoint_tcp = endpoint_local; + this->forwarded_for = 1; + memcpy(sorry_uri.c_array(), "/sorry.htm", 10); + + cout << "[221]--------------------------------------------- " << endl; + // unit_test[221] boost::this_thread::get_id()対応のデータなし + this->session_thread_data_map.clear(); + ret = handle_sorryserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + BOOST_CHECK_EQUAL(ret, FINALIZE); + + cout << "[222]--------------------------------------------- " << endl; + // unit_test[222] boost::this_thread::get_id()対応のデータsession_thread_dataがNULL + this->session_thread_data_map.clear(); + thread_data_ptr p; + this->session_thread_data_map[boost::this_thread::get_id()] = p; + ret = handle_sorryserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + BOOST_CHECK_EQUAL(ret, FINALIZE); + + this->session_thread_data_map.clear(); + this->session_thread_data_map[boost::this_thread::get_id()] = psession_thread_data; + + cout << "[223]--------------------------------------------- " << endl; + // unit_test[223] endpoint対応のrecive_dataなし + psession_thread_data->recive_data_map.clear(); + send_buffer_len = 0; + memset(send_buffer.c_array(), 0, MAX_BUFFER_SIZE); + + ret = handle_sorryserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + BOOST_CHECK_EQUAL(ret, FINALIZE); + + psession_thread_data->recive_data_map[endpoint_local] = recive_data_tmp; + std::map::iterator it = + psession_thread_data->recive_data_map.find(endpoint_local); + recive_data& recive_data_global = it->second; + + cout << "[224]--------------------------------------------- " << endl; + // unit_test[224] recive_data.recive_buffer=Null + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = USE_BUFFER_SIZE; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = NULL; + send_buffer_len = 0; + memset(send_buffer.c_array(), 0, MAX_BUFFER_SIZE); + + ret = handle_sorryserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + BOOST_CHECK_EQUAL(ret, FINALIZE); + + cout << "[225]--------------------------------------------- " << endl; + // unit_test[225] 送信状態リストが空の場合 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = USE_BUFFER_SIZE; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + + recive_data_global.send_status_list.clear(); + ret = handle_sorryserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + BOOST_CHECK_EQUAL(ret, FINALIZE); + + cout << "[226]--------------------------------------------- " << endl; + // unit_test[226] 送信状態リストの要素の送信状態が1:送信待 2:送信待の場合 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = USE_BUFFER_SIZE; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + send_buffer_len = 0; + memset(send_buffer.c_array(), 0, MAX_BUFFER_SIZE); + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_OK; + send_status_temp.send_offset = 0; + send_status_temp.send_end_size = 0; + send_status_temp.edit_division = EDIT_DIVISION_NO_EDIT; + send_status_temp.send_possible_size = 40; + recive_data_global.send_status_list.push_back(send_status_temp); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_OK; + send_status_temp.send_offset = 40; + send_status_temp.send_end_size = 0; + send_status_temp.edit_division = EDIT_DIVISION_NO_EDIT; + send_status_temp.send_possible_size = 35; + recive_data_global.send_status_list.push_back(send_status_temp); + + memcpy(recive_data_global.recive_buffer, + "GET /Login.aspx HTTP/1.0\r\nHOST: KKKK\r\n\r\nGET / HTTP/1.0\r\nHOST: KKKKKKKKK\r\n\r\n", 75); + + ret = handle_sorryserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + + BOOST_CHECK_EQUAL(ret, SORRYSERVER_SEND); + BOOST_CHECK_EQUAL(send_buffer_len, 40u); + //送信バッファの内容をチェックする。 + int cmp_ret = memcmp(recive_data_global.recive_buffer, send_buffer.c_array(), 40); + BOOST_CHECK_EQUAL(cmp_ret, 0); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 2u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_end_size, 40u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_end_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_possible_size, 35u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_offset, 40u); + + cout << "[227]--------------------------------------------- " << endl; + // unit_test[227] 送信状態リストの要素の送信状態が1:送信待 2:送信不可の場合 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = USE_BUFFER_SIZE; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + send_buffer_len = 0; + memset(send_buffer.c_array(), 0, MAX_BUFFER_SIZE); + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_OK; + send_status_temp.send_offset = 0; + send_status_temp.send_end_size = 0; + send_status_temp.send_possible_size = 30; + send_status_temp.edit_division = EDIT_DIVISION_NO_EDIT; + recive_data_global.send_status_list.push_back(send_status_temp); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_NG; + send_status_temp.send_offset = 30; + send_status_temp.send_end_size = 0; + send_status_temp.unsend_size = 34; + send_status_temp.edit_division = EDIT_DIVISION_NO_EDIT; + recive_data_global.send_status_list.push_back(send_status_temp); + + memcpy(recive_data_global.recive_buffer, + "GET / HTTP/1.0\r\nHOST: KKKK\r\n\r\nGET / HTTP/1.0\r\nHOST: KKKKKKKKK\r\n\r", 64); + + ret = handle_sorryserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + + BOOST_CHECK_EQUAL(ret, SORRYSERVER_SEND); + BOOST_CHECK_EQUAL(send_buffer_len, 30u); + //送信バッファの内容をチェックする。 + cmp_ret = memcmp(recive_data_global.recive_buffer, send_buffer.c_array(), 30); + BOOST_CHECK_EQUAL(cmp_ret, 0); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 2u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_end_size, 30u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_end_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->unsend_size, 34u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_offset, 30u); + + cout << "[228]--------------------------------------------- " << endl; + // unit_test[228] 送信状態リストの要素の送信状態が1:送信待の場合 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = USE_BUFFER_SIZE; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + send_buffer_len = 0; + memset(send_buffer.c_array(), 0, MAX_BUFFER_SIZE); + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_OK; + send_status_temp.send_offset = 0; + send_status_temp.send_end_size = 0; + send_status_temp.edit_division = EDIT_DIVISION_NO_EDIT; + send_status_temp.send_possible_size = 50; + recive_data_global.send_status_list.push_back(send_status_temp); + + memcpy(recive_data_global.recive_buffer, "GET / HTTP/1.0\r\nHOST: KKKKKKKKKKKKKKKKKKKKKKKK\r\n\r\n", 50); + + ret = handle_sorryserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + + BOOST_CHECK_EQUAL(ret, SORRYSERVER_SEND); + BOOST_CHECK_EQUAL(send_buffer_len, 50u); + //送信バッファの内容をチェックする。 + cmp_ret = memcmp(recive_data_global.recive_buffer, send_buffer.c_array(), 50); + BOOST_CHECK_EQUAL(cmp_ret, 0); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_end_size, 50u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_NO_EDIT); + + const char* forwarded_exist = "POST /index.aspx HTTP/1.0\r\nX-Forwarded-For: 10.10.2.2\r\nContent-Length: 65455\r\n\r\n"; + const char* forwarded_not_exist = "POST /index.aspx HTTP/1.0\r\nContent-Length: 65483\r\n\r\n"; + const int exist_len = 80; + const int exist_leave_len = 65455; + const int not_exist_leave_len = 65483; + const int not_exist_len = 52; + + cout << "[229]--------------------------------------------- " << endl; + // unit_test[229] 編集区分 = 編集あり、編集データリストが空の場合 + // unit_test[229] ●送信可能データからHTTPヘッダ(X-Forwarded-For)の検索結果 = 該当あり。 + recive_data_global.recive_buffer_max_size = MAX_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 0; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + send_buffer_len = 0; + memset(send_buffer.c_array(), 0, MAX_BUFFER_SIZE); + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_OK; + send_status_temp.send_offset = 0; + send_status_temp.send_end_size = 0; + send_status_temp.edit_division = EDIT_DIVISION_EDIT; + send_status_temp.send_possible_size = MAX_BUFFER_SIZE; + recive_data_global.send_status_list.push_back(send_status_temp); + + memcpy(recive_data_global.recive_buffer, forwarded_exist, exist_len); + memset(recive_data_global.recive_buffer + exist_len, 'x', exist_leave_len); + + ret = handle_sorryserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + + BOOST_CHECK_EQUAL(ret, SORRYSERVER_SEND); + BOOST_CHECK_EQUAL(send_buffer_len, MAX_BUFFER_SIZE); + //送信バッファの内容をチェックする。 + cmp_ret = memcmp(send_buffer.c_array(), "POST /sorry.htm HTTP/1.0\r\nX-Forwarded-For: 10.10.2.2, 10.10.10.1\r\n", 66); + BOOST_CHECK_EQUAL(cmp_ret, 0); + cmp_ret = memcmp(send_buffer.c_array(), recive_data_global.recive_buffer, 5); + BOOST_CHECK_EQUAL(cmp_ret, 0); + cmp_ret = memcmp(send_buffer.c_array() + 66, + recive_data_global.recive_buffer + 55 , + MAX_BUFFER_SIZE - 66); + BOOST_CHECK_EQUAL(cmp_ret, 0); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.begin()->edit_data_list.size(), 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_end_size, MAX_BUFFER_SIZE - 11u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 11u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_NO_EDIT); + + cout << "[230]--------------------------------------------- " << endl; + // unit_test[230] 編集区分 = 編集あり、編集データリストが空の場合 + // unit_test[230] ●送信可能データからHTTPヘッダ(X-Forwarded-For)の検索結果 = 該当なし。 + recive_data_global.recive_buffer_max_size = MAX_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 0; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + send_buffer_len = 0; + memset(send_buffer.c_array(), 0, MAX_BUFFER_SIZE); + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_OK; + send_status_temp.send_offset = 0; + send_status_temp.send_end_size = 0; + send_status_temp.edit_division = EDIT_DIVISION_EDIT; + send_status_temp.send_possible_size = MAX_BUFFER_SIZE; + recive_data_global.send_status_list.push_back(send_status_temp); + + memcpy(recive_data_global.recive_buffer, forwarded_not_exist, not_exist_len); + memset(recive_data_global.recive_buffer + not_exist_len, 'x', not_exist_leave_len); + + ret = handle_sorryserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + + BOOST_CHECK_EQUAL(ret, SORRYSERVER_SEND); + BOOST_CHECK_EQUAL(send_buffer_len, MAX_BUFFER_SIZE); + //送信バッファの内容をチェックする。 + cmp_ret = memcmp(send_buffer.c_array(), "POST /sorry.htm HTTP/1.0\r\nX-Forwarded-For: 10.10.10.1\r\n", 55); + BOOST_CHECK_EQUAL(cmp_ret, 0); + cmp_ret = memcmp(send_buffer.c_array() + 55, + recive_data_global.recive_buffer + 27, MAX_BUFFER_SIZE - 55); + BOOST_CHECK_EQUAL(cmp_ret, 0); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.begin()->edit_data_list.size(), 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_end_size, MAX_BUFFER_SIZE - 28u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 28u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_NO_EDIT); + + cout << "[231]--------------------------------------------- " << endl; + // unit_test[231] 編集区分 = 編集あり、編集データリストが空でないの場合 + recive_data_global.recive_buffer_max_size = MAX_BUFFER_SIZE + 32; + recive_data_global.recive_buffer_rest_size = 0; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + send_buffer_len = 0; + memset(send_buffer.c_array(), 0, MAX_BUFFER_SIZE); + recive_data_global.send_status_list.clear(); + + memcpy(recive_data_global.recive_buffer, "POST /sorry.htm HTTP/1.0\r\nHOST:123456789012345678901\r\nCookie: monkey=", 69); + memset(recive_data_global.recive_buffer + 69, 'x', MAX_BUFFER_SIZE - 69); + memcpy(recive_data_global.recive_buffer + MAX_BUFFER_SIZE, "\r\nX-Forwarded-For: 10.10.2.2\r\n\r\n", 32); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_OK; + send_status_temp.send_offset = 0; + send_status_temp.send_end_size = MAX_BUFFER_SIZE; + send_status_temp.send_possible_size = 32; + send_status_temp.edit_division = EDIT_DIVISION_EDIT; + recive_data_global.send_status_list.push_back(send_status_temp); + + init_edit_data(edit_data_temp); + edit_data_temp.data = "X-Forwarded-For: 10.10.2.2, 10.10.10.1"; + edit_data_temp.data_size = 38; + edit_data_temp.insert_posission = MAX_BUFFER_SIZE + 2; + edit_data_temp.replace_size = 26; + recive_data_global.send_status_list.begin()->edit_data_list.clear(); + recive_data_global.send_status_list.begin()->edit_data_list.push_back(edit_data_temp); + + ret = handle_sorryserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + + BOOST_CHECK_EQUAL(ret, SORRYSERVER_SEND); + BOOST_CHECK_EQUAL(send_buffer_len, 44u); + //送信バッファの内容をチェックする。 + cmp_ret = memcmp(send_buffer.c_array(), recive_data_global.recive_buffer + MAX_BUFFER_SIZE, 2); + BOOST_CHECK_EQUAL(cmp_ret, 0); + cmp_ret = memcmp(send_buffer.c_array() + 2, "X-Forwarded-For: 10.10.2.2, 10.10.10.1", 38); + BOOST_CHECK_EQUAL(cmp_ret, 0); + cmp_ret = memcmp(send_buffer.c_array() + 40, recive_data_global.recive_buffer + MAX_BUFFER_SIZE + 30, 2); + BOOST_CHECK_EQUAL(cmp_ret, 0); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.begin()->edit_data_list.size(), 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_end_size, MAX_BUFFER_SIZE + 32u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_NO_EDIT); + + cout << "[232]--------------------------------------------- " << endl; + // unit_test[232] 編集データリストが空の場合 + // unit_test[232] ●送信バッファ残サイズ > 0 かつ 送信可能データサイズ > 0 + // unit_test[232] ●送信バッファ残サイズ > 送信可能データサイズ + recive_data_global.recive_buffer_max_size = MAX_BUFFER_SIZE + 32; + recive_data_global.recive_buffer_rest_size = 0; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + send_buffer_len = 0; + memset(send_buffer.c_array(), 0, MAX_BUFFER_SIZE); + recive_data_global.send_status_list.clear(); + + memcpy(recive_data_global.recive_buffer, "POST /sorry.htm HTTP/1.0\r\nHOST:123456789012345678901\r\nCookie: monkey=", 69); + memset(recive_data_global.recive_buffer + 69, 'x', MAX_BUFFER_SIZE - 69); + memcpy(recive_data_global.recive_buffer + MAX_BUFFER_SIZE, "\r\nX-Forwarded-For: 10.10.2.2\r\n\r\n", 32); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_OK; + send_status_temp.send_offset = 0; + send_status_temp.send_end_size = MAX_BUFFER_SIZE; + send_status_temp.send_possible_size = 32; + send_status_temp.edit_division = EDIT_DIVISION_EDIT; + recive_data_global.send_status_list.push_back(send_status_temp); + + init_edit_data(edit_data_temp); + edit_data_temp.data = "X-Forwarded-For: 10.10.2.2, 10.10.10.1"; + edit_data_temp.data_size = 38; + edit_data_temp.insert_posission = MAX_BUFFER_SIZE + 2; + edit_data_temp.replace_size = 26; + recive_data_global.send_status_list.begin()->edit_data_list.clear(); + recive_data_global.send_status_list.begin()->edit_data_list.push_back(edit_data_temp); + + ret = handle_sorryserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + + BOOST_CHECK_EQUAL(ret, SORRYSERVER_SEND); + BOOST_CHECK_EQUAL(send_buffer_len, 44u); + //送信バッファの内容をチェックする。 + cmp_ret = memcmp(send_buffer.c_array(), recive_data_global.recive_buffer + MAX_BUFFER_SIZE, 2); + BOOST_CHECK_EQUAL(cmp_ret, 0); + cmp_ret = memcmp(send_buffer.c_array() + 2, "X-Forwarded-For: 10.10.2.2, 10.10.10.1", 38); + BOOST_CHECK_EQUAL(cmp_ret, 0); + cmp_ret = memcmp(send_buffer.c_array() + 40, recive_data_global.recive_buffer + MAX_BUFFER_SIZE + 30, 2); + BOOST_CHECK_EQUAL(cmp_ret, 0); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.begin()->edit_data_list.size(), 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_end_size, MAX_BUFFER_SIZE + 32u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_NO_EDIT); + + cout << "[233]--------------------------------------------- " << endl; + // unit_test[233] 編集データリストが空の場合 + // unit_test[233] ●送信バッファ残サイズ > 0 かつ 送信可能データサイズ > 0 + // unit_test[233] ●送信バッファ残サイズ = 送信可能データサイズ + recive_data_global.recive_buffer_max_size = MAX_BUFFER_SIZE - 11; + recive_data_global.recive_buffer_rest_size = 0; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + send_buffer_len = 0; + memset(send_buffer.c_array(), 0, MAX_BUFFER_SIZE); + recive_data_global.send_status_list.clear(); + + memcpy(recive_data_global.recive_buffer, "POST /index.aspx HTTP/1.0\r\nHOST:123456789012345678901\r\nCookie: monkey=", 70); + memset(recive_data_global.recive_buffer + 70, 'x', MAX_BUFFER_SIZE - 113); + memcpy(recive_data_global.recive_buffer + MAX_BUFFER_SIZE - 43, "\r\nX-Forwarded-For: 10.10.2.2\r\n\r\n", 32); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_OK; + send_status_temp.send_offset = 0; + send_status_temp.send_end_size = 0; + send_status_temp.send_possible_size = MAX_BUFFER_SIZE - 11; + send_status_temp.edit_division = EDIT_DIVISION_EDIT; + recive_data_global.send_status_list.push_back(send_status_temp); + + ret = handle_sorryserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + + BOOST_CHECK_EQUAL(ret, SORRYSERVER_SEND); + BOOST_CHECK_EQUAL(send_buffer_len, MAX_BUFFER_SIZE); + //送信バッファの内容をチェックする。 + cmp_ret = memcmp(send_buffer.c_array(), "POST ", 5); + BOOST_CHECK_EQUAL(cmp_ret, 0); + cmp_ret = memcmp(send_buffer.c_array() + 5, "/sorry.htm", 10); + BOOST_CHECK_EQUAL(cmp_ret, 0); + cmp_ret = memcmp(send_buffer.c_array() + 15, recive_data_global.recive_buffer + 16, MAX_BUFFER_SIZE - 57); + BOOST_CHECK_EQUAL(cmp_ret, 0); + cmp_ret = memcmp(send_buffer.c_array() + MAX_BUFFER_SIZE - 42, "X-Forwarded-For: 10.10.2.2, 10.10.10.1", 38); + BOOST_CHECK_EQUAL(cmp_ret, 0); + cmp_ret = memcmp(send_buffer.c_array() + MAX_BUFFER_SIZE - 4, "\r\n\r\n", 4); + BOOST_CHECK_EQUAL(cmp_ret, 0); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.begin()->edit_data_list.size(), 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_end_size, MAX_BUFFER_SIZE - 11u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_NO_EDIT); + + cout << "[234]--------------------------------------------- " << endl; + // unit_test[234] 編集データリストが空の場合 + // unit_test[234] ●送信バッファ残サイズ > 0 かつ 送信可能データサイズ > 0 + // unit_test[234] ●送信バッファ残サイズ < 送信可能データサイズ + recive_data_global.recive_buffer_max_size = MAX_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 0; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + send_buffer_len = 0; + memset(send_buffer.c_array(), 0, MAX_BUFFER_SIZE); + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_OK; + send_status_temp.send_offset = 0; + send_status_temp.send_end_size = 0; + send_status_temp.edit_division = EDIT_DIVISION_EDIT; + send_status_temp.send_possible_size = MAX_BUFFER_SIZE; + recive_data_global.send_status_list.push_back(send_status_temp); + + memcpy(recive_data_global.recive_buffer, forwarded_exist, exist_len); + memset(recive_data_global.recive_buffer + exist_len, 'x', exist_leave_len); + + ret = handle_sorryserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + + BOOST_CHECK_EQUAL(ret, SORRYSERVER_SEND); + BOOST_CHECK_EQUAL(send_buffer_len, MAX_BUFFER_SIZE); + //送信バッファの内容をチェックする。 + cmp_ret = memcmp(send_buffer.c_array(), "POST /sorry.htm HTTP/1.0\r\nX-Forwarded-For: 10.10.2.2, 10.10.10.1\r\n", 66); + BOOST_CHECK_EQUAL(cmp_ret, 0); + cmp_ret = memcmp(send_buffer.c_array(), recive_data_global.recive_buffer, 5); + BOOST_CHECK_EQUAL(cmp_ret, 0); + cmp_ret = memcmp(send_buffer.c_array() + 66, + recive_data_global.recive_buffer + 55 , + MAX_BUFFER_SIZE - 66); + BOOST_CHECK_EQUAL(cmp_ret, 0); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.begin()->edit_data_list.size(), 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_end_size, MAX_BUFFER_SIZE - 11u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 11u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_NO_EDIT); + + cout << "[235]--------------------------------------------- " << endl; + // unit_test[235] 編集データリストが空の場合 + // unit_test[235] ●送信バッファ残サイズ = 0 + recive_data_global.recive_buffer_max_size = MAX_BUFFER_SIZE - 9; + recive_data_global.recive_buffer_rest_size = 0; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + send_buffer_len = 0; + memset(send_buffer.c_array(), 0, MAX_BUFFER_SIZE); + recive_data_global.send_status_list.clear(); + + memcpy(recive_data_global.recive_buffer, "POST /index.aspx HTTP/1.0\r\nHOST:12345678901\r\nCookie: monkey=", 60); + memset(recive_data_global.recive_buffer + 60, 'x', MAX_BUFFER_SIZE - 101); + memcpy(recive_data_global.recive_buffer + MAX_BUFFER_SIZE - 41, "\r\nX-Forwarded-For: 10.10.2.2\r\n\r\n", 32); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_OK; + send_status_temp.send_offset = 0; + send_status_temp.send_end_size = 0; + send_status_temp.send_possible_size = MAX_BUFFER_SIZE - 9; + send_status_temp.edit_division = EDIT_DIVISION_EDIT; + recive_data_global.send_status_list.push_back(send_status_temp); + + ret = handle_sorryserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + + BOOST_CHECK_EQUAL(ret, SORRYSERVER_SEND); + BOOST_CHECK_EQUAL(send_buffer_len, MAX_BUFFER_SIZE); + //送信バッファの内容をチェックする。 + cmp_ret = memcmp(send_buffer.c_array(), "POST /sorry.htm", 15); + BOOST_CHECK_EQUAL(cmp_ret, 0); + cmp_ret = memcmp(send_buffer.c_array() + 15, recive_data_global.recive_buffer + 16, MAX_BUFFER_SIZE - 55); + BOOST_CHECK_EQUAL(cmp_ret, 0); + cmp_ret = memcmp(send_buffer.c_array() + MAX_BUFFER_SIZE - 40, "X-Forwarded-For: 10.10.2.2, 10.10.10.1\r\n", 40); + BOOST_CHECK_EQUAL(cmp_ret, 0); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.begin()->edit_data_list.size(), 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_end_size, MAX_BUFFER_SIZE - 11u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 2u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_NO_EDIT); + + cout << "[236]--------------------------------------------- " << endl; + // unit_test[236] 編集データリストが空の場合 + // unit_test[236] ●送信可能データサイズ = 0 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = USE_BUFFER_SIZE; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + send_buffer_len = 0; + memset(send_buffer.c_array(), 0, MAX_BUFFER_SIZE); + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_OK; + send_status_temp.send_offset = 0; + send_status_temp.send_end_size = 0; + send_status_temp.edit_division = EDIT_DIVISION_EDIT; + send_status_temp.send_possible_size = 60; + recive_data_global.send_status_list.push_back(send_status_temp); + + memcpy(recive_data_global.recive_buffer, "GET /index.aspx HTTP/1.0\r\nHOST: KKKKKKKKKKKKKKKKKKKKKKKK\r\n\r\n", 60); + + ret = handle_sorryserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + + BOOST_CHECK_EQUAL(ret, SORRYSERVER_SEND); + BOOST_CHECK_EQUAL(send_buffer_len, 88u); + //送信バッファの内容をチェックする。 + cmp_ret = memcmp(send_buffer.c_array(), + "GET /sorry.htm HTTP/1.0\r\nX-Forwarded-For: 10.10.10.1\r\nHOST: KKKKKKKKKKKKKKKKKKKKKKKK\r\n\r\n", 88); + BOOST_CHECK_EQUAL(cmp_ret, 0); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_end_size, 60u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_NO_EDIT); + + cout << "[237]--------------------------------------------- " << endl; + // unit_test[237] 編集データリストが空でない場合 + // unit_test[237] ●送信バッファ残サイズ > 編集データ設定位置 - 送信済サイズ + // unit_test[237] ●送信バッファ残サイズ > 編集データサイズ + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = USE_BUFFER_SIZE; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + send_buffer_len = 0; + memset(send_buffer.c_array(), 0, MAX_BUFFER_SIZE); + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_OK; + send_status_temp.send_offset = 0; + send_status_temp.send_end_size = 0; + send_status_temp.edit_division = EDIT_DIVISION_EDIT; + send_status_temp.send_possible_size = 60; + recive_data_global.send_status_list.push_back(send_status_temp); + + memcpy(recive_data_global.recive_buffer, "GET /index.aspx HTTP/1.0\r\nHOST: KKKKKKKKKKKKKKKKKKKKKKKK\r\n\r\n", 60); + + ret = handle_sorryserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + + BOOST_CHECK_EQUAL(ret, SORRYSERVER_SEND); + BOOST_CHECK_EQUAL(send_buffer_len, 88u); + //送信バッファの内容をチェックする。 + cmp_ret = memcmp(send_buffer.c_array(), + "GET /sorry.htm HTTP/1.0\r\nX-Forwarded-For: 10.10.10.1\r\nHOST: KKKKKKKKKKKKKKKKKKKKKKKK\r\n\r\n", 88); + BOOST_CHECK_EQUAL(cmp_ret, 0); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_end_size, 60u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_NO_EDIT); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_NO_EDIT); + + cout << "[238]--------------------------------------------- " << endl; + // unit_test[238] 編集データリストが空でない場合 + // unit_test[238] ●送信バッファ残サイズ > 編集データ設定位置 - 送信済サイズ + // unit_test[238] ●送信バッファ残サイズ = 編集データサイズ + recive_data_global.recive_buffer_max_size = MAX_BUFFER_SIZE - 9; + recive_data_global.recive_buffer_rest_size = 0; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + send_buffer_len = 0; + memset(send_buffer.c_array(), 0, MAX_BUFFER_SIZE); + recive_data_global.send_status_list.clear(); + + memcpy(recive_data_global.recive_buffer, "POST /index.aspx HTTP/1.0\r\nHOST:12345678901\r\nCookie: monkey=", 60); + memset(recive_data_global.recive_buffer + 60, 'x', MAX_BUFFER_SIZE - 101); + memcpy(recive_data_global.recive_buffer + MAX_BUFFER_SIZE - 41, "\r\nX-Forwarded-For: 10.10.2.2\r\n\r\n", 32); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_OK; + send_status_temp.send_offset = 0; + send_status_temp.send_end_size = 0; + send_status_temp.send_possible_size = MAX_BUFFER_SIZE - 9; + send_status_temp.edit_division = EDIT_DIVISION_EDIT; + recive_data_global.send_status_list.push_back(send_status_temp); + + ret = handle_sorryserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + + BOOST_CHECK_EQUAL(ret, SORRYSERVER_SEND); + BOOST_CHECK_EQUAL(send_buffer_len, MAX_BUFFER_SIZE); + //送信バッファの内容をチェックする。 + cmp_ret = memcmp(send_buffer.c_array(), "POST /sorry.htm", 15); + BOOST_CHECK_EQUAL(cmp_ret, 0); + cmp_ret = memcmp(send_buffer.c_array() + 15, recive_data_global.recive_buffer + 16, MAX_BUFFER_SIZE - 55); + BOOST_CHECK_EQUAL(cmp_ret, 0); + cmp_ret = memcmp(send_buffer.c_array() + MAX_BUFFER_SIZE - 40, "X-Forwarded-For: 10.10.2.2, 10.10.10.1\r\n", 40); + BOOST_CHECK_EQUAL(cmp_ret, 0); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.begin()->edit_data_list.size(), 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_end_size, MAX_BUFFER_SIZE - 11u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 2u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_NO_EDIT); + + cout << "[239]--------------------------------------------- " << endl; + // unit_test[239] 編集データリストが空でない場合 + // unit_test[239] ●送信バッファ残サイズ > 編集データ設定位置 - 送信済サイズ + // unit_test[239] ●送信バッファ残サイズ < 編集データサイズ + recive_data_global.recive_buffer_max_size = MAX_BUFFER_SIZE + 29; + recive_data_global.recive_buffer_rest_size = 0; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + send_buffer_len = 0; + memset(send_buffer.c_array(), 0, MAX_BUFFER_SIZE); + recive_data_global.send_status_list.clear(); + + memcpy(recive_data_global.recive_buffer, "POST /index.aspx HTTP/1.0\r\nHOST:12345678901\r\nCookie: monkey=", 60); + memset(recive_data_global.recive_buffer + 60, 'x', MAX_BUFFER_SIZE - 63); + memcpy(recive_data_global.recive_buffer + MAX_BUFFER_SIZE - 3, "\r\nX", 3); + memcpy(recive_data_global.recive_buffer + MAX_BUFFER_SIZE, "-Forwarded-For: 10.10.2.2\r\n\r\n", 29); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_OK; + send_status_temp.send_offset = 0; + send_status_temp.send_end_size = 0; + send_status_temp.send_possible_size = MAX_BUFFER_SIZE + 29; + send_status_temp.edit_division = EDIT_DIVISION_EDIT; + recive_data_global.send_status_list.push_back(send_status_temp); + + ret = handle_sorryserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + + BOOST_CHECK_EQUAL(ret, SORRYSERVER_SEND); + BOOST_CHECK_EQUAL(send_buffer_len, MAX_BUFFER_SIZE - 2u); + + //送信バッファの内容をチェックする。 + cmp_ret = memcmp(send_buffer.c_array(), "POST /sorry.htm", 15); + BOOST_CHECK_EQUAL(cmp_ret, 0); + cmp_ret = memcmp(send_buffer.c_array() + 15, recive_data_global.recive_buffer + 16, MAX_BUFFER_SIZE - 17); + BOOST_CHECK_EQUAL(cmp_ret, 0); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.begin()->edit_data_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_end_size, MAX_BUFFER_SIZE - 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 30u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_EDIT); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_data_list.begin()->data, + "X-Forwarded-For: 10.10.2.2, 10.10.10.1"); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_data_list.begin()->data_size, 38u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_data_list.begin()->insert_posission, + MAX_BUFFER_SIZE - 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_data_list.begin()->replace_size, 26u); + + cout << "[240]--------------------------------------------- " << endl; + // unit_test[240] 編集データリストが空でない場合 + // unit_test[240] ●送信バッファ残サイズ = 編集データ設定位置 - 送信済サイズ + // unit_test[240] ●送信バッファ残サイズ < 編集データサイズ + recive_data_global.recive_buffer_max_size = MAX_BUFFER_SIZE + 31; + recive_data_global.recive_buffer_rest_size = 0; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + send_buffer_len = 0; + memset(send_buffer.c_array(), 0, MAX_BUFFER_SIZE); + recive_data_global.send_status_list.clear(); + + memcpy(recive_data_global.recive_buffer, "POST /index.aspx HTTP/1.0\r\nHOST:12345678901\r\nCookie: monkey=", 60); + memset(recive_data_global.recive_buffer + 60, 'x', MAX_BUFFER_SIZE - 61); + memcpy(recive_data_global.recive_buffer + MAX_BUFFER_SIZE - 1, "\r", 1); + memcpy(recive_data_global.recive_buffer + MAX_BUFFER_SIZE, "\nX-Forwarded-For: 10.10.2.2\r\n\r\n", 31); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_OK; + send_status_temp.send_offset = 0; + send_status_temp.send_end_size = 0; + send_status_temp.send_possible_size = MAX_BUFFER_SIZE + 31; + send_status_temp.edit_division = EDIT_DIVISION_EDIT; + recive_data_global.send_status_list.push_back(send_status_temp); + + ret = handle_sorryserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + + BOOST_CHECK_EQUAL(ret, SORRYSERVER_SEND); + BOOST_CHECK_EQUAL(send_buffer_len, MAX_BUFFER_SIZE); + //送信バッファの内容をチェックする。 + cmp_ret = memcmp(send_buffer.c_array(), "POST /sorry.htm", 15); + BOOST_CHECK_EQUAL(cmp_ret, 0); + cmp_ret = memcmp(send_buffer.c_array() + 15, recive_data_global.recive_buffer + 16, MAX_BUFFER_SIZE - 15); + BOOST_CHECK_EQUAL(cmp_ret, 0); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.begin()->edit_data_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_end_size, MAX_BUFFER_SIZE + 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 30u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_EDIT); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_data_list.begin()->data, + "X-Forwarded-For: 10.10.2.2, 10.10.10.1"); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_data_list.begin()->data_size, 38u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_data_list.begin()->insert_posission, + MAX_BUFFER_SIZE + 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_data_list.begin()->replace_size, 26u); + + cout << "[241]--------------------------------------------- " << endl; + // unit_test[241] 編集データリストが空でない場合 + // unit_test[241] ●送信バッファ残サイズ < 編集データ設定位置 - 送信済サイズ + recive_data_global.recive_buffer_max_size = MAX_BUFFER_SIZE + 32; + recive_data_global.recive_buffer_rest_size = 0; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + send_buffer_len = 0; + memset(send_buffer.c_array(), 0, MAX_BUFFER_SIZE); + recive_data_global.send_status_list.clear(); + + memcpy(recive_data_global.recive_buffer, "POST /index.aspx HTTP/1.0\r\nHOST:12345678901\r\nCookie: monkey=", 60); + memset(recive_data_global.recive_buffer + 60, 'x', MAX_BUFFER_SIZE - 60); + memcpy(recive_data_global.recive_buffer + MAX_BUFFER_SIZE, "\r\nX-Forwarded-For: 10.10.2.2\r\n\r\n", 32); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_OK; + send_status_temp.send_offset = 0; + send_status_temp.send_end_size = 0; + send_status_temp.send_possible_size = MAX_BUFFER_SIZE + 32; + send_status_temp.edit_division = EDIT_DIVISION_EDIT; + recive_data_global.send_status_list.push_back(send_status_temp); + + ret = handle_sorryserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + + BOOST_CHECK_EQUAL(ret, SORRYSERVER_SEND); + BOOST_CHECK_EQUAL(send_buffer_len, MAX_BUFFER_SIZE); + //送信バッファの内容をチェックする。 + cmp_ret = memcmp(send_buffer.c_array(), "POST /sorry.htm", 15); + BOOST_CHECK_EQUAL(cmp_ret, 0); + cmp_ret = memcmp(send_buffer.c_array() + 15, recive_data_global.recive_buffer + 16, MAX_BUFFER_SIZE - 15); + BOOST_CHECK_EQUAL(cmp_ret, 0); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.begin()->edit_data_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_end_size, MAX_BUFFER_SIZE + 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 31u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_EDIT); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_data_list.begin()->data, + "X-Forwarded-For: 10.10.2.2, 10.10.10.1"); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_data_list.begin()->data_size, 38u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_data_list.begin()->insert_posission, + MAX_BUFFER_SIZE + 2u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_data_list.begin()->replace_size, 26u); + + cout << "[242]--------------------------------------------- " << endl; + // unit_test[242] 編集区分 = 編集なし + // unit_test[242] ●送信バッファサイズ > 送信可能データサイズ + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = USE_BUFFER_SIZE; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + send_buffer_len = 0; + memset(send_buffer.c_array(), 0, MAX_BUFFER_SIZE); + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_OK; + send_status_temp.send_offset = 0; + send_status_temp.send_end_size = 0; + send_status_temp.edit_division = EDIT_DIVISION_NO_EDIT; + send_status_temp.send_possible_size = 50; + recive_data_global.send_status_list.push_back(send_status_temp); + + memcpy(recive_data_global.recive_buffer, "KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK\r\n\r\n", 50); + + ret = handle_sorryserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + + BOOST_CHECK_EQUAL(ret, SORRYSERVER_SEND); + BOOST_CHECK_EQUAL(send_buffer_len, 50u); + //送信バッファの内容をチェックする。 + cmp_ret = memcmp(recive_data_global.recive_buffer, send_buffer.c_array(), 50); + BOOST_CHECK_EQUAL(cmp_ret, 0); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_end_size, 50u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_NO_EDIT); + + cout << "[243]--------------------------------------------- " << endl; + // unit_test[243] 編集区分 = 編集なし + // unit_test[243] ●送信バッファサイズ = 送信可能データサイズ + recive_data_global.recive_buffer_max_size = MAX_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 0; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + send_buffer_len = 0; + memset(send_buffer.c_array(), 0, MAX_BUFFER_SIZE); + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_OK; + send_status_temp.send_offset = 0; + send_status_temp.send_end_size = 0; + send_status_temp.edit_division = EDIT_DIVISION_NO_EDIT; + send_status_temp.send_possible_size = MAX_BUFFER_SIZE; + recive_data_global.send_status_list.push_back(send_status_temp); + + memset(recive_data_global.recive_buffer, 'x', MAX_BUFFER_SIZE); + + ret = handle_sorryserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + + BOOST_CHECK_EQUAL(ret, SORRYSERVER_SEND); + BOOST_CHECK_EQUAL(send_buffer_len, MAX_BUFFER_SIZE); + //送信バッファの内容をチェックする。 + cmp_ret = memcmp(recive_data_global.recive_buffer, send_buffer.c_array(), MAX_BUFFER_SIZE); + BOOST_CHECK_EQUAL(cmp_ret, 0); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_end_size, MAX_BUFFER_SIZE); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_NO_EDIT); + + cout << "[244]--------------------------------------------- " << endl; + // unit_test[244] 編集区分 = 編集なし + // unit_test[244] ●送信バッファサイズ < 送信可能データサイズ + recive_data_global.recive_buffer_max_size = MAX_BUFFER_SIZE + 1; + recive_data_global.recive_buffer_rest_size = 0; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + send_buffer_len = 0; + memset(send_buffer.c_array(), 0, MAX_BUFFER_SIZE); + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_OK; + send_status_temp.send_offset = 0; + send_status_temp.send_end_size = 0; + send_status_temp.edit_division = EDIT_DIVISION_NO_EDIT; + send_status_temp.send_possible_size = MAX_BUFFER_SIZE + 1; + recive_data_global.send_status_list.push_back(send_status_temp); + + memset(recive_data_global.recive_buffer, 'x', MAX_BUFFER_SIZE + 1); + + ret = handle_sorryserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + + BOOST_CHECK_EQUAL(ret, SORRYSERVER_SEND); + BOOST_CHECK_EQUAL(send_buffer_len, MAX_BUFFER_SIZE); + //送信バッファの内容をチェックする。 + cmp_ret = memcmp(recive_data_global.recive_buffer, send_buffer.c_array(), MAX_BUFFER_SIZE); + BOOST_CHECK_EQUAL(cmp_ret, 0); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_end_size, MAX_BUFFER_SIZE); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_NO_EDIT); + + cout << "[245]--------------------------------------------- " << endl; + // unit_test[245] forwarded_forを設定するの場合、編集区分が1である。 + this->forwarded_for = 1; + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = USE_BUFFER_SIZE; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + send_buffer_len = 0; + memset(send_buffer.c_array(), 0, MAX_BUFFER_SIZE); + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_OK; + send_status_temp.send_offset = 0; + send_status_temp.send_end_size = 0; + send_status_temp.edit_division = EDIT_DIVISION_EDIT; + send_status_temp.send_possible_size = 50; + recive_data_global.send_status_list.push_back(send_status_temp); + + memcpy(recive_data_global.recive_buffer, "GET /index.aspx HTTP/1.0\r\nHOST: KKKKKKKKKKKKKK\r\n\r\n", 50); + + ret = handle_sorryserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + + BOOST_CHECK_EQUAL(ret, SORRYSERVER_SEND); + BOOST_CHECK_EQUAL(send_buffer_len, 78u); + //送信バッファの内容をチェックする。 + cmp_ret = memcmp(send_buffer.c_array(), + "GET /sorry.htm HTTP/1.0\r\nX-Forwarded-For: 10.10.10.1\r\nHOST: KKKKKKKKKKKKKK\r\n\r\n", 78); + BOOST_CHECK_EQUAL(cmp_ret, 0); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.begin()->edit_data_list.size(), 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_end_size, 50u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_NO_EDIT); + + cout << "[246]--------------------------------------------- " << endl; + // unit_test[246] forwarded_forを設定しないの場合、編集区分が1である。 + this->forwarded_for = 0; + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = USE_BUFFER_SIZE; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + send_buffer_len = 0; + memset(send_buffer.c_array(), 0, MAX_BUFFER_SIZE); + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_OK; + send_status_temp.send_offset = 0; + send_status_temp.send_end_size = 0; + send_status_temp.edit_division = EDIT_DIVISION_EDIT; + send_status_temp.send_possible_size = 50; + recive_data_global.send_status_list.push_back(send_status_temp); + + memcpy(recive_data_global.recive_buffer, "GET /index.aspx HTTP/1.0\r\nHOST: KKKKKKKKKKKKKK\r\n\r\n", 50); + + ret = handle_sorryserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + + BOOST_CHECK_EQUAL(ret, SORRYSERVER_SEND); + BOOST_CHECK_EQUAL(send_buffer_len, 49u); + //送信バッファの内容をチェックする。 + cmp_ret = memcmp(send_buffer.c_array(), "GET /sorry.htm HTTP/1.0\r\nHOST: KKKKKKKKKKKKKK\r\n\r\n", 49); + BOOST_CHECK_EQUAL(cmp_ret, 0); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.begin()->edit_data_list.size(), 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_end_size, 50u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_NO_EDIT); +} + +//handle_sorryserver_connect_test_thread +void handle_sorryserver_connect_test_thread(){ + EVENT_TAG ret; + boost::array send_buffer; + send_status send_status_temp; + recive_data recive_data_tmp; + boost::thread down_thread(&down_thread_func); + boost::asio::ip::tcp::endpoint endpoint_local = string_to_endpoint("10.10.10.1:8080"); + thread_data_ptr psession_thread_data(new session_thread_data_sessionless); + init_session_thread_data_sessionless(psession_thread_data, down_thread.get_id()); + psession_thread_data->client_endpoint_tcp = endpoint_local; + + { + boost::mutex::scoped_lock sclock(this->session_thread_data_map_mutex); + this->session_thread_data_map[boost::this_thread::get_id()] = psession_thread_data; + this->forwarded_for = 1; + memcpy(sorry_uri.c_array(), "/sorry.htm", 10); + } + + init_recive_data(recive_data_tmp); + + psession_thread_data->recive_data_map[endpoint_local] = recive_data_tmp; + std::map::iterator it = + psession_thread_data->recive_data_map.find(endpoint_local); + recive_data& recive_data_global = it->second; + + const char* forwarded_exist = "POST /index.aspx HTTP/1.0\r\nX-Forwarded-For: 10.10.2.2\r\nContent-Length: 65455\r\n\r\n"; + const int exist_len = 80; + const int exist_leave_len = 65455; + + cout << "[247]--------------------------------------------- " << endl; + // unit_test[247] 編集データリストが空の場合 + // unit_test[247] ●送信バッファ残サイズ > 0 かつ 送信可能データサイズ > 0 + // unit_test[247] ●送信バッファ残サイズ < 送信可能データサイズ + recive_data_global.recive_buffer_max_size = MAX_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 0; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + size_t send_buffer_len = 0; + memset(send_buffer.c_array(), 0, MAX_BUFFER_SIZE); + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_OK; + send_status_temp.send_offset = 0; + send_status_temp.send_end_size = 0; + send_status_temp.edit_division = EDIT_DIVISION_EDIT; + send_status_temp.send_possible_size = MAX_BUFFER_SIZE; + recive_data_global.send_status_list.push_back(send_status_temp); + + memcpy(recive_data_global.recive_buffer, forwarded_exist, exist_len); + memset(recive_data_global.recive_buffer + exist_len, 'x', exist_leave_len); + + ret = handle_sorryserver_connect(boost::this_thread::get_id(), send_buffer, send_buffer_len); + + { + boost::mutex::scoped_lock sclock(check_mutex); + BOOST_CHECK_EQUAL(ret, SORRYSERVER_SEND); + BOOST_CHECK_EQUAL(send_buffer_len, MAX_BUFFER_SIZE); + //送信バッファの内容をチェックする。 + int cmp_ret = memcmp(send_buffer.c_array(), "POST /sorry.htm HTTP/1.0\r\nX-Forwarded-For: 10.10.2.2, 10.10.10.1\r\n", 66); + BOOST_CHECK_EQUAL(cmp_ret, 0); + cmp_ret = memcmp(send_buffer.c_array(), recive_data_global.recive_buffer, 5); + BOOST_CHECK_EQUAL(cmp_ret, 0); + cmp_ret = memcmp(send_buffer.c_array() + 66, + recive_data_global.recive_buffer + 55 , + MAX_BUFFER_SIZE - 66); + BOOST_CHECK_EQUAL(cmp_ret, 0); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.begin()->edit_data_list.size(), 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_end_size, MAX_BUFFER_SIZE - 11u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 11u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->edit_division, EDIT_DIVISION_NO_EDIT); + } +} + +//handle_sorryserver_connection_fail 董作方 +void handle_sorryserver_connection_fail_test() { + boost::asio::ip::tcp::endpoint ep_tcp = string_to_endpoint ("10.10.100.100:8800"); + thread_data_ptr data_pro(new session_thread_data_sessionless); + + cout << "[248]--------------------------------------------- " << endl; + //unit_test[248] session_thread_data_map中にthread_id無し + EVENT_TAG ret = this->handle_sorryserver_connection_fail(boost::this_thread::get_id(), ep_tcp); + BOOST_CHECK_EQUAL(ret, FINALIZE); + + cout << "[249]--------------------------------------------- " << endl; + //unit_test[249] session_thread_data_map中にsession_thread_data無し + thread_data_ptr thread_data1 ; + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data1; + ret = this->handle_sorryserver_connection_fail(boost::this_thread::get_id(), ep_tcp); + BOOST_CHECK_EQUAL(ret, FINALIZE); + + cout << "[250]--------------------------------------------- " << endl; + //unit_test[250] handle_sorryserver_connection_failメソッドのテスト + //unit_test[250] test data:end_flag = on + data_pro->end_flag = END_FLAG_OFF;// 終了フラグを設定する + this->session_thread_data_map.clear(); + this->session_thread_data_map[boost::this_thread::get_id()] = data_pro; + ret = this->handle_sorryserver_connection_fail(boost::this_thread::get_id(),ep_tcp); + + BOOST_CHECK_EQUAL(data_pro->end_flag, END_FLAG_ON); + BOOST_CHECK_EQUAL(ret, CLIENT_DISCONNECT ); +} + +//handle_sorryserver_connection_fail 董作方 +void handle_sorryserver_connection_fail_test_thread() { + boost::asio::ip::tcp::endpoint ep_tcp = string_to_endpoint ("10.10.100.100:8800"); + thread_data_ptr data_pro(new session_thread_data_sessionless); + + cout << "[251]--------------------------------------------- " << endl; + //unit_test[251] 多スレッドテスト/handle_sorryserver_connection_failメソッドの多スレッドテスト + //unit_test[251] test data:end_flag = on + data_pro->end_flag = END_FLAG_OFF;// 終了フラグを設定する + + { + boost::mutex::scoped_lock sclock(this->session_thread_data_map_mutex); + this->session_thread_data_map[boost::this_thread::get_id()] = data_pro; + } + EVENT_TAG ret = this->handle_sorryserver_connection_fail(boost::this_thread::get_id(),ep_tcp); + + { + boost::mutex::scoped_lock sclock(check_mutex); + BOOST_CHECK_EQUAL(data_pro->end_flag, END_FLAG_ON); + BOOST_CHECK_EQUAL(ret, CLIENT_DISCONNECT ); + } +} + +//handle_sorryserver_send 郎希倹 +void handle_sorryserver_send_test() { + boost::asio::ip::tcp::endpoint endpoint = string_to_endpoint ("10.10.100.100:8800");; + send_status sorr_send_status,sorr_send_status1; + recive_data sorr_recive_data; + thread_data_ptr data_pro(new session_thread_data_sessionless); + + cout << "[252]--------------------------------------------- " << endl; + //unit_test[252] session_thread_data_map中にthread_id無し + EVENT_TAG event_status = this->handle_sorryserver_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(event_status, FINALIZE); + + cout << "[253]--------------------------------------------- " << endl; + //unit_test[253] session_thread_data_map中にsession_thread_data_sessionless無し + thread_data_ptr data_pro1; + this->session_thread_data_map[boost::this_thread::get_id()] = data_pro1; + event_status = this->handle_sorryserver_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(event_status, FINALIZE); + + cout << "[254]--------------------------------------------- " << endl; + //unit_test[254] recive_data_map中にendpoint無し + this->session_thread_data_map.clear(); + this->session_thread_data_map[boost::this_thread::get_id()] = data_pro; + event_status = this->handle_sorryserver_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(event_status, FINALIZE); + + cout << "[255]--------------------------------------------- " << endl; + //unit_test[255] send_status_list中にsend_status無し + sorr_recive_data.send_status_list.clear(); + data_pro->recive_data_map[endpoint] = sorr_recive_data; + this->session_thread_data_map.clear(); + this->session_thread_data_map[boost::this_thread::get_id()] = data_pro; + + event_status = this->handle_sorryserver_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(event_status, FINALIZE); + + cout << "[256]--------------------------------------------- " << endl; + //unit_test[256] 送信状態->SEND_OK,送信可能データサイズ > 0/送信可能データあり + //unit_test[256] test data: 送信状態に送信待を設定,送信データオフセットに送信済データサイズを加算する,送信済データサイズに0を設定する,遷移先ステータスを設定する + sorr_send_status.send_possible_size = 1u;//送信可能データサイズ > 0 + sorr_send_status.send_offset = 0u; + sorr_send_status.send_end_size = 1u; + sorr_send_status.status = SEND_OK; //送信状態->SEND_OK + sorr_recive_data.send_status_list.push_back(sorr_send_status); + + data_pro->client_endpoint_tcp = endpoint; + data_pro->recive_data_map.clear(); + data_pro->recive_data_map.insert(std::pair(endpoint,sorr_recive_data)); + + this->session_thread_data_map.clear(); + this->session_thread_data_map[boost::this_thread::get_id()] = data_pro; + event_status = this->handle_sorryserver_send(boost::this_thread::get_id()); + SEND_STATUS_TAG send_status = data_pro->recive_data_map[endpoint].send_status_list.front().status; + size_t offset = data_pro->recive_data_map[endpoint].send_status_list.front().send_offset; + size_t end_size = data_pro->recive_data_map[endpoint].send_status_list.front().send_end_size; + + BOOST_CHECK_EQUAL(event_status, SORRYSERVER_CONNECT); //遷移先ステータスを設定する + BOOST_CHECK_EQUAL(send_status, SEND_OK); //送信状態に送信待を設定する + BOOST_CHECK_EQUAL(offset,1u); //送信データオフセットに送信済データサイズを加算する + BOOST_CHECK_EQUAL(end_size,0u); //送信済データサイズに0を設定する + + cout << "[257]--------------------------------------------- " << endl; + //unit_test[257] 送信状態->SEND_NG + //unit_test[257] test data: 遷移先ステータスを設定する + sorr_send_status.status = SEND_NG; //送信状態->SEND_NG + sorr_recive_data.send_status_list.clear(); + sorr_recive_data.send_status_list.push_back(sorr_send_status); + + data_pro->client_endpoint_tcp = endpoint; + data_pro->recive_data_map.clear(); + data_pro->recive_data_map.insert(std::pair(endpoint,sorr_recive_data)); + + this->session_thread_data_map.clear(); + this->session_thread_data_map[boost::this_thread::get_id()] = data_pro; + event_status = this->handle_sorryserver_send(boost::this_thread::get_id()); + + BOOST_CHECK_EQUAL(event_status, FINALIZE); //遷移先ステータスを設定する + + cout << "[258]--------------------------------------------- " << endl; + //unit_test[258] 送信状態->SEND_CONTINUE + //unit_test[258] test data: 遷移先ステータスを設定する + sorr_send_status.status = SEND_CONTINUE; //送信状態->SEND_CONTINUE + sorr_recive_data.send_status_list.clear(); + sorr_recive_data.send_status_list.push_back(sorr_send_status); + + data_pro->client_endpoint_tcp = endpoint; + data_pro->recive_data_map.clear(); + data_pro->recive_data_map.insert(std::pair(endpoint,sorr_recive_data)); + + this->session_thread_data_map.clear(); + this->session_thread_data_map[boost::this_thread::get_id()] = data_pro; + event_status = this->handle_sorryserver_send(boost::this_thread::get_id()); + + BOOST_CHECK_EQUAL(event_status, FINALIZE); //遷移先ステータスを設定する + + cout << "[259]--------------------------------------------- " << endl; + //unit_test[259] 送信状態->SEND_OK,送信可能データサイズ = 0/送信データ残サイズ > 0/送信可能データなし + //unit_test[259] test data: 送信状態に送信待を設定 + sorr_send_status.send_possible_size = 0u;//送信可能データサイズ=0 + sorr_send_status.send_rest_size = 1u;//送信データ残サイズ > 0 + sorr_send_status.status = SEND_OK;//送信状態->SEND_OK + sorr_recive_data.send_status_list.clear(); + sorr_recive_data.send_status_list.push_back(sorr_send_status); + + data_pro->client_endpoint_tcp = endpoint; + data_pro->recive_data_map.clear(); + data_pro->recive_data_map.insert(std::pair(endpoint,sorr_recive_data)); + + this->session_thread_data_map.clear(); + this->session_thread_data_map[boost::this_thread::get_id()] = data_pro; + event_status = this->handle_sorryserver_send(boost::this_thread::get_id()); + send_status = data_pro->recive_data_map[endpoint].send_status_list.front().status; + + BOOST_CHECK_EQUAL(event_status, CLIENT_RECV); //遷移先ステータスを設定する + BOOST_CHECK_EQUAL(send_status, SEND_CONTINUE); //送信状態に送信待を設定する + + cout << "[260]--------------------------------------------- " << endl; + //unit_test[260] 送信状態->SNED_NG,SEND_OK,/送信データ残サイズ > 0 + //unit_test[260] test data: 送信状態に送信待を設定 + sorr_send_status.status = SEND_NG; + sorr_send_status.send_rest_size = 1u;//送信データ残サイズ > 0 + sorr_send_status1.status = SEND_OK;//送信状態->SEND_OK + sorr_recive_data.send_status_list.clear(); + sorr_recive_data.send_status_list.push_back(sorr_send_status); + sorr_recive_data.send_status_list.push_back(sorr_send_status1); + + data_pro->client_endpoint_tcp = endpoint; + data_pro->recive_data_map.clear(); + data_pro->recive_data_map.insert(std::pair(endpoint,sorr_recive_data)); + + this->session_thread_data_map.clear(); + this->session_thread_data_map[boost::this_thread::get_id()] = data_pro; + event_status = this->handle_sorryserver_send(boost::this_thread::get_id()); + + BOOST_CHECK_EQUAL(event_status, FINALIZE); //遷移先ステータスを設定する + + cout << "[261]--------------------------------------------- " << endl; + //unit_test[261] 送信状態->SEND_OK,送信可能データサイズ = 0/送信データ残サイズ = 0/送信可能データなし + //unit_test[261] test data: 送信状態に送信待を設定 + sorr_send_status.send_possible_size = 0u;//送信可能データサイズ=0 + sorr_send_status.send_rest_size = 0u;//送信データ残サイズ = 0 + sorr_send_status.status = SEND_OK;//送信状態->SEND_OK + sorr_recive_data.send_status_list.clear(); + sorr_recive_data.send_status_list.push_back(sorr_send_status); + + data_pro->client_endpoint_tcp = endpoint; + data_pro->recive_data_map.clear(); + data_pro->recive_data_map.insert(std::pair(endpoint,sorr_recive_data)); + + this->session_thread_data_map.clear(); + this->session_thread_data_map[boost::this_thread::get_id()] = data_pro; + event_status = this->handle_sorryserver_send(boost::this_thread::get_id()); + send_status = data_pro->recive_data_map[endpoint].send_status_list.front().status; + + BOOST_CHECK_EQUAL(event_status, CLIENT_RECV); //遷移先ステータスを設定する + BOOST_CHECK_EQUAL(send_status, SEND_END); //送信状態に送信待を設定する + + cout << "[262]--------------------------------------------- " << endl; + //unit_test[262] 送信状態->SEND_OK,SEND_OK/送信可能データサイズ = 0/送信データ残サイズ > 0 + //unit_test[262] test data: 遷移先ステータスを設定する + sorr_send_status.send_possible_size = 0u;//送信可能データサイズ = 0 + sorr_send_status.status = SEND_OK; + sorr_send_status.send_rest_size = 1u;//送信データ残サイズ > 0 + sorr_send_status1.status = SEND_OK;//送信状態->SEND_OK + sorr_recive_data.send_status_list.clear(); + sorr_recive_data.send_status_list.push_back(sorr_send_status); + sorr_recive_data.send_status_list.push_back(sorr_send_status1); + + data_pro->client_endpoint_tcp = endpoint; + data_pro->recive_data_map.clear(); + data_pro->recive_data_map.insert(std::pair(endpoint,sorr_recive_data)); + + this->session_thread_data_map.clear(); + this->session_thread_data_map[boost::this_thread::get_id()] = data_pro; + event_status = this->handle_sorryserver_send(boost::this_thread::get_id()); + + BOOST_CHECK_EQUAL(event_status, FINALIZE); //遷移先ステータスを設定する + + cout << "[263]--------------------------------------------- " << endl; + //unit_test[263] 送信状態->SEND_OK,SEND_OK/送信可能データサイズ = 0/送信データ残サイズ = 0/送信可能データあり + //unit_test[263] test data: 送信状態に送信待を設定,遷移先ステータスを設定する + sorr_send_status.send_possible_size = 0u;//送信可能データサイズ = 0 + sorr_send_status.status = SEND_OK; + sorr_send_status.send_rest_size = 0u;//送信データ残サイズ = 0 + sorr_send_status1.status = SEND_OK;//送信状態->SEND_OK + sorr_recive_data.send_status_list.clear(); + sorr_recive_data.send_status_list.push_back(sorr_send_status); + sorr_recive_data.send_status_list.push_back(sorr_send_status1); + + data_pro->client_endpoint_tcp = endpoint; + data_pro->recive_data_map.clear(); + data_pro->recive_data_map.insert(std::pair(endpoint,sorr_recive_data)); + + this->session_thread_data_map.clear(); + this->session_thread_data_map[boost::this_thread::get_id()] = data_pro; + event_status = this->handle_sorryserver_send(boost::this_thread::get_id()); + send_status = data_pro->recive_data_map[endpoint].send_status_list.front().status; + + BOOST_CHECK_EQUAL(event_status, SORRYSERVER_CONNECT); //遷移先ステータスを設定する + BOOST_CHECK_EQUAL(send_status, SEND_END); //送信可能データサイズ = 0,送信データ残サイズ = 0,送信状態に送信待を設定する + + cout << "[264]--------------------------------------------- " << endl; + //unit_test[264] 送信状態->SEND_OK,SEND_NG/送信可能データサイズ = 0/送信データ残サイズ > 0 + //unit_test[264] test data: 遷移先ステータスを設定する + sorr_send_status.send_possible_size = 0u;//送信可能データサイズ = 0 + sorr_send_status.status = SEND_OK; + sorr_send_status.send_rest_size = 1u;//送信データ残サイズ > 0 + sorr_send_status1.status = SEND_NG;//送信状態->SEND_NG + sorr_recive_data.send_status_list.clear(); + sorr_recive_data.send_status_list.push_back(sorr_send_status); + sorr_recive_data.send_status_list.push_back(sorr_send_status1); + + data_pro->client_endpoint_tcp = endpoint; + data_pro->recive_data_map.clear(); + data_pro->recive_data_map.insert(std::pair(endpoint,sorr_recive_data)); + + this->session_thread_data_map.clear(); + this->session_thread_data_map[boost::this_thread::get_id()] = data_pro; + event_status = this->handle_sorryserver_send(boost::this_thread::get_id()); + send_status = data_pro->recive_data_map[endpoint].send_status_list.front().status; + + BOOST_CHECK_EQUAL(event_status, FINALIZE); //遷移先ステータスを設定する + + cout << "[265]--------------------------------------------- " << endl; + //unit_test[265] 送信状態->SEND_OK,SEND_NG/送信可能データサイズ = 0/送信データ残サイズ = 0/送信可能データあり + //unit_test[265] test data: 送信状態に送信待を設定,遷移先ステータスを設定する + sorr_send_status.send_possible_size = 0u;//送信可能データサイズ = 0 + sorr_send_status.status = SEND_OK; + sorr_send_status.send_rest_size = 0u;//送信データ残サイズ = 0 + sorr_send_status1.status = SEND_NG;//送信状態->SEND_NG + sorr_recive_data.send_status_list.clear(); + sorr_recive_data.send_status_list.push_back(sorr_send_status); + sorr_recive_data.send_status_list.push_back(sorr_send_status1); + + data_pro->client_endpoint_tcp = endpoint; + data_pro->recive_data_map.clear(); + data_pro->recive_data_map.insert(std::pair(endpoint,sorr_recive_data)); + + this->session_thread_data_map.clear(); + this->session_thread_data_map[boost::this_thread::get_id()] = data_pro; + event_status = this->handle_sorryserver_send(boost::this_thread::get_id()); + send_status = data_pro->recive_data_map[endpoint].send_status_list.front().status; + + BOOST_CHECK_EQUAL(event_status, CLIENT_RECV); //遷移先ステータスを設定する + BOOST_CHECK_EQUAL(send_status, SEND_END); //送信可能データサイズ = 0,送信データ残サイズ = 0,送信状態に送信待を設定する + + cout << "[266]--------------------------------------------- " << endl; + //unit_test[266] 送信状態->SEND_END,SEND_OK/送信可能データサイズ > 0 + //unit_test[266] test data: 遷移先ステータスを設定する + sorr_send_status.status = SEND_END; + sorr_send_status1.send_possible_size = 1u;//送信可能データサイズ > 0 + sorr_send_status1.status = SEND_OK;//送信状態->SEND_CONTINUE + sorr_recive_data.send_status_list.clear(); + sorr_recive_data.send_status_list.push_back(sorr_send_status); + sorr_recive_data.send_status_list.push_back(sorr_send_status1); + + data_pro->client_endpoint_tcp = endpoint; + data_pro->recive_data_map.clear(); + data_pro->recive_data_map.insert(std::pair(endpoint,sorr_recive_data)); + + this->session_thread_data_map.clear(); + this->session_thread_data_map[boost::this_thread::get_id()] = data_pro; + event_status = this->handle_sorryserver_send(boost::this_thread::get_id()); + + BOOST_CHECK_EQUAL(event_status, SORRYSERVER_CONNECT); //遷移先ステータスを設定する + + cout << "[267]--------------------------------------------- " << endl; + //unit_test[267] 送信状態->SEND_END,SEND_OK/送信可能データサイズ = 0 + //unit_test[267] test data: 遷移先ステータスを設定する + sorr_send_status.status = SEND_END; + sorr_send_status1.send_rest_size = 1u;//送信データ残サイズ > 0 + sorr_send_status1.send_possible_size = 0u;//送信可能データサイズ = 0 + sorr_send_status1.status = SEND_OK;//送信状態->SEND_OK + sorr_recive_data.send_status_list.clear(); + sorr_recive_data.send_status_list.push_back(sorr_send_status); + sorr_recive_data.send_status_list.push_back(sorr_send_status1); + + data_pro->client_endpoint_tcp = endpoint; + data_pro->recive_data_map.clear(); + data_pro->recive_data_map.insert(std::pair(endpoint,sorr_recive_data)); + + this->session_thread_data_map.clear(); + this->session_thread_data_map[boost::this_thread::get_id()] = data_pro; + event_status = this->handle_sorryserver_send(boost::this_thread::get_id()); + + BOOST_CHECK_EQUAL(event_status, CLIENT_RECV); //遷移先ステータスを設定する + + cout << "[268]--------------------------------------------- " << endl; + //unit_test[268] 送信状態->SEND_END + //unit_test[268] test data: 遷移先ステータスを設定する + sorr_send_status.status = SEND_END; + sorr_recive_data.send_status_list.clear(); + sorr_recive_data.send_status_list.push_back(sorr_send_status); + + data_pro->recive_data_map.clear(); + data_pro->recive_data_map.insert(std::pair(endpoint,sorr_recive_data)); + + this->session_thread_data_map.clear(); + this->session_thread_data_map[boost::this_thread::get_id()] = data_pro; + event_status = this->handle_sorryserver_send(boost::this_thread::get_id()); + + BOOST_CHECK_EQUAL(event_status, FINALIZE); //遷移先ステータスを設定する + + cout << "[269]--------------------------------------------- " << endl; + //unit_test[269] 送信状態->SEND_END,SEND_OK/送信可能データサイズ = 0/送信データ残サイズ = 0 + sorr_send_status.status = SEND_END; //送信状態->SEND_END + sorr_send_status1.status = SEND_OK; //送信状態->SEND_OK + sorr_send_status1.send_rest_size = 0u;//送信データ残サイズ = 0 + sorr_send_status1.send_possible_size = 0u; //送信可能データサイズ = 0 + sorr_recive_data.send_status_list.clear(); + sorr_recive_data.send_status_list.push_back(sorr_send_status); + sorr_recive_data.send_status_list.push_back(sorr_send_status1); + + data_pro->client_endpoint_tcp = endpoint; + data_pro->recive_data_map.clear(); + data_pro->recive_data_map.insert(std::pair(endpoint,sorr_recive_data)); + + this->session_thread_data_map.clear(); + this->session_thread_data_map[boost::this_thread::get_id()] = data_pro; + event_status = this->handle_sorryserver_send(boost::this_thread::get_id()); + send_status = data_pro->recive_data_map[endpoint].send_status_list.front().status; + + BOOST_CHECK_EQUAL(event_status, CLIENT_RECV); //遷移先ステータスを設定する + BOOST_CHECK_EQUAL(send_status, SEND_END); //送信状態に送信済を設定する + + cout << "[270]--------------------------------------------- " << endl; + //unit_test[270] 送信状態->SEND_CONTINUE,SEND_OK/送信可能データサイズ > 0 + //unit_test[270] test data: 送信状態に送信待を設定,遷移先ステータスを設定する + sorr_send_status.status = SEND_CONTINUE; //送信状態->SEND_CONTINUE + sorr_send_status.send_possible_size = 1u;//送信可能データサイズ = 1 + sorr_send_status.send_offset = 0u; + sorr_send_status.send_end_size = 1u; + sorr_send_status1.status = SEND_OK; //送信状態->SEND_OK + sorr_recive_data.send_status_list.clear(); + sorr_recive_data.send_status_list.push_back(sorr_send_status); + sorr_recive_data.send_status_list.push_back(sorr_send_status1); + + data_pro->client_endpoint_tcp = endpoint; + data_pro->recive_data_map.clear(); + data_pro->recive_data_map.insert(std::pair(endpoint,sorr_recive_data)); + + this->session_thread_data_map.clear(); + this->session_thread_data_map[boost::this_thread::get_id()] = data_pro; + event_status = this->handle_sorryserver_send(boost::this_thread::get_id()); + + BOOST_CHECK_EQUAL(event_status,FINALIZE); //送信状態に送信待を設定する +} + +//handle_sorryserver_send 郎希倹 +void handle_sorryserver_send_test_thread() { + boost::asio::ip::tcp::endpoint endpoint = string_to_endpoint ("10.10.100.100:8800");; + send_status sorr_send_status; + recive_data sorr_recive_data; + thread_data_ptr data_pro(new session_thread_data_sessionless); + + cout << "[271]--------------------------------------------- " << endl; + //unit_test[271] 多スレッドテスト/送信状態->SEND_OK,送信可能データサイズ = 0/送信データ残サイズ > 0/送信可能データなし + //unit_test[271] test data: 送信状態に送信待を設定 + sorr_send_status.send_possible_size = 0u;//送信可能データサイズ=0 + sorr_send_status.send_rest_size = 1u;//送信データ残サイズ > 0 + sorr_send_status.status = SEND_OK;//送信状態->SEND_OK + sorr_recive_data.send_status_list.clear(); + sorr_recive_data.send_status_list.push_back(sorr_send_status); + + data_pro->client_endpoint_tcp = endpoint; + data_pro->recive_data_map.clear(); + data_pro->recive_data_map.insert(std::pair(endpoint,sorr_recive_data)); + { + boost::mutex::scoped_lock sclock(this->session_thread_data_map_mutex); + this->session_thread_data_map[boost::this_thread::get_id()] = data_pro; + } + EVENT_TAG event_status = this->handle_sorryserver_send(boost::this_thread::get_id()); + SEND_STATUS_TAG send_status = data_pro->recive_data_map[endpoint].send_status_list.front().status; + + { + boost::mutex::scoped_lock sclock(check_mutex); + BOOST_CHECK_EQUAL(event_status, CLIENT_RECV); //遷移先ステータスを設定する + BOOST_CHECK_EQUAL(send_status, SEND_CONTINUE); //送信状態に送信待を設定する + } +} + +//handle_realserver_recv(tcp) 郎希倹 +void handle_realserver_recv_tcp_test() { + size_t response_len = USE_BUFFER_SIZE;; + EVENT_TAG ret; + boost::array response; + send_status send_status_temp; + boost::thread up_thread(&up_thread_func); + thread_data_ptr psession_thread_data(new session_thread_data_sessionless); + init_session_thread_data_sessionless(psession_thread_data, up_thread.get_id()); + recive_data recive_data_tmp; + + init_send_status(send_status_temp); + // recive_dataを作成する + init_recive_data(recive_data_tmp); + recive_data_tmp.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_tmp.recive_buffer_rest_size = USE_BUFFER_SIZE; + + //recive_data_mapを作成する + psession_thread_data->end_flag = END_FLAG_OFF; + psession_thread_data->last_status = REALSERVER_RECV; + boost::asio::ip::tcp::endpoint rs_endpoint = string_to_endpoint("10.10.10.1:8080"); + psession_thread_data->target_endpoint = rs_endpoint; + + //session_thread_dataを作成する + psession_thread_data->recive_data_map.clear(); + psession_thread_data->recive_data_map[rs_endpoint] = recive_data_tmp; + this->forwarded_for = 1; + + cout << "[272]--------------------------------------------- " << endl; + // unit_test[272] boost::this_thread::get_id()対応のデータなし + this->session_thread_data_map.clear(); + ret = handle_realserver_recv(boost::this_thread::get_id(), rs_endpoint, response, response_len); + BOOST_CHECK_EQUAL(ret, FINALIZE); + + cout << "[273]--------------------------------------------- " << endl; + // unit_test[273] boost::this_thread::get_id()対応のデータsession_thread_dataがNULL + this->session_thread_data_map.clear(); + thread_data_ptr p; + this->session_thread_data_map[boost::this_thread::get_id()] = p; + ret = handle_realserver_recv(boost::this_thread::get_id(), rs_endpoint, response, response_len); + BOOST_CHECK_EQUAL(ret, FINALIZE); + + this->session_thread_data_map.clear(); + this->session_thread_data_map[boost::this_thread::get_id()] = psession_thread_data; + + psession_thread_data->recive_data_map.clear(); + psession_thread_data->recive_data_map[rs_endpoint] = recive_data_tmp; + std::map::iterator it = + psession_thread_data->recive_data_map.find(rs_endpoint); + recive_data& recive_data_global = it->second; + + cout << "[274]--------------------------------------------- " << endl; + // unit_test[274] recive_data.recive_buffer=Null + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = NULL; + ret = handle_realserver_recv(boost::this_thread::get_id(), rs_endpoint, response, response_len); + BOOST_CHECK_EQUAL(ret, FINALIZE); + + cout << "[275]--------------------------------------------- " << endl; + // unit_test[275] recive_data.recive_buffer1=Null + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 20; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer1 = NULL; + recive_data_global.recive_buffer = recive_data_global.recive_buffer2; + recive_data_global.send_status_list.clear(); + + memset(response.c_array(), 'n', 80); + response_len = 80; + + ret = handle_realserver_recv(boost::this_thread::get_id(), rs_endpoint, response, response_len); + BOOST_CHECK_EQUAL(ret, FINALIZE); + + cout << "[276]--------------------------------------------- " << endl; + // unit_test[276] recive_data.recive_buffer2=Null + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 20; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = NULL; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + memset(response.c_array(), 'n', 80); + response_len = 80; + + ret = handle_realserver_recv(boost::this_thread::get_id(), rs_endpoint, response, response_len); + BOOST_CHECK_EQUAL(ret, FINALIZE); + + cout << "[277]--------------------------------------------- " << endl; + // unit_test[277] new失敗の場合 + recive_data_global.recive_buffer_max_size = 0; + recive_data_global.recive_buffer_rest_size = 0; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = NULL; + recive_data_global.recive_buffer2 = NULL; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + memcpy(response.c_array(), "HTTP/1.1 200 OK\r\nContent-Length: 11\r\n\r\n01234567890", REQUEST_BUFFER_SIZE); + response_len = REQUEST_BUFFER_SIZE; + + this->getloglevel = &stb_getloglevel_is_none; + new_install(); + ret = handle_realserver_recv(boost::this_thread::get_id(), rs_endpoint, response, response_len); + new_uninstall(); + this->getloglevel = &stb_getloglevel; + BOOST_CHECK_EQUAL(ret, FINALIZE); + + cout << "[278]--------------------------------------------- " << endl; + // unit_test[278] レスポンスサイズが0である + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = USE_BUFFER_SIZE; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + ret = handle_realserver_recv(boost::this_thread::get_id(), rs_endpoint, response, 0); + BOOST_CHECK_EQUAL(ret, REALSERVER_RECV); + + cout << "[279]--------------------------------------------- " << endl; + // unit_test[279] レスポンスサイズがUINT_MAXである レスポンス実際にサイズがMAX_BUFFER_SIZEである + recive_data_global.recive_buffer_max_size = MAX_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = MAX_BUFFER_SIZE; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + memset(response.c_array(), 'n', MAX_BUFFER_SIZE); + ret = handle_realserver_recv(boost::this_thread::get_id(), rs_endpoint, response, UINT_MAX); + BOOST_CHECK_EQUAL(ret, FINALIZE); + + cout << "[280]--------------------------------------------- " << endl; + // unit_test[280] レスポンスサイズがMAX_BUFFER_SIZEである レスポンス実際にサイズがMAX_BUFFER_SIZEである + recive_data_global.recive_buffer_max_size = MAX_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = MAX_BUFFER_SIZE; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + memcpy(response.c_array(), "HTTP/1.1 200 OK\r\n", 17); + memset(response.c_array() + 17, 'n', MAX_BUFFER_SIZE - 17); + + ret = handle_realserver_recv(boost::this_thread::get_id(), rs_endpoint, response, MAX_BUFFER_SIZE); + BOOST_CHECK_EQUAL(ret, REALSERVER_RECV); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, MAX_BUFFER_SIZE); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_max_size, MAX_BUFFER_SIZE); + + // unit_test_part1 begin: + send_status status_END; + init_send_status(status_END); + status_END.status = SEND_END; + status_END.send_offset = 0; + status_END.send_end_size = 20; + + send_status status_OK; + init_send_status(status_OK); + status_OK.status = SEND_OK; + status_OK.send_offset = 0; + status_OK.send_possible_size = 20; + + send_status status_NG; + init_send_status(status_NG); + status_NG.status = SEND_NG; + status_NG.send_offset = 0; + status_NG.unsend_size = 20; + + send_status status_CONTINUE; + init_send_status(status_CONTINUE); + status_CONTINUE.status = SEND_CONTINUE; + status_CONTINUE.send_offset = 0; + status_CONTINUE.send_end_size = 20; + status_CONTINUE.send_rest_size = 20; + + send_status* send_status_NG[27][3] + = { + // unit_test 入力の送信状態リストは下記の通り:(異常系) + // unit_test[281] 送信状態リストの要素の送信状態が1:送信待の場合 + {&status_OK,NULL,NULL}, + // unit_test[282] 送信状態リストの要素の送信状態が1:送信済 2:送信待の場合 + {&status_END,&status_OK,NULL}, + // unit_test[283] 送信状態リストの要素の送信状態が1:送信継続 2:送信継続の場合 + {&status_CONTINUE,&status_CONTINUE,NULL}, + // unit_test[284] 送信状態リストの要素の送信状態が1:送信継続 2:送信不可の場合 + {&status_CONTINUE,&status_NG,NULL}, + // unit_test[285] 送信状態リストの要素の送信状態が1:送信継続 2:送信済の場合 + {&status_CONTINUE,&status_END,NULL}, + // unit_test[286] 送信状態リストの要素の送信状態が1:送信継続 2:送信待の場合 + {&status_CONTINUE,&status_OK,NULL}, + // unit_test[287] 送信状態リストの要素の送信状態が1:送信不可 2:送信継続の場合 + {&status_NG,&status_CONTINUE,NULL}, + // unit_test[288] 送信状態リストの要素の送信状態が1:送信不可 2:送信不可の場合 + {&status_NG,&status_NG,NULL}, + // unit_test[289] 送信状態リストの要素の送信状態が1:送信不可 2:送信済の場合 + {&status_NG,&status_END,NULL}, + // unit_test[290] 送信状態リストの要素の送信状態が1:送信不可 2:送信待の場合 + {&status_NG,&status_OK,NULL}, + // unit_test[291] 送信状態リストの要素の送信状態が1:送信待 2:送信継続の場合 + {&status_OK,&status_CONTINUE,NULL}, + // unit_test[292] 送信状態リストの要素の送信状態が1:送信待 2:送信不可の場合 + {&status_OK,&status_NG,NULL}, + // unit_test[293] 送信状態リストの要素の送信状態が1:送信待 2:送信済の場合 + {&status_OK,&status_END,NULL}, + // unit_test[294] 送信状態リストの要素の送信状態が1:送信待 2:送信待の場合 + {&status_OK,&status_OK,NULL}, + // unit_test[295] 送信状態リストの要素の送信状態が1:送信済 2:送信継続 3:送信継続の場合 + {&status_END,&status_CONTINUE,&status_CONTINUE}, + // unit_test[296] 送信状態リストの要素の送信状態が1:送信済 2:送信継続 3:送信不可の場合 + {&status_END,&status_CONTINUE,&status_NG}, + // unit_test[297] 送信状態リストの要素の送信状態が1:送信済 2:送信継続 3:送信済の場合 + {&status_END,&status_CONTINUE,&status_END}, + // unit_test[298] 送信状態リストの要素の送信状態が1:送信済 2:送信継続 3:送信待の場合 + {&status_END,&status_CONTINUE,&status_OK}, + // unit_test[299] 送信状態リストの要素の送信状態が1:送信済 2:送信不可 3:送信継続の場合 + {&status_END,&status_NG,&status_CONTINUE}, + // unit_test[300] 送信状態リストの要素の送信状態が1:送信済 2:送信不可 3:送信不可の場合 + {&status_END,&status_NG,&status_NG}, + // unit_test[301] 送信状態リストの要素の送信状態が1:送信済 2:送信不可 3:送信済の場合 + {&status_END,&status_NG,&status_END}, + // unit_test[302] 送信状態リストの要素の送信状態が1:送信済 2:送信不可 3:送信待の場合 + {&status_END,&status_NG,&status_OK}, + // unit_test[303] 送信状態リストの要素の送信状態が1:送信済 2:送信済 3:送信待の場合 + {&status_END,&status_END,&status_OK}, + // unit_test[304] 送信状態リストの要素の送信状態が1:送信済 2:送信待 3:送信継続の場合 + {&status_END,&status_OK,&status_CONTINUE}, + // unit_test[305] 送信状態リストの要素の送信状態が1:送信済 2:送信待 3:送信不可の場合 + {&status_END,&status_OK,&status_NG}, + // unit_test[306] 送信状態リストの要素の送信状態が1:送信済 2:送信待 3:送信済の場合 + {&status_END,&status_OK,&status_END}, + // unit_test[307] 送信状態リストの要素の送信状態が1:送信済 2:送信待 3:送信待の場合 + {&status_END,&status_OK,&status_OK}, + }; + + int i; + int j; + + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = USE_BUFFER_SIZE; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + memset(recive_data_global.recive_buffer, 'n', USE_BUFFER_SIZE); + memset(response.c_array(), 'm', USE_BUFFER_SIZE); + for (i = 0; i < 27; i++) + { + recive_data_global.send_status_list.clear(); + + for (j = 0; j < 3; j++) + { + if(send_status_NG[i][j] == NULL) + { + break; + } + + recive_data_global.send_status_list.push_back(*(send_status_NG[i][j])); + } + + ret = handle_realserver_recv(boost::this_thread::get_id(), rs_endpoint, response, response_len); + std::cout << "[" << 281 + i << "]------------------------------------------" << std::endl; + BOOST_CHECK_EQUAL(ret, FINALIZE); + } + + cout << "[308]--------------------------------------------- " << endl; + // unit_test[308] 送信状態リストの要素の送信状態が1:送信済 2:送信済 3:送信継続の場合 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 40; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_END; + send_status_temp.send_offset = 0; + send_status_temp.send_end_size = 20; + recive_data_global.send_status_list.push_back(send_status_temp); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_END; + send_status_temp.send_offset = 20; + send_status_temp.send_end_size = 20; + recive_data_global.send_status_list.push_back(send_status_temp); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_CONTINUE; + send_status_temp.send_offset = 40; + send_status_temp.send_end_size = 10; + send_status_temp.send_rest_size = 11; + recive_data_global.send_status_list.push_back(send_status_temp); + + memcpy(response.c_array(), "12345678901HTTP/1.1 200 OK\r\nContent-Length: 20\r\n\r\n", REQUEST_BUFFER_SIZE); + response_len = REQUEST_BUFFER_SIZE; + + ret = handle_realserver_recv(boost::this_thread::get_id(), rs_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_CONNECTION_CHECK); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 2u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 11u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_rest_size, 20u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_possible_size, 39u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_offset, 11u); + + cout << "[309]--------------------------------------------- " << endl; + // unit_test[309] 送信状態リストの要素の送信状態が1:送信済 2:送信済 3:送信不可の場合 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 40; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_END; + send_status_temp.send_offset = 0; + send_status_temp.send_end_size = 20; + recive_data_global.send_status_list.push_back(send_status_temp); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_END; + send_status_temp.send_offset = 20; + send_status_temp.send_end_size = 20; + recive_data_global.send_status_list.push_back(send_status_temp); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_NG; + send_status_temp.send_offset = 40; + send_status_temp.unsend_size = 10; + recive_data_global.send_status_list.push_back(send_status_temp); + //未送信データを生成する + memcpy(recive_data_global.recive_buffer + 40, "HTTP/1.1 2", 10); + + memcpy(response.c_array(), "00 OK\r\nCookie: monkey=1234567890123456789012345678", REQUEST_BUFFER_SIZE); + response_len = REQUEST_BUFFER_SIZE; + + ret = handle_realserver_recv(boost::this_thread::get_id(), rs_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_RECV); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 60u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + + cout << "[310]--------------------------------------------- " << endl; + // unit_test[310] 送信状態リストの要素の送信状態が1:送信済 2:送信不可の場合 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 40; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_END; + send_status_temp.send_offset = 0; + send_status_temp.send_end_size = 40; + recive_data_global.send_status_list.push_back(send_status_temp); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_NG; + send_status_temp.send_offset = 40; + send_status_temp.unsend_size = 10; + recive_data_global.send_status_list.push_back(send_status_temp); + //未送信データを生成する + memcpy(recive_data_global.recive_buffer + 40, "HTTP/1.1 2", 10); + + memcpy(response.c_array(), "00 OK\r\nCookie: monkey=1234567890123456789012345678", REQUEST_BUFFER_SIZE); + response_len = REQUEST_BUFFER_SIZE; + + ret = handle_realserver_recv(boost::this_thread::get_id(), rs_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_RECV); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 60u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + + cout << "[311]--------------------------------------------- " << endl; + // unit_test[311] 送信状態リストの要素の送信状態が1:送信済 2:送信継続の場合 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 40; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_END; + send_status_temp.send_offset = 0; + send_status_temp.send_end_size = 40; + recive_data_global.send_status_list.push_back(send_status_temp); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_CONTINUE; + send_status_temp.send_offset = 40; + send_status_temp.send_end_size = 10; + send_status_temp.send_rest_size = 11; + recive_data_global.send_status_list.push_back(send_status_temp); + + memcpy(response.c_array(), "12345678901HTTP/1.1 200 OK\r\nContent-Length: 20\r\n\r\n", REQUEST_BUFFER_SIZE); + response_len = REQUEST_BUFFER_SIZE; + + ret = handle_realserver_recv(boost::this_thread::get_id(), rs_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_CONNECTION_CHECK); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 2u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 11u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_rest_size, 20u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_possible_size, 39u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_offset, 11u); + + cout << "[312]--------------------------------------------- " << endl; + // unit_test[312] 送信状態リストの要素の送信状態が1:送信済 2:送信済の場合 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 10; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_END; + send_status_temp.send_offset = 0; + send_status_temp.send_end_size = 40; + recive_data_global.send_status_list.push_back(send_status_temp); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_END; + send_status_temp.send_offset = 40; + send_status_temp.send_end_size = 40; + recive_data_global.send_status_list.push_back(send_status_temp); + + memcpy(response.c_array(), "HTTP/1.1 200 OK\r\nContent-Length: 11\r\n\r\n12345678901", REQUEST_BUFFER_SIZE); + response_len = REQUEST_BUFFER_SIZE; + + ret = handle_realserver_recv(boost::this_thread::get_id(), rs_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_CONNECTION_CHECK); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 50u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + + cout << "[313]--------------------------------------------- " << endl; + // unit_test[313] 送信状態リストの要素の送信状態が1:送信不可の場合 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 40; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_NG; + send_status_temp.send_offset = 10; + send_status_temp.unsend_size = 10; + recive_data_global.send_status_list.push_back(send_status_temp); + //未送信データを生成する + memcpy(recive_data_global.recive_buffer + 10, "HTTP/1.1 2", 10); + + memcpy(response.c_array(), "00 OK\r\nContent-Length: 21\r\n\r\n012345678901234567890", REQUEST_BUFFER_SIZE); + response_len = REQUEST_BUFFER_SIZE; + + ret = handle_realserver_recv(boost::this_thread::get_id(), rs_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_CONNECTION_CHECK); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 60u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + + cout << "[314]--------------------------------------------- " << endl; + // unit_test[314] 送信状態リストの要素の送信状態が1:送信継続の場合 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 11; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_CONTINUE; + send_status_temp.send_offset = 40; + send_status_temp.send_end_size = 39; + send_status_temp.send_rest_size = 20; + + recive_data_global.send_status_list.push_back(send_status_temp); + //未送信データを生成する + memcpy(recive_data_global.recive_buffer + 40, "HTTP/1.1 200 OK\r\nContent-Length: 20\r\n\r\n", 39); + + memcpy(response.c_array(), "12345678901234567890HTTP/1.1 200 OK\r\nContent-Lengt", REQUEST_BUFFER_SIZE); + response_len = REQUEST_BUFFER_SIZE; + + ret = handle_realserver_recv(boost::this_thread::get_id(), rs_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_CONNECTION_CHECK); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 2u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 20u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 0u); + + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_offset, 20u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->unsend_size, 30u); + + cout << "[315]--------------------------------------------- " << endl; + // unit_test[315] 送信状態リストの要素の送信状態が1:送信済の場合 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 10; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_END; + send_status_temp.send_offset = 0; + send_status_temp.send_end_size = 80; + recive_data_global.send_status_list.push_back(send_status_temp); + + memcpy(response.c_array(), "HTTP/1.1 200 OK\r\nContent-Length: 11\r\n\r\n12345678901", REQUEST_BUFFER_SIZE); + response_len = REQUEST_BUFFER_SIZE; + + ret = handle_realserver_recv(boost::this_thread::get_id(), rs_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_CONNECTION_CHECK); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 50u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + + cout << "[316]--------------------------------------------- " << endl; + // unit_test[316] 送信状態リストの要素数が0である場合 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 10; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + memcpy(response.c_array(), "HTTP/1.1 200 OK\r\nContent-Length: 11\r\n\r\n12345678901", REQUEST_BUFFER_SIZE); + response_len = REQUEST_BUFFER_SIZE; + + ret = handle_realserver_recv(boost::this_thread::get_id(), rs_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_CONNECTION_CHECK); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 50u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + + // unit_test_part2 begin: + cout << "[317]--------------------------------------------- " << endl; + // unit_test[317] データバッファ残サイズ < レスポンスデータサイズ + // unit_test[317] ●データバッファMAXサイズ < 未送信データサイズ(0) + レスポンスデータサイズ。 + // unit_test[317] ●メモリの内容をチェックする + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 80; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + memcpy(response.c_array(), "HTTP/1.1 200 OK\r\nCookie: monkey=123456789012345678901" + "23456789012345678901234567890123456789012345678901234567890", 112); + response_len = 112; + + ret = handle_realserver_recv(boost::this_thread::get_id(), rs_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_RECV); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer, recive_data_global.recive_buffer1); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_max_size, MAX_BUFFER_SIZE); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_rest_size, MAX_BUFFER_SIZE - 112); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + + //メモリの内容をチェックする + int cmp_ret = memcmp(response.c_array(), recive_data_global.recive_buffer, 112u); + BOOST_CHECK_EQUAL(cmp_ret, 0); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 112u); + + cout << "[318]--------------------------------------------- " << endl; + // unit_test[318] データバッファ残サイズ < レスポンスデータサイズ + // unit_test[318] ●データバッファMAXサイズ < 未送信データサイズ(0) + レスポンスデータサイズ。 + // unit_test[318] ●データバッファ上限値 < 未送信データサイズ + レスポンスデータサイズ + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 80; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_NG; + send_status_temp.send_offset = 10; + send_status_temp.unsend_size = MAX_SESSIONLESS_MODULE_BUFFER_SIZE; + recive_data_global.send_status_list.push_back(send_status_temp); + + memcpy(response.c_array(), "HTTP/1.1 200 OK\r\nCookie: monkey=123456789012345678901" + "23456789012345678901234567890123456789012345678901234567890", 112); + response_len = 112; + + ret = handle_realserver_recv(boost::this_thread::get_id(), rs_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, FINALIZE); + + cout << "[319]--------------------------------------------- " << endl; + // unit_test[319] データバッファ残サイズ < レスポンスデータサイズ + // unit_test[319] ●データバッファMAXサイズ < 未送信データサイズ(20) + レスポンスデータサイズ。 + // unit_test[319] ●メモリの内容をチェックする + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 70; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_NG; + send_status_temp.send_offset = 0; + send_status_temp.send_end_size = 0; + send_status_temp.unsend_size = 20; + recive_data_global.send_status_list.push_back(send_status_temp); + + //未送信データ + memcpy(recive_data_global.recive_buffer, "HTTP/1.1 200 OK\r\nCoo", 20); + + //レスポンスデータ + memcpy(response.c_array(), "kie: monkey=", 12); + memset(response.c_array(), 'x', MAX_BUFFER_SIZE - 12); + response_len = MAX_BUFFER_SIZE; + + ret = handle_realserver_recv(boost::this_thread::get_id(), rs_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_RECV); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer, recive_data_global.recive_buffer1); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_max_size, MAX_BUFFER_SIZE + 20); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_rest_size, 0u); + + //メモリの内容をチェックする + cmp_ret = memcmp(recive_data_global.recive_buffer, "HTTP/1.1 200 OK\r\nCoo", 20); + BOOST_CHECK_EQUAL(cmp_ret, 0); + cmp_ret = memcmp(recive_data_global.recive_buffer + 20, response.c_array(), MAX_BUFFER_SIZE); + BOOST_CHECK_EQUAL(cmp_ret, 0); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, MAX_BUFFER_SIZE + 20); + + cout << "[320]--------------------------------------------- " << endl; + // unit_test[320] データバッファ残サイズ < レスポンスデータサイズ + // unit_test[320] ●使用中データバッファがデータバッファ1の場合、データバッファMAXサイズ > 未送信データサイズ(0) + レスポンスデータサイズ。 + // unit_test[320] ●メモリの内容をチェックする + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 70; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + memcpy(response.c_array(), "HTTP/1.1 200 OK\r\nCookie: monkey=1234567890123456789012345678901234567890", 72); + response_len = 72; + + ret = handle_realserver_recv(boost::this_thread::get_id(), rs_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_RECV); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_max_size, USE_BUFFER_SIZE); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_rest_size, 18u); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer, recive_data_global.recive_buffer2); + //メモリの内容をチェックする + cmp_ret = memcmp(recive_data_global.recive_buffer, response.c_array(), 72); + BOOST_CHECK_EQUAL(cmp_ret, 0); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 72u); + + cout << "[321]--------------------------------------------- " << endl; + // unit_test[321] データバッファ残サイズ < レスポンスデータサイズ + // unit_test[321] ●使用中データバッファがデータバッファ1の場合、データバッファMAXサイズ = 未送信データサイズ(0) + レスポンスデータサイズ。 + // unit_test[321] ●メモリの内容をチェックする + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 70; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + memcpy(response.c_array(), "HTTP/1.1 200 OK\r\nCookie: monkey=1234567890123456789012345678901234567890123456789012345678", 90); + response_len = 90; + + ret = handle_realserver_recv(boost::this_thread::get_id(), rs_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_RECV); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_max_size, USE_BUFFER_SIZE); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer, recive_data_global.recive_buffer2); + //メモリの内容をチェックする + cmp_ret = memcmp(recive_data_global.recive_buffer, response.c_array(), 90); + BOOST_CHECK_EQUAL(cmp_ret, 0); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 90u); + + cout << "[322]--------------------------------------------- " << endl; + // unit_test[322] データバッファ残サイズ < レスポンスデータサイズ + // unit_test[322] ●使用中データバッファがデータバッファ1の場合、データバッファMAXサイズ > 未送信データサイズ(20) + レスポンスデータサイズ。 + // unit_test[322] ●メモリの内容をチェックする + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 50; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_NG; + send_status_temp.send_offset = 20; + send_status_temp.unsend_size = 20; + recive_data_global.send_status_list.push_back(send_status_temp); + + //未送信データ + memcpy(recive_data_global.recive_buffer + 20, "HTTP/1.1 200 OK\r\nCoo", 20); + + //レスポンスデータ + memcpy(response.c_array(), "kie: monkey=1234567890123456789012345678901234567890", 52); + response_len = 52; + + ret = handle_realserver_recv(boost::this_thread::get_id(), rs_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_RECV); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_max_size, USE_BUFFER_SIZE); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_rest_size, 18u); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer, recive_data_global.recive_buffer2); + + //メモリの内容をチェックする + cmp_ret = memcmp(recive_data_global.recive_buffer, "HTTP/1.1 200 OK\r\nCoo", 20); + BOOST_CHECK_EQUAL(cmp_ret, 0); + cmp_ret = memcmp(recive_data_global.recive_buffer + 20, response.c_array(), 52); + BOOST_CHECK_EQUAL(cmp_ret, 0); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 72u); + + cout << "[323]--------------------------------------------- " << endl; + // unit_test[323] データバッファ残サイズ < レスポンスデータサイズ + // unit_test[323] ●使用中データバッファがデータバッファ1の場合、データバッファMAXサイズ = 未送信データサイズ(20) + レスポンスデータサイズ。 + // unit_test[323] ●メモリの内容をチェックする + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 50; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_NG; + send_status_temp.send_offset = 20; + send_status_temp.unsend_size = 20; + recive_data_global.send_status_list.push_back(send_status_temp); + + //未送信データ + memcpy(recive_data_global.recive_buffer + 20, "HTTP/1.1 200 OK\r\nCoo", 20); + + //レスポンスデータ + memcpy(response.c_array(), "kie: monkey=1234567890123456789012345678901234567890123456789012345678", 70); + response_len = 70; + + ret = handle_realserver_recv(boost::this_thread::get_id(), rs_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_RECV); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_max_size, USE_BUFFER_SIZE); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer, recive_data_global.recive_buffer2); + + //メモリの内容をチェックする + cmp_ret = memcmp(recive_data_global.recive_buffer, "HTTP/1.1 200 OK\r\nCoo", 20); + BOOST_CHECK_EQUAL(cmp_ret, 0); + cmp_ret = memcmp(recive_data_global.recive_buffer + 20, response.c_array(), 70); + BOOST_CHECK_EQUAL(cmp_ret, 0); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 90u); + + cout << "[324]--------------------------------------------- " << endl; + // unit_test[324] データバッファ残サイズ < レスポンスデータサイズ + // unit_test[324] ●使用中データバッファがデータバッファ2の場合、データバッファMAXサイズ > 未送信データサイズ(0) + レスポンスデータサイズ。 + // unit_test[324] ●メモリの内容をチェックする + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 70; + recive_data_global.recive_buffer = recive_data_global.recive_buffer2; + recive_data_global.send_status_list.clear(); + + memcpy(response.c_array(), "HTTP/1.1 200 OK\r\nCookie: monkey=1234567890123456789012345678901234567890", 72); + response_len = 72; + + ret = handle_realserver_recv(boost::this_thread::get_id(), rs_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_RECV); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_max_size, USE_BUFFER_SIZE); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_rest_size, 18u); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer, recive_data_global.recive_buffer1); + + //メモリの内容をチェックする + cmp_ret = memcmp(recive_data_global.recive_buffer, response.c_array(), 72); + BOOST_CHECK_EQUAL(cmp_ret, 0); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 72u); + + cout << "[325]--------------------------------------------- " << endl; + // unit_test[325] データバッファ残サイズ < レスポンスデータサイズ + // unit_test[325] ●使用中データバッファがデータバッファ2の場合、データバッファMAXサイズ = 未送信データサイズ(0) + レスポンスデータサイズ。 + // unit_test[325] ●メモリの内容をチェックする + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 70; + recive_data_global.recive_buffer = recive_data_global.recive_buffer2; + recive_data_global.send_status_list.clear(); + + memcpy(response.c_array(), + "HTTP/1.1 200 OK\r\nCookie: monkey=1234567890123456789012345678901234567890123456789012345678", 90); + response_len = 90; + + ret = handle_realserver_recv(boost::this_thread::get_id(), rs_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_RECV); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_max_size, USE_BUFFER_SIZE); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer, recive_data_global.recive_buffer1); + + //メモリの内容をチェックする + cmp_ret = memcmp(recive_data_global.recive_buffer, response.c_array(), 90); + BOOST_CHECK_EQUAL(cmp_ret, 0); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 90u); + + cout << "[326]--------------------------------------------- " << endl; + // unit_test[326] データバッファ残サイズ < レスポンスデータサイズ + // unit_test[326] ●使用中データバッファがデータバッファ2の場合、データバッファMAXサイズ > 未送信データサイズ(20) + レスポンスデータサイズ。 + // unit_test[326] ●メモリの内容をチェックする + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 50; + recive_data_global.recive_buffer = recive_data_global.recive_buffer2; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_NG; + send_status_temp.send_offset = 20; + send_status_temp.unsend_size = 20; + recive_data_global.send_status_list.push_back(send_status_temp); + + //未送信データ + memcpy(recive_data_global.recive_buffer + 20, "HTTP/1.1 200 OK\r\nCoo", 20); + + //レスポンスデータ + memcpy(response.c_array(), "kie: monkey=1234567890123456789012345678901234567890", 52); + response_len = 52; + + ret = handle_realserver_recv(boost::this_thread::get_id(), rs_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_RECV); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_max_size, USE_BUFFER_SIZE); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_rest_size, 18u); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer, recive_data_global.recive_buffer1); + + //メモリの内容をチェックする + cmp_ret = memcmp(recive_data_global.recive_buffer, "HTTP/1.1 200 OK\r\nCoo", 20); + BOOST_CHECK_EQUAL(cmp_ret, 0); + cmp_ret = memcmp(recive_data_global.recive_buffer + 20, response.c_array(), 52); + BOOST_CHECK_EQUAL(cmp_ret, 0); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 72u); + + cout << "[327]--------------------------------------------- " << endl; + // unit_test[327] データバッファ残サイズ < レスポンスデータサイズ + // unit_test[327] ●使用中データバッファがデータバッファ2の場合、データバッファMAXサイズ = 未送信データサイズ(20) + レスポンスデータサイズ。 + // unit_test[327] ●メモリの内容をチェックする + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 50; + recive_data_global.recive_buffer = recive_data_global.recive_buffer2; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_NG; + send_status_temp.send_offset = 20; + send_status_temp.unsend_size = 20; + recive_data_global.send_status_list.push_back(send_status_temp); + + //未送信データ + memcpy(recive_data_global.recive_buffer + 20, "HTTP/1.1 200 OK\r\nCoo", 20); + + //レスポンスデータ + memcpy(response.c_array(), "kie: monkey=1234567890123456789012345678901234567890123456789012345678", 70); + response_len = 70; + + ret = handle_realserver_recv(boost::this_thread::get_id(), rs_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_RECV); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_max_size, USE_BUFFER_SIZE); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer, recive_data_global.recive_buffer1); + + //メモリの内容をチェックする + cmp_ret = memcmp(recive_data_global.recive_buffer, "HTTP/1.1 200 OK\r\nCoo", 20); + BOOST_CHECK_EQUAL(cmp_ret, 0); + cmp_ret = memcmp(recive_data_global.recive_buffer + 20, response.c_array(), 70); + BOOST_CHECK_EQUAL(cmp_ret, 0); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 90u); + + cout << "[328]--------------------------------------------- " << endl; + // unit_test[328] データバッファ残サイズ > レスポンスデータサイズ + // unit_test[328] ●メモリの内容をチェックする + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 70; + recive_data_global.recive_buffer = recive_data_global.recive_buffer2; + recive_data_global.send_status_list.clear(); + + memcpy(response.c_array(), "HTTP/1.1 200 OK\r\nCookie: monkey=123456789012345678901234567890", 62); + response_len = 62; + + ret = handle_realserver_recv(boost::this_thread::get_id(), rs_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_RECV); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_max_size, USE_BUFFER_SIZE); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_rest_size, 8u); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer, recive_data_global.recive_buffer2); + + //メモリの内容をチェックする + cmp_ret = memcmp(recive_data_global.recive_buffer + 20, response.c_array(), 62); + BOOST_CHECK_EQUAL(cmp_ret, 0); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 20u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 62u); + + cout << "[329]--------------------------------------------- " << endl; + // unit_test[329] データバッファ残サイズ = レスポンスデータサイズ + // unit_test[329] ●メモリの内容をチェックする + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 70; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + memcpy(response.c_array(), "HTTP/1.1 200 OK\r\nCookie: monkey=12345678901234567890123456789012345678", 70); + response_len = 70; + + ret = handle_realserver_recv(boost::this_thread::get_id(), rs_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_RECV); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_max_size, USE_BUFFER_SIZE); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer, recive_data_global.recive_buffer1); + + //メモリの内容をチェックする + cmp_ret = memcmp(recive_data_global.recive_buffer + 20, response.c_array(), 70); + BOOST_CHECK_EQUAL(cmp_ret, 0); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 20u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 70u); + + // unit_test_part3 begin: + cout << "[330]--------------------------------------------- " << endl; + // unit_test[330] 送信状態リストの要素の送信状態が送信継続 + // unit_test[330] ●送信データ残サイズ < レスポンスデータ残サイズ + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 11; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_CONTINUE; + send_status_temp.send_offset = 40; + send_status_temp.send_end_size = 39; + send_status_temp.send_rest_size = 20; + recive_data_global.send_status_list.push_back(send_status_temp); + //未送信データを生成する + memcpy(recive_data_global.recive_buffer + 40, "HTTP/1.1 200 OK\r\nContent-Length: 20\r\n\r\n", 39); + + memcpy(response.c_array(), "12345678901234567890HTTP/1.1 200 OK\r\nContent-Lengt", REQUEST_BUFFER_SIZE); + response_len = REQUEST_BUFFER_SIZE; + + ret = handle_realserver_recv(boost::this_thread::get_id(), rs_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_CONNECTION_CHECK); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 2u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 20u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_offset, 20u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->unsend_size, 30u); + + cout << "[331]--------------------------------------------- " << endl; + // unit_test[331] 送信状態リストの要素の送信状態が送信継続 + // unit_test[331] ●送信データ残サイズ = レスポンスデータ残サイズ + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 11; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_CONTINUE; + send_status_temp.send_offset = 40; + send_status_temp.send_end_size = 39; + send_status_temp.send_rest_size = 50; + recive_data_global.send_status_list.push_back(send_status_temp); + //未送信データを生成する + memcpy(recive_data_global.recive_buffer + 40, "HTTP/1.1 200 OK\r\nContent-Length: 50\r\n\r\n", 39); + + memcpy(response.c_array(), "12345678901234567890123456789012345678901234567890", REQUEST_BUFFER_SIZE); + response_len = REQUEST_BUFFER_SIZE; + + ret = handle_realserver_recv(boost::this_thread::get_id(), rs_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_CONNECTION_CHECK); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 50u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + + cout << "[332]--------------------------------------------- " << endl; + // unit_test[332] 送信状態リストの要素の送信状態が送信継続 + // unit_test[332] ●送信データ残サイズ > レスポンスデータ残サイズ + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 11; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_CONTINUE; + send_status_temp.send_offset = 40; + send_status_temp.send_end_size = 39; + send_status_temp.send_rest_size = 80; + recive_data_global.send_status_list.push_back(send_status_temp); + // 未送信データを生成する + memcpy(recive_data_global.recive_buffer + 40, "HTTP/1.1 200 OK\r\nContent-Length: 80\r\n\r\n", 39); + + memcpy(response.c_array(), "12345678901234567890123456789012345678901234567890", REQUEST_BUFFER_SIZE); + response_len = REQUEST_BUFFER_SIZE; + + ret = handle_realserver_recv(boost::this_thread::get_id(), rs_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_CONNECTION_CHECK); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 30u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 50u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + + cout << "[333]--------------------------------------------- " << endl; + // unit_test[333] 送信状態が送信不可の場合 + // unit_test[333] ●HTTPバージョンの妥当性をチェックして、異常の場合 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 0; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_NG; + send_status_temp.send_offset = 89; + send_status_temp.unsend_size = 1; + recive_data_global.send_status_list.push_back(send_status_temp); + //未送信データを生成する + recive_data_global.recive_buffer[89] = 'H'; + + memcpy(response.c_array(), "TTP/1.9 200 OK\r\n4567890123456789012345678901234567", REQUEST_BUFFER_SIZE); + response_len = REQUEST_BUFFER_SIZE; + + ret = handle_realserver_recv(boost::this_thread::get_id(), rs_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_CONNECTION_CHECK); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 51u); + + cout << "[334]--------------------------------------------- " << endl; + // unit_test[334] 送信状態が送信不可の場合 + // unit_test[334] ●HTTPバージョンの妥当性をチェックして、チェック不可の場合 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 0; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_NG; + send_status_temp.send_offset = 89; + send_status_temp.unsend_size = 1; + recive_data_global.send_status_list.push_back(send_status_temp); + //未送信データを生成する + recive_data_global.recive_buffer[89] = 'H'; + + memcpy(response.c_array(), "OST / HTT", 10); + response_len = 10; + + ret = handle_realserver_recv(boost::this_thread::get_id(), rs_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_RECV); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 11u); + + cout << "[335]--------------------------------------------- " << endl; + // unit_test[335] 送信状態が送信不可の場合 + // unit_test[335] ●HTTPヘッダの妥当性をチェックして、不可の場合 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 0; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + send_status_temp.status = SEND_NG; + send_status_temp.send_offset = 89; + send_status_temp.unsend_size = 1; + recive_data_global.send_status_list.push_back(send_status_temp); + //未送信データを生成する + recive_data_global.recive_buffer[89] = 'H'; + + memcpy(response.c_array(), "TTP/1.0 200 OK\r\nCookie: monkey=1111111111111111111", REQUEST_BUFFER_SIZE); + response_len = REQUEST_BUFFER_SIZE; + + ret = handle_realserver_recv(boost::this_thread::get_id(), rs_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_RECV); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 51u); + + cout << "[336]--------------------------------------------- " << endl; + // unit_test[336] 送信状態が送信不可の場合 + // unit_test[336] ●HTTPヘッダ(ContentLength)があり + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 0; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + send_status_temp.status = SEND_NG; + send_status_temp.send_offset = 89; + send_status_temp.unsend_size = 1; + recive_data_global.send_status_list.push_back(send_status_temp); + //未送信データを生成する + recive_data_global.recive_buffer[89] = 'H'; + + memcpy(response.c_array(), "TTP/1.0 200 OK\r\nContent-Length: 15\r\n\r\n123456789012", REQUEST_BUFFER_SIZE); + response_len = REQUEST_BUFFER_SIZE; + + ret = handle_realserver_recv(boost::this_thread::get_id(), rs_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_CONNECTION_CHECK); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 3u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 51u); + + cout << "[337]--------------------------------------------- " << endl; + // unit_test[337] 送信状態が送信不可の場合 + // unit_test[337] ●HTTPヘッダ(ContentLength)なし + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 0; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + send_status_temp.status = SEND_NG; + send_status_temp.send_offset = 89; + send_status_temp.unsend_size = 1; + recive_data_global.send_status_list.push_back(send_status_temp); + //未送信データを生成する + recive_data_global.recive_buffer[89] = 'H'; + + memcpy(response.c_array(), "TTP/1.0 200 OK\r\nCookie: monkey=111111111111111\r\n\r\n", REQUEST_BUFFER_SIZE); + response_len = REQUEST_BUFFER_SIZE; + + ret = handle_realserver_recv(boost::this_thread::get_id(), rs_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_CONNECTION_CHECK); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 51u); + + cout << "[338]--------------------------------------------- " << endl; + // unit_test[338] 送信状態が送信不可の場合 + // unit_test[338] ●送信データ残サイズ > 未送信データサイズ + レスポンスデータ残サイズ + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 70; + recive_data_global.recive_buffer = recive_data_global.recive_buffer2; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_NG; + send_status_temp.send_offset = 0; + send_status_temp.unsend_size = 20; + recive_data_global.send_status_list.push_back(send_status_temp); + + //未送信データ + memcpy(recive_data_global.recive_buffer, "HTTP/1.0 200 OK\r\nCoo", 20); + + //レスポンスデータ + memcpy(response.c_array(), "kie: monkey=123456789012345678901\r\n\r\nGET", 40); + response_len = 40; + + ret = handle_realserver_recv(boost::this_thread::get_id(), rs_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_CONNECTION_CHECK); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_max_size, USE_BUFFER_SIZE); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_rest_size, 30u); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 2u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 57u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_offset, 57u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->unsend_size, 3u); + + cout << "[339]--------------------------------------------- " << endl; + // unit_test[339] 送信状態が送信不可の場合 + // unit_test[339] ●送信データ残サイズ < 未送信データサイズ + レスポンスデータ残サイズ + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 70; + recive_data_global.recive_buffer = recive_data_global.recive_buffer2; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_NG; + send_status_temp.send_offset = 0; + send_status_temp.unsend_size = 20; + recive_data_global.send_status_list.push_back(send_status_temp); + + //未送信データ + memcpy(recive_data_global.recive_buffer, "HTTP/1.0 200 OK\r\nCoo", 20); + + //レスポンスデータ + memcpy(response.c_array(), "kie: monkey=123\r\nContent-Length: 100\r\n\r\n0123456789", 50); + response_len = 50; + + ret = handle_realserver_recv(boost::this_thread::get_id(), rs_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_CONNECTION_CHECK); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_max_size, USE_BUFFER_SIZE); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_rest_size, 20u); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 90u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 70u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 0u); + + cout << "[340]--------------------------------------------- " << endl; + // unit_test[340] 送信状態が送信不可の場合 + // unit_test[340] ●送信データ残サイズ = 未送信データサイズ + レスポンスデータ残サイズ + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 70; + recive_data_global.recive_buffer = recive_data_global.recive_buffer2; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_NG; + send_status_temp.send_offset = 0; + send_status_temp.unsend_size = 20; + recive_data_global.send_status_list.push_back(send_status_temp); + + //未送信データ + memcpy(recive_data_global.recive_buffer, "HTTP/1.0 200 OK\r\nCoo", 20); + + //レスポンスデータ + memcpy(response.c_array(), "kie: monkey=123\r\nContent-Length: 11\r\n\r\n01234567890", 50); + response_len = 50; + + ret = handle_realserver_recv(boost::this_thread::get_id(), rs_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_CONNECTION_CHECK); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_max_size, USE_BUFFER_SIZE); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_rest_size, 20u); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 70u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 0u); + + cout << "[341]--------------------------------------------- " << endl; + // unit_test[341] レスポンスデータ残サイズ < 0 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 70; + recive_data_global.recive_buffer = recive_data_global.recive_buffer2; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_NG; + send_status_temp.send_offset = 0; + send_status_temp.unsend_size = 20; + recive_data_global.send_status_list.push_back(send_status_temp); + + //未送信データ + memcpy(recive_data_global.recive_buffer, "HTTP/1.0 200 OK\r\nCoo", 20); + + //レスポンスデータ + memcpy(response.c_array(), "kie: monkey=123456789012345678901\r\n\r\nGET", 40); + response_len = 40; + + ret = handle_realserver_recv(boost::this_thread::get_id(), rs_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_CONNECTION_CHECK); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_max_size, USE_BUFFER_SIZE); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_rest_size, 30u); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 2u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 57u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 0u); + + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_offset, 57u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->unsend_size, 3u); + + cout << "[342]--------------------------------------------- " << endl; + // unit_test[342] レスポンスデータ残サイズ = 0 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 70; + recive_data_global.recive_buffer = recive_data_global.recive_buffer2; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_NG; + send_status_temp.send_offset = 0; + send_status_temp.unsend_size = 20; + recive_data_global.send_status_list.push_back(send_status_temp); + + //未送信データ + memcpy(recive_data_global.recive_buffer, "HTTP/1.0 200 OK\r\nCoo", 20); + + //レスポンスデータ + memcpy(response.c_array(), "kie: monkey=123\r\nContent-Length: 11\r\n\r\n01234567890", 50); + response_len = 50; + + ret = handle_realserver_recv(boost::this_thread::get_id(), rs_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_CONNECTION_CHECK); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_max_size, USE_BUFFER_SIZE); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_rest_size, 20u); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 70u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 0u); + + // unit_test_part4 begin: + cout << "[343]--------------------------------------------- " << endl; + // unit_test[343] レスポンスデータ残サイズ > 0 + // unit_test[343] ●HTTPバージョンの妥当性をチェックして、不可の場合 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = USE_BUFFER_SIZE; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + memcpy(response.c_array(), "HTTP/1.0 200 OK\r\nContent-Length: 10\r\n\r\n1234567890G", REQUEST_BUFFER_SIZE); + response_len = REQUEST_BUFFER_SIZE; + + ret = handle_realserver_recv(boost::this_thread::get_id(), rs_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_CONNECTION_CHECK); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 2u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 49u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 0u); + + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_offset, 49u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->unsend_size, 1u); + + cout << "[344]--------------------------------------------- " << endl; + // unit_test[344] レスポンスデータ残サイズ > 0 + // unit_test[344] ●HTTPバージョンの妥当性をチェックして、異常の場合 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + memcpy(response.c_array(), "HTTP/2.2 200 OK\r\n567890123456789012345678901234567", REQUEST_BUFFER_SIZE); + response_len = REQUEST_BUFFER_SIZE; + + ret = handle_realserver_recv(boost::this_thread::get_id(), rs_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_CONNECTION_CHECK); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 50u); + + cout << "[345]--------------------------------------------- " << endl; + // unit_test[345] レスポンスデータ残サイズ > 0 + // unit_test[345] ●HTTPヘッダの妥当性をチェックして、不可の場合 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + memcpy(response.c_array(), "HTTP/1.0 200 OK\r\nCookie: monkey=111111111111111111", REQUEST_BUFFER_SIZE); + response_len = REQUEST_BUFFER_SIZE; + + ret = handle_realserver_recv(boost::this_thread::get_id(), rs_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_RECV); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 50u); + + cout << "[346]--------------------------------------------- " << endl; + // unit_test[346] レスポンスデータ残サイズ > 0 + // unit_test[346] ●HTTPヘッダ(ContentLength)があり + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + memcpy(response.c_array(), "HTTP/1.0 200 OK\r\nContent-Length: 15\r\n\r\n12345678901", REQUEST_BUFFER_SIZE); + response_len = REQUEST_BUFFER_SIZE; + + ret = handle_realserver_recv(boost::this_thread::get_id(), rs_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_CONNECTION_CHECK); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 4u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 50u); + + cout << "[347]--------------------------------------------- " << endl; + // unit_test[347] レスポンスデータ残サイズ > 0 + // unit_test[347] ●HTTPヘッダ(ContentLength)なし + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 0; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + memcpy(response.c_array(), "HTTP/1.0 200 OK\r\nCookie: monkey=11111111111111\r\n\r\n", REQUEST_BUFFER_SIZE); + response_len = REQUEST_BUFFER_SIZE; + + ret = handle_realserver_recv(boost::this_thread::get_id(), rs_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_CONNECTION_CHECK); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 50u); + + cout << "[348]--------------------------------------------- " << endl; + // unit_test[348] レスポンスデータ残サイズ > 0 + // unit_test[348] ●送信データ残サイズ = レスポンスデータ残サイズ + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 0; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + memcpy(response.c_array(), "HTTP/1.0 200 OK\r\nCookie: monkey=11111111111111\r\n\r\n", REQUEST_BUFFER_SIZE); + response_len = REQUEST_BUFFER_SIZE; + + ret = handle_realserver_recv(boost::this_thread::get_id(), rs_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_CONNECTION_CHECK); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 50u); + + cout << "[349]--------------------------------------------- " << endl; + // unit_test[349] レスポンスデータ残サイズ > 0 + // unit_test[349] ●送信データ残サイズ < レスポンスデータ残サイズ + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 0; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + memcpy(response.c_array(), "HTTP/1.0 200 OK\r\nContent-Length: 0\r\n\r\nHTTP/1.0 200", REQUEST_BUFFER_SIZE); + response_len = REQUEST_BUFFER_SIZE; + + ret = handle_realserver_recv(boost::this_thread::get_id(), rs_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_CONNECTION_CHECK); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 2u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 38u); + + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_offset, 38u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->unsend_size, 12u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_possible_size, 0u); + + cout << "[350]--------------------------------------------- " << endl; + // unit_test[350] レスポンスデータ残サイズ > 0 + // unit_test[350] ●送信データ残サイズ > レスポンスデータ残サイズ + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + memcpy(response.c_array(), "HTTP/1.0 200 OK\r\nContent-Length: 20\r\n\r\n12345678901", REQUEST_BUFFER_SIZE); + response_len = REQUEST_BUFFER_SIZE; + + ret = handle_realserver_recv(boost::this_thread::get_id(), rs_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_CONNECTION_CHECK); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 9u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, REQUEST_BUFFER_SIZE); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + + cout << "[351]--------------------------------------------- " << endl; + // unit_test[351] レスポンスデータ残サイズ > 0 + // unit_test[351] ●出力の送信状態リスト: 1:送信待 2:送信待 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 76; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_NG; + send_status_temp.send_offset = 0; + send_status_temp.send_end_size = 0; + send_status_temp.unsend_size = 14; + recive_data_global.send_status_list.push_back(send_status_temp); + + //未送信データ + memcpy(recive_data_global.recive_buffer, "HTTP/1.0 200 O", 14); + + memcpy(response.c_array(), "K\r\nCookie: m=1\r\n\r\nHTTP/1.0 200 OK\r\nCookie: m=1\r\n\r\n", 50); + response_len = 50; + + ret = handle_realserver_recv(boost::this_thread::get_id(), rs_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_CONNECTION_CHECK); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 2u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 32u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + + BOOST_CHECK_EQUAL((recive_data_global.send_status_list.rbegin())->status, SEND_OK); + BOOST_CHECK_EQUAL((recive_data_global.send_status_list.rbegin())->send_rest_size, 0u); + BOOST_CHECK_EQUAL((recive_data_global.send_status_list.rbegin())->send_possible_size, 32u); + BOOST_CHECK_EQUAL((recive_data_global.send_status_list.rbegin())->send_offset, 32u); + + cout << "[352]--------------------------------------------- " << endl; + // unit_test[352] レスポンスデータ残サイズ > 0 + // unit_test[352] ●出力の送信状態リスト: 1:送信待 2:送信不可 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = USE_BUFFER_SIZE; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + memcpy(response.c_array(), "HTTP/1.0 200 OK\r\nContent-Length: 10\r\n\r\n1234567890G", REQUEST_BUFFER_SIZE); + response_len = REQUEST_BUFFER_SIZE; + + ret = handle_realserver_recv(boost::this_thread::get_id(), rs_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_CONNECTION_CHECK); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 2u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 49u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 0u); + + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->unsend_size, 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_offset, 49u); + + cout << "[353]--------------------------------------------- " << endl; + // unit_test[353] レスポンスデータ残サイズ > 0 + // unit_test[353] ●出力の送信状態リスト: 1:送信待 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + memcpy(response.c_array(), "HTTP/1.0 200 OK\r\nContent-Length: 15\r\n\r\n12345678901", REQUEST_BUFFER_SIZE); + response_len = REQUEST_BUFFER_SIZE; + + ret = handle_realserver_recv(boost::this_thread::get_id(), rs_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_CONNECTION_CHECK); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 4u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 50u); + + cout << "[354]--------------------------------------------- " << endl; + // unit_test[354] レスポンスデータ残サイズ > 0 + // unit_test[354] ●出力の送信状態リスト: 1:送信不可 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = USE_BUFFER_SIZE; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + memcpy(response.c_array(), "HTTP/1.0 200 OK\r\n456789012345678901234567890123456", REQUEST_BUFFER_SIZE); + response_len = REQUEST_BUFFER_SIZE; + + ret = handle_realserver_recv(boost::this_thread::get_id(), rs_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_RECV); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 50u); + + cout << "[355]--------------------------------------------- " << endl; + // unit_test[355] 送信可能データがあり + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = USE_BUFFER_SIZE; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + memcpy(response.c_array(), "HTTP/1.0 200 OK\r\nHOST: KKK\r\n\r\nHTTP/1.0 200 OK\r\nHOS", REQUEST_BUFFER_SIZE); + response_len = REQUEST_BUFFER_SIZE; + + ret = handle_realserver_recv(boost::this_thread::get_id(), rs_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_CONNECTION_CHECK); + + cout << "[356]--------------------------------------------- " << endl; + // unit_test[356] 送信可能データなし + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + memcpy(response.c_array(), "HTTP/1.0 200 OK\r\nCookie: monkey=111111111111111111", REQUEST_BUFFER_SIZE); + response_len = REQUEST_BUFFER_SIZE; + + ret = handle_realserver_recv(boost::this_thread::get_id(), rs_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, REALSERVER_RECV); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 50u); +} + +//handle_realserver_recv_tcp_test_thread +void handle_realserver_recv_tcp_test_thread(){ + EVENT_TAG ret; + boost::array response; + send_status send_status_temp; + recive_data recive_data_tmp; + boost::thread down_thread(&down_thread_func); + boost::asio::ip::tcp::endpoint rs_endpoint = string_to_endpoint("10.10.10.1:8080"); + thread_data_ptr psession_thread_data(new session_thread_data_sessionless); + init_session_thread_data_sessionless(psession_thread_data, down_thread.get_id()); + psession_thread_data->target_endpoint = rs_endpoint; + + { + boost::mutex::scoped_lock sclock(this->session_thread_data_map_mutex); + this->session_thread_data_map[boost::this_thread::get_id()] = psession_thread_data; + this->forwarded_for = 1; + } + + init_recive_data(recive_data_tmp); + + psession_thread_data->recive_data_map[rs_endpoint] = recive_data_tmp; + std::map::iterator it = + psession_thread_data->recive_data_map.find(rs_endpoint); + recive_data& recive_data_global = it->second; + + cout << "[357]--------------------------------------------- " << endl; + // unit_test[357] レスポンスデータ残サイズ > 0 + // unit_test[357] ●出力の送信状態リスト: 1:送信待 2:送信不可 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 76; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_NG; + send_status_temp.send_offset = 0; + send_status_temp.send_end_size = 0; + send_status_temp.unsend_size = 14; + recive_data_global.send_status_list.push_back(send_status_temp); + + //未送信データ + memcpy(recive_data_global.recive_buffer, "HTTP/1.0 200 O", 14); + + memcpy(response.c_array(), "K\r\nCookie: m=1\r\n\r\nHTTP/1.0 200 OK\r\nCookie: m=1\r\n\r", 49); + size_t response_len = 49; + + ret = handle_realserver_recv(boost::this_thread::get_id(), rs_endpoint, response, response_len); + + { + boost::mutex::scoped_lock sclock(check_mutex); + BOOST_CHECK_EQUAL(ret, CLIENT_CONNECTION_CHECK); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 2u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 32u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + + BOOST_CHECK_EQUAL((recive_data_global.send_status_list.rbegin())->status, SEND_NG); + BOOST_CHECK_EQUAL((recive_data_global.send_status_list.rbegin())->send_rest_size, 0u); + BOOST_CHECK_EQUAL((recive_data_global.send_status_list.rbegin())->unsend_size, 31u); + BOOST_CHECK_EQUAL((recive_data_global.send_status_list.rbegin())->send_offset, 32u); + } +} + +//handle_realserver_recv(udp) 郎希倹 +void handle_realserver_recv_udp_test() { + boost::asio::ip::udp::endpoint rs_endpoint; + boost::array recvbuffer; + size_t recvlen = 0; + + cout << "[358]--------------------------------------------- " << endl; + // unit_test[358] 異常系で必ずSTOPを返す + BOOST_CHECK_EQUAL(this->handle_realserver_recv(boost::this_thread::get_id(), rs_endpoint, recvbuffer, recvlen), STOP); +} + +//handle_sorryserver_recv 郎希倹 +void handle_sorryserver_recv_test() { + size_t response_len = USE_BUFFER_SIZE; + EVENT_TAG ret; + boost::array response; + send_status send_status_temp; + boost::thread up_thread(&up_thread_func); + thread_data_ptr psession_thread_data(new session_thread_data_sessionless); + init_session_thread_data_sessionless(psession_thread_data, up_thread.get_id()); + recive_data recive_data_tmp; + + init_send_status(send_status_temp); + // recive_dataを作成する + init_recive_data(recive_data_tmp); + recive_data_tmp.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_tmp.recive_buffer_rest_size = USE_BUFFER_SIZE; + + //recive_data_mapを作成する + psession_thread_data->end_flag = END_FLAG_OFF; + psession_thread_data->last_status = SORRYSERVER_RECV; + boost::asio::ip::tcp::endpoint sorry_endpoint = string_to_endpoint("111.111.111.111:8080"); + psession_thread_data->target_endpoint = sorry_endpoint; + + //session_thread_dataを作成する + psession_thread_data->recive_data_map.clear(); + psession_thread_data->recive_data_map[sorry_endpoint] = recive_data_tmp; + this->forwarded_for = 1; + + cout << "[359]--------------------------------------------- " << endl; + // unit_test[359] boost::this_thread::get_id()対応のデータなし + this->session_thread_data_map.clear(); + ret = handle_sorryserver_recv(boost::this_thread::get_id(), sorry_endpoint, response, response_len); + BOOST_CHECK_EQUAL(ret, FINALIZE); + + cout << "[360]--------------------------------------------- " << endl; + // unit_test[360] boost::this_thread::get_id()対応のデータsession_thread_dataがNULL + this->session_thread_data_map.clear(); + thread_data_ptr p; + this->session_thread_data_map[boost::this_thread::get_id()] = p; + ret = handle_sorryserver_recv(boost::this_thread::get_id(), sorry_endpoint, response, response_len); + BOOST_CHECK_EQUAL(ret, FINALIZE); + + this->session_thread_data_map.clear(); + this->session_thread_data_map[boost::this_thread::get_id()] = psession_thread_data; + + psession_thread_data->recive_data_map.clear(); + psession_thread_data->recive_data_map[sorry_endpoint] = recive_data_tmp; + std::map::iterator it = + psession_thread_data->recive_data_map.find(sorry_endpoint); + recive_data& recive_data_global = it->second; + + cout << "[361]--------------------------------------------- " << endl; + // unit_test[361] recive_data.recive_buffer=Null + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = NULL; + ret = handle_sorryserver_recv(boost::this_thread::get_id(), sorry_endpoint, response, response_len); + BOOST_CHECK_EQUAL(ret, FINALIZE); + + cout << "[362]--------------------------------------------- " << endl; + // unit_test[362] recive_data.recive_buffer1=Null + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 20; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer1 = NULL; + recive_data_global.recive_buffer = recive_data_global.recive_buffer2; + recive_data_global.send_status_list.clear(); + + memset(response.c_array(), 'n', 80); + response_len = 80; + + ret = handle_sorryserver_recv(boost::this_thread::get_id(), sorry_endpoint, response, response_len); + BOOST_CHECK_EQUAL(ret, FINALIZE); + + cout << "[363]--------------------------------------------- " << endl; + // unit_test[363] recive_data.recive_buffer2=Null + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 20; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = NULL; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + memset(response.c_array(), 'n', 80); + response_len = 80; + + ret = handle_sorryserver_recv(boost::this_thread::get_id(), sorry_endpoint, response, response_len); + BOOST_CHECK_EQUAL(ret, FINALIZE); + + cout << "[364]--------------------------------------------- " << endl; + // unit_test[364] new失敗の場合 + recive_data_global.recive_buffer_max_size = 0; + recive_data_global.recive_buffer_rest_size = 0; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = NULL; + recive_data_global.recive_buffer2 = NULL; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + memcpy(response.c_array(), "HTTP/1.1 200 OK\r\nContent-Length: 11\r\n\r\n01234567890", REQUEST_BUFFER_SIZE); + response_len = REQUEST_BUFFER_SIZE; + + this->getloglevel = &stb_getloglevel_is_none; + new_install(); + ret = handle_sorryserver_recv(boost::this_thread::get_id(), sorry_endpoint, response, response_len); + new_uninstall(); + this->getloglevel = &stb_getloglevel; + BOOST_CHECK_EQUAL(ret, FINALIZE); + + cout << "[365]--------------------------------------------- " << endl; + // unit_test[365] レスポンスサイズが0である + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = USE_BUFFER_SIZE; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + ret = handle_sorryserver_recv(boost::this_thread::get_id(), sorry_endpoint, response, 0); + BOOST_CHECK_EQUAL(ret, SORRYSERVER_RECV); + + cout << "[366]--------------------------------------------- " << endl; + // unit_test[366] レスポンスサイズがUINT_MAXである レスポンス実際にサイズがMAX_BUFFER_SIZEである + recive_data_global.recive_buffer_max_size = MAX_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = MAX_BUFFER_SIZE; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + memset(response.c_array(), 'n', MAX_BUFFER_SIZE); + ret = handle_sorryserver_recv(boost::this_thread::get_id(), sorry_endpoint, response, UINT_MAX); + BOOST_CHECK_EQUAL(ret, FINALIZE); + + cout << "[367]--------------------------------------------- " << endl; + // unit_test[367] レスポンスサイズがMAX_BUFFER_SIZEである レスポンス実際にサイズがMAX_BUFFER_SIZEである + recive_data_global.recive_buffer_max_size = MAX_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = MAX_BUFFER_SIZE; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + memcpy(response.c_array(), "HTTP/1.1 200 OK\r\n", 17); + memset(response.c_array() + 17, 'n', MAX_BUFFER_SIZE - 17); + + ret = handle_sorryserver_recv(boost::this_thread::get_id(), sorry_endpoint, response, MAX_BUFFER_SIZE); + BOOST_CHECK_EQUAL(ret, SORRYSERVER_RECV); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, MAX_BUFFER_SIZE); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_max_size, MAX_BUFFER_SIZE); + + // unit_test_part1 begin: + send_status status_END; + init_send_status(status_END); + status_END.status = SEND_END; + status_END.send_offset = 0; + status_END.send_end_size = 20; + + send_status status_OK; + init_send_status(status_OK); + status_OK.status = SEND_OK; + status_OK.send_offset = 0; + status_OK.send_possible_size = 20; + + send_status status_NG; + init_send_status(status_NG); + status_NG.status = SEND_NG; + status_NG.send_offset = 0; + status_NG.unsend_size = 20; + + send_status status_CONTINUE; + init_send_status(status_CONTINUE); + status_CONTINUE.status = SEND_CONTINUE; + status_CONTINUE.send_offset = 0; + status_CONTINUE.send_end_size = 20; + status_CONTINUE.send_rest_size = 20; + + send_status* send_status_NG[27][3] + = { + // unit_test 入力の送信状態リストは下記の通り:(異常系) + // unit_test[368] 送信状態リストの要素の送信状態が1:送信待の場合 + {&status_OK,NULL,NULL}, + // unit_test[369] 送信状態リストの要素の送信状態が1:送信済 2:送信待の場合 + {&status_END,&status_OK,NULL}, + // unit_test[370] 送信状態リストの要素の送信状態が1:送信継続 2:送信継続の場合 + {&status_CONTINUE,&status_CONTINUE,NULL}, + // unit_test[371] 送信状態リストの要素の送信状態が1:送信継続 2:送信不可の場合 + {&status_CONTINUE,&status_NG,NULL}, + // unit_test[372] 送信状態リストの要素の送信状態が1:送信継続 2:送信済の場合 + {&status_CONTINUE,&status_END,NULL}, + // unit_test[373] 送信状態リストの要素の送信状態が1:送信継続 2:送信待の場合 + {&status_CONTINUE,&status_OK,NULL}, + // unit_test[374] 送信状態リストの要素の送信状態が1:送信不可 2:送信継続の場合 + {&status_NG,&status_CONTINUE,NULL}, + // unit_test[375] 送信状態リストの要素の送信状態が1:送信不可 2:送信不可の場合 + {&status_NG,&status_NG,NULL}, + // unit_test[376] 送信状態リストの要素の送信状態が1:送信不可 2:送信済の場合 + {&status_NG,&status_END,NULL}, + // unit_test[377] 送信状態リストの要素の送信状態が1:送信不可 2:送信待の場合 + {&status_NG,&status_OK,NULL}, + // unit_test[378] 送信状態リストの要素の送信状態が1:送信待 2:送信継続の場合 + {&status_OK,&status_CONTINUE,NULL}, + // unit_test[379] 送信状態リストの要素の送信状態が1:送信待 2:送信不可の場合 + {&status_OK,&status_NG,NULL}, + // unit_test[380] 送信状態リストの要素の送信状態が1:送信待 2:送信済の場合 + {&status_OK,&status_END,NULL}, + // unit_test[381] 送信状態リストの要素の送信状態が1:送信待 2:送信待の場合 + {&status_OK,&status_OK,NULL}, + // unit_test[382] 送信状態リストの要素の送信状態が1:送信済 2:送信継続 3:送信継続の場合 + {&status_END,&status_CONTINUE,&status_CONTINUE}, + // unit_test[383] 送信状態リストの要素の送信状態が1:送信済 2:送信継続 3:送信不可の場合 + {&status_END,&status_CONTINUE,&status_NG}, + // unit_test[384] 送信状態リストの要素の送信状態が1:送信済 2:送信継続 3:送信済の場合 + {&status_END,&status_CONTINUE,&status_END}, + // unit_test[385] 送信状態リストの要素の送信状態が1:送信済 2:送信継続 3:送信待の場合 + {&status_END,&status_CONTINUE,&status_OK}, + // unit_test[386] 送信状態リストの要素の送信状態が1:送信済 2:送信不可 3:送信継続の場合 + {&status_END,&status_NG,&status_CONTINUE}, + // unit_test[387] 送信状態リストの要素の送信状態が1:送信済 2:送信不可 3:送信不可の場合 + {&status_END,&status_NG,&status_NG}, + // unit_test[388] 送信状態リストの要素の送信状態が1:送信済 2:送信不可 3:送信済の場合 + {&status_END,&status_NG,&status_END}, + // unit_test[389] 送信状態リストの要素の送信状態が1:送信済 2:送信不可 3:送信待の場合 + {&status_END,&status_NG,&status_OK}, + // unit_test[390] 送信状態リストの要素の送信状態が1:送信済 2:送信済 3:送信待の場合 + {&status_END,&status_END,&status_OK}, + // unit_test[391] 送信状態リストの要素の送信状態が1:送信済 2:送信待 3:送信継続の場合 + {&status_END,&status_OK,&status_CONTINUE}, + // unit_test[392] 送信状態リストの要素の送信状態が1:送信済 2:送信待 3:送信不可の場合 + {&status_END,&status_OK,&status_NG}, + // unit_test[393] 送信状態リストの要素の送信状態が1:送信済 2:送信待 3:送信済の場合 + {&status_END,&status_OK,&status_END}, + // unit_test[394] 送信状態リストの要素の送信状態が1:送信済 2:送信待 3:送信待の場合 + {&status_END,&status_OK,&status_OK}, + }; + + int i; + int j; + + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = USE_BUFFER_SIZE; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + memset(recive_data_global.recive_buffer, 'n', USE_BUFFER_SIZE); + memset(response.c_array(), 'm', USE_BUFFER_SIZE); + for (i = 0; i < 27; i++) + { + recive_data_global.send_status_list.clear(); + + for (j = 0; j < 3; j++) + { + if(send_status_NG[i][j] == NULL) + { + break; + } + + recive_data_global.send_status_list.push_back(*(send_status_NG[i][j])); + } + + ret = handle_sorryserver_recv(boost::this_thread::get_id(), sorry_endpoint, response, response_len); + std::cout << "[" << 368 + i << "]------------------------------------------" << std::endl; + BOOST_CHECK_EQUAL(ret, FINALIZE); + } + + cout << "[395]--------------------------------------------- " << endl; + // unit_test[395] 送信状態リストの要素の送信状態が1:送信済 2:送信済 3:送信継続の場合 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 40; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_END; + send_status_temp.send_offset = 0; + send_status_temp.send_end_size = 20; + recive_data_global.send_status_list.push_back(send_status_temp); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_END; + send_status_temp.send_offset = 20; + send_status_temp.send_end_size = 20; + recive_data_global.send_status_list.push_back(send_status_temp); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_CONTINUE; + send_status_temp.send_offset = 40; + send_status_temp.send_end_size = 10; + send_status_temp.send_rest_size = 11; + recive_data_global.send_status_list.push_back(send_status_temp); + + memcpy(response.c_array(), "12345678901HTTP/1.1 200 OK\r\nContent-Length: 20\r\n\r\n", REQUEST_BUFFER_SIZE); + response_len = REQUEST_BUFFER_SIZE; + + ret = handle_sorryserver_recv(boost::this_thread::get_id(), sorry_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_CONNECTION_CHECK); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 2u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 11u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_rest_size, 20u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_possible_size, 39u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_offset, 11u); + + cout << "[396]--------------------------------------------- " << endl; + // unit_test[396] 送信状態リストの要素の送信状態が1:送信済 2:送信済 3:送信不可の場合 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 40; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_END; + send_status_temp.send_offset = 0; + send_status_temp.send_end_size = 20; + recive_data_global.send_status_list.push_back(send_status_temp); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_END; + send_status_temp.send_offset = 20; + send_status_temp.send_end_size = 20; + recive_data_global.send_status_list.push_back(send_status_temp); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_NG; + send_status_temp.send_offset = 40; + send_status_temp.unsend_size = 10; + recive_data_global.send_status_list.push_back(send_status_temp); + //未送信データを生成する + memcpy(recive_data_global.recive_buffer + 40, "HTTP/1.1 2", 10); + + memcpy(response.c_array(), "00 OK\r\nCookie: monkey=1234567890123456789012345678", REQUEST_BUFFER_SIZE); + response_len = REQUEST_BUFFER_SIZE; + + ret = handle_sorryserver_recv(boost::this_thread::get_id(), sorry_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, SORRYSERVER_RECV); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 60u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + + cout << "[397]--------------------------------------------- " << endl; + // unit_test[397] 送信状態リストの要素の送信状態が1:送信済 2:送信不可の場合 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 40; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_END; + send_status_temp.send_offset = 0; + send_status_temp.send_end_size = 40; + recive_data_global.send_status_list.push_back(send_status_temp); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_NG; + send_status_temp.send_offset = 40; + send_status_temp.unsend_size = 10; + recive_data_global.send_status_list.push_back(send_status_temp); + //未送信データを生成する + memcpy(recive_data_global.recive_buffer + 40, "HTTP/1.1 2", 10); + + memcpy(response.c_array(), "00 OK\r\nCookie: monkey=1234567890123456789012345678", REQUEST_BUFFER_SIZE); + response_len = REQUEST_BUFFER_SIZE; + + ret = handle_sorryserver_recv(boost::this_thread::get_id(), sorry_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, SORRYSERVER_RECV); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 60u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + + cout << "[398]--------------------------------------------- " << endl; + // unit_test[398] 送信状態リストの要素の送信状態が1:送信済 2:送信継続の場合 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 40; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_END; + send_status_temp.send_offset = 0; + send_status_temp.send_end_size = 40; + recive_data_global.send_status_list.push_back(send_status_temp); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_CONTINUE; + send_status_temp.send_offset = 40; + send_status_temp.send_end_size = 10; + send_status_temp.send_rest_size = 11; + recive_data_global.send_status_list.push_back(send_status_temp); + + memcpy(response.c_array(), "12345678901HTTP/1.1 200 OK\r\nContent-Length: 20\r\n\r\n", REQUEST_BUFFER_SIZE); + response_len = REQUEST_BUFFER_SIZE; + + ret = handle_sorryserver_recv(boost::this_thread::get_id(), sorry_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_CONNECTION_CHECK); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 2u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 11u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_rest_size, 20u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_possible_size, 39u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_offset, 11u); + + cout << "[399]--------------------------------------------- " << endl; + // unit_test[399] 送信状態リストの要素の送信状態が1:送信済 2:送信済の場合 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 10; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_END; + send_status_temp.send_offset = 0; + send_status_temp.send_end_size = 40; + recive_data_global.send_status_list.push_back(send_status_temp); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_END; + send_status_temp.send_offset = 40; + send_status_temp.send_end_size = 40; + recive_data_global.send_status_list.push_back(send_status_temp); + + memcpy(response.c_array(), "HTTP/1.1 200 OK\r\nContent-Length: 11\r\n\r\n12345678901", REQUEST_BUFFER_SIZE); + response_len = REQUEST_BUFFER_SIZE; + + ret = handle_sorryserver_recv(boost::this_thread::get_id(), sorry_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_CONNECTION_CHECK); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 50u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + + cout << "[400]--------------------------------------------- " << endl; + // unit_test[400] 送信状態リストの要素の送信状態が1:送信不可の場合 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 40; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_NG; + send_status_temp.send_offset = 10; + send_status_temp.unsend_size = 10; + recive_data_global.send_status_list.push_back(send_status_temp); + //未送信データを生成する + memcpy(recive_data_global.recive_buffer + 10, "HTTP/1.1 2", 10); + + memcpy(response.c_array(), "00 OK\r\nContent-Length: 21\r\n\r\n012345678901234567890", REQUEST_BUFFER_SIZE); + response_len = REQUEST_BUFFER_SIZE; + + ret = handle_sorryserver_recv(boost::this_thread::get_id(), sorry_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_CONNECTION_CHECK); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 60u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + + cout << "[401]--------------------------------------------- " << endl; + // unit_test[401] 送信状態リストの要素の送信状態が1:送信継続の場合 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 11; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_CONTINUE; + send_status_temp.send_offset = 40; + send_status_temp.send_end_size = 39; + send_status_temp.send_rest_size = 20; + + recive_data_global.send_status_list.push_back(send_status_temp); + //未送信データを生成する + memcpy(recive_data_global.recive_buffer + 40, "HTTP/1.1 200 OK\r\nContent-Length: 20\r\n\r\n", 39); + + memcpy(response.c_array(), "12345678901234567890HTTP/1.1 200 OK\r\nContent-Lengt", REQUEST_BUFFER_SIZE); + response_len = REQUEST_BUFFER_SIZE; + + ret = handle_sorryserver_recv(boost::this_thread::get_id(), sorry_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_CONNECTION_CHECK); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 2u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 20u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 0u); + + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_offset, 20u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->unsend_size, 30u); + + cout << "[402]--------------------------------------------- " << endl; + // unit_test[402] 送信状態リストの要素の送信状態が1:送信済の場合 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 10; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_END; + send_status_temp.send_offset = 0; + send_status_temp.send_end_size = 80; + recive_data_global.send_status_list.push_back(send_status_temp); + + memcpy(response.c_array(), "HTTP/1.1 200 OK\r\nContent-Length: 11\r\n\r\n12345678901", REQUEST_BUFFER_SIZE); + response_len = REQUEST_BUFFER_SIZE; + + ret = handle_sorryserver_recv(boost::this_thread::get_id(), sorry_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_CONNECTION_CHECK); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 50u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + + cout << "[403]--------------------------------------------- " << endl; + // unit_test[403] 送信状態リストの要素数が0である場合 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 10; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + memcpy(response.c_array(), "HTTP/1.1 200 OK\r\nContent-Length: 11\r\n\r\n12345678901", REQUEST_BUFFER_SIZE); + response_len = REQUEST_BUFFER_SIZE; + + ret = handle_sorryserver_recv(boost::this_thread::get_id(), sorry_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_CONNECTION_CHECK); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 50u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + + // unit_test_part2 begin: + cout << "[404]--------------------------------------------- " << endl; + // unit_test[404] データバッファ残サイズ < レスポンスデータサイズ + // unit_test[404] ●データバッファMAXサイズ < 未送信データサイズ(0) + レスポンスデータサイズ。 + // unit_test[404] ●メモリの内容をチェックする + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 80; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + memcpy(response.c_array(), "HTTP/1.1 200 OK\r\nCookie: monkey=123456789012345678901" + "23456789012345678901234567890123456789012345678901234567890", 112); + response_len = 112; + + ret = handle_sorryserver_recv(boost::this_thread::get_id(), sorry_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, SORRYSERVER_RECV); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer, recive_data_global.recive_buffer1); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_max_size, MAX_BUFFER_SIZE); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_rest_size, MAX_BUFFER_SIZE - 112); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + + //メモリの内容をチェックする + int cmp_ret = memcmp(response.c_array(), recive_data_global.recive_buffer, 112u); + BOOST_CHECK_EQUAL(cmp_ret, 0); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 112u); + + cout << "[405]--------------------------------------------- " << endl; + // unit_test[405] データバッファ残サイズ < レスポンスデータサイズ + // unit_test[405] ●データバッファMAXサイズ < 未送信データサイズ(0) + レスポンスデータサイズ。 + // unit_test[405] ●データバッファ上限値 < 未送信データサイズ + レスポンスデータサイズ + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 80; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_NG; + send_status_temp.send_offset = 10; + send_status_temp.unsend_size = MAX_SESSIONLESS_MODULE_BUFFER_SIZE; + recive_data_global.send_status_list.push_back(send_status_temp); + + memcpy(response.c_array(), "HTTP/1.1 200 OK\r\nCookie: monkey=123456789012345678901" + "23456789012345678901234567890123456789012345678901234567890", 112); + response_len = 112; + + ret = handle_sorryserver_recv(boost::this_thread::get_id(), sorry_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, FINALIZE); + + cout << "[406]--------------------------------------------- " << endl; + // unit_test[406] データバッファ残サイズ < レスポンスデータサイズ + // unit_test[406] ●データバッファMAXサイズ < 未送信データサイズ(20) + レスポンスデータサイズ。 + // unit_test[406] ●メモリの内容をチェックする + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 70; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_NG; + send_status_temp.send_offset = 0; + send_status_temp.send_end_size = 0; + send_status_temp.unsend_size = 20; + recive_data_global.send_status_list.push_back(send_status_temp); + + //未送信データ + memcpy(recive_data_global.recive_buffer, "HTTP/1.1 200 OK\r\nCoo", 20); + + //レスポンスデータ + memcpy(response.c_array(), "kie: monkey=", 12); + memset(response.c_array(), 'x', MAX_BUFFER_SIZE - 12); + response_len = MAX_BUFFER_SIZE; + + ret = handle_sorryserver_recv(boost::this_thread::get_id(), sorry_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, SORRYSERVER_RECV); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer, recive_data_global.recive_buffer1); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_max_size, MAX_BUFFER_SIZE + 20); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_rest_size, 0u); + + //メモリの内容をチェックする + cmp_ret = memcmp(recive_data_global.recive_buffer, "HTTP/1.1 200 OK\r\nCoo", 20); + BOOST_CHECK_EQUAL(cmp_ret, 0); + cmp_ret = memcmp(recive_data_global.recive_buffer + 20, response.c_array(), MAX_BUFFER_SIZE); + BOOST_CHECK_EQUAL(cmp_ret, 0); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, MAX_BUFFER_SIZE + 20); + + cout << "[407]--------------------------------------------- " << endl; + // unit_test[407] データバッファ残サイズ < レスポンスデータサイズ + // unit_test[407] ●使用中データバッファがデータバッファ1の場合、データバッファMAXサイズ > 未送信データサイズ(0) + レスポンスデータサイズ。 + // unit_test[407] ●メモリの内容をチェックする + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 70; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + memcpy(response.c_array(), "HTTP/1.1 200 OK\r\nCookie: monkey=1234567890123456789012345678901234567890", 72); + response_len = 72; + + ret = handle_sorryserver_recv(boost::this_thread::get_id(), sorry_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, SORRYSERVER_RECV); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_max_size, USE_BUFFER_SIZE); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_rest_size, 18u); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer, recive_data_global.recive_buffer2); + //メモリの内容をチェックする + cmp_ret = memcmp(recive_data_global.recive_buffer, response.c_array(), 72); + BOOST_CHECK_EQUAL(cmp_ret, 0); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 72u); + + cout << "[408]--------------------------------------------- " << endl; + // unit_test[408] データバッファ残サイズ < レスポンスデータサイズ + // unit_test[408] ●使用中データバッファがデータバッファ1の場合、データバッファMAXサイズ = 未送信データサイズ(0) + レスポンスデータサイズ。 + // unit_test[408] ●メモリの内容をチェックする + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 70; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + memcpy(response.c_array(), "HTTP/1.1 200 OK\r\nCookie: monkey=1234567890123456789012345678901234567890123456789012345678", 90); + response_len = 90; + + ret = handle_sorryserver_recv(boost::this_thread::get_id(), sorry_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, SORRYSERVER_RECV); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_max_size, USE_BUFFER_SIZE); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer, recive_data_global.recive_buffer2); + //メモリの内容をチェックする + cmp_ret = memcmp(recive_data_global.recive_buffer, response.c_array(), 90); + BOOST_CHECK_EQUAL(cmp_ret, 0); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 90u); + + cout << "[409]--------------------------------------------- " << endl; + // unit_test[409] データバッファ残サイズ < レスポンスデータサイズ + // unit_test[409] ●使用中データバッファがデータバッファ1の場合、データバッファMAXサイズ > 未送信データサイズ(20) + レスポンスデータサイズ。 + // unit_test[409] ●メモリの内容をチェックする + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 50; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_NG; + send_status_temp.send_offset = 20; + send_status_temp.unsend_size = 20; + recive_data_global.send_status_list.push_back(send_status_temp); + + //未送信データ + memcpy(recive_data_global.recive_buffer + 20, "HTTP/1.1 200 OK\r\nCoo", 20); + + //レスポンスデータ + memcpy(response.c_array(), "kie: monkey=1234567890123456789012345678901234567890", 52); + response_len = 52; + + ret = handle_sorryserver_recv(boost::this_thread::get_id(), sorry_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, SORRYSERVER_RECV); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_max_size, USE_BUFFER_SIZE); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_rest_size, 18u); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer, recive_data_global.recive_buffer2); + + //メモリの内容をチェックする + cmp_ret = memcmp(recive_data_global.recive_buffer, "HTTP/1.1 200 OK\r\nCoo", 20); + BOOST_CHECK_EQUAL(cmp_ret, 0); + cmp_ret = memcmp(recive_data_global.recive_buffer + 20, response.c_array(), 52); + BOOST_CHECK_EQUAL(cmp_ret, 0); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 72u); + + cout << "[410]--------------------------------------------- " << endl; + // unit_test[410] データバッファ残サイズ < レスポンスデータサイズ + // unit_test[410] ●使用中データバッファがデータバッファ1の場合、データバッファMAXサイズ = 未送信データサイズ(20) + レスポンスデータサイズ。 + // unit_test[410] ●メモリの内容をチェックする + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 50; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_NG; + send_status_temp.send_offset = 20; + send_status_temp.unsend_size = 20; + recive_data_global.send_status_list.push_back(send_status_temp); + + //未送信データ + memcpy(recive_data_global.recive_buffer + 20, "HTTP/1.1 200 OK\r\nCoo", 20); + + //レスポンスデータ + memcpy(response.c_array(), "kie: monkey=1234567890123456789012345678901234567890123456789012345678", 70); + response_len = 70; + + ret = handle_sorryserver_recv(boost::this_thread::get_id(), sorry_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, SORRYSERVER_RECV); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_max_size, USE_BUFFER_SIZE); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer, recive_data_global.recive_buffer2); + + //メモリの内容をチェックする + cmp_ret = memcmp(recive_data_global.recive_buffer, "HTTP/1.1 200 OK\r\nCoo", 20); + BOOST_CHECK_EQUAL(cmp_ret, 0); + cmp_ret = memcmp(recive_data_global.recive_buffer + 20, response.c_array(), 70); + BOOST_CHECK_EQUAL(cmp_ret, 0); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 90u); + + cout << "[411]--------------------------------------------- " << endl; + // unit_test[411] データバッファ残サイズ < レスポンスデータサイズ + // unit_test[411] ●使用中データバッファがデータバッファ2の場合、データバッファMAXサイズ > 未送信データサイズ(0) + レスポンスデータサイズ。 + // unit_test[411] ●メモリの内容をチェックする + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 70; + recive_data_global.recive_buffer = recive_data_global.recive_buffer2; + recive_data_global.send_status_list.clear(); + + memcpy(response.c_array(), "HTTP/1.1 200 OK\r\nCookie: monkey=1234567890123456789012345678901234567890", 72); + response_len = 72; + + ret = handle_sorryserver_recv(boost::this_thread::get_id(), sorry_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, SORRYSERVER_RECV); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_max_size, USE_BUFFER_SIZE); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_rest_size, 18u); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer, recive_data_global.recive_buffer1); + + //メモリの内容をチェックする + cmp_ret = memcmp(recive_data_global.recive_buffer, response.c_array(), 72); + BOOST_CHECK_EQUAL(cmp_ret, 0); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 72u); + + cout << "[412]--------------------------------------------- " << endl; + // unit_test[412] データバッファ残サイズ < レスポンスデータサイズ + // unit_test[412] ●使用中データバッファがデータバッファ2の場合、データバッファMAXサイズ = 未送信データサイズ(0) + レスポンスデータサイズ。 + // unit_test[412] ●メモリの内容をチェックする + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 70; + recive_data_global.recive_buffer = recive_data_global.recive_buffer2; + recive_data_global.send_status_list.clear(); + + memcpy(response.c_array(), + "HTTP/1.1 200 OK\r\nCookie: monkey=1234567890123456789012345678901234567890123456789012345678", 90); + response_len = 90; + + ret = handle_sorryserver_recv(boost::this_thread::get_id(), sorry_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, SORRYSERVER_RECV); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_max_size, USE_BUFFER_SIZE); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer, recive_data_global.recive_buffer1); + + //メモリの内容をチェックする + cmp_ret = memcmp(recive_data_global.recive_buffer, response.c_array(), 90); + BOOST_CHECK_EQUAL(cmp_ret, 0); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 90u); + + cout << "[413]--------------------------------------------- " << endl; + // unit_test[413] データバッファ残サイズ < レスポンスデータサイズ + // unit_test[413] ●使用中データバッファがデータバッファ2の場合、データバッファMAXサイズ > 未送信データサイズ(20) + レスポンスデータサイズ。 + // unit_test[413] ●メモリの内容をチェックする + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 50; + recive_data_global.recive_buffer = recive_data_global.recive_buffer2; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_NG; + send_status_temp.send_offset = 20; + send_status_temp.unsend_size = 20; + recive_data_global.send_status_list.push_back(send_status_temp); + + //未送信データ + memcpy(recive_data_global.recive_buffer + 20, "HTTP/1.1 200 OK\r\nCoo", 20); + + //レスポンスデータ + memcpy(response.c_array(), "kie: monkey=1234567890123456789012345678901234567890", 52); + response_len = 52; + + ret = handle_sorryserver_recv(boost::this_thread::get_id(), sorry_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, SORRYSERVER_RECV); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_max_size, USE_BUFFER_SIZE); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_rest_size, 18u); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer, recive_data_global.recive_buffer1); + + //メモリの内容をチェックする + cmp_ret = memcmp(recive_data_global.recive_buffer, "HTTP/1.1 200 OK\r\nCoo", 20); + BOOST_CHECK_EQUAL(cmp_ret, 0); + cmp_ret = memcmp(recive_data_global.recive_buffer + 20, response.c_array(), 52); + BOOST_CHECK_EQUAL(cmp_ret, 0); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 72u); + + cout << "[414]--------------------------------------------- " << endl; + // unit_test[414] データバッファ残サイズ < レスポンスデータサイズ + // unit_test[414] ●使用中データバッファがデータバッファ2の場合、データバッファMAXサイズ = 未送信データサイズ(20) + レスポンスデータサイズ。 + // unit_test[414] ●メモリの内容をチェックする + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 50; + recive_data_global.recive_buffer = recive_data_global.recive_buffer2; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_NG; + send_status_temp.send_offset = 20; + send_status_temp.unsend_size = 20; + recive_data_global.send_status_list.push_back(send_status_temp); + + //未送信データ + memcpy(recive_data_global.recive_buffer + 20, "HTTP/1.1 200 OK\r\nCoo", 20); + + //レスポンスデータ + memcpy(response.c_array(), "kie: monkey=1234567890123456789012345678901234567890123456789012345678", 70); + response_len = 70; + + ret = handle_sorryserver_recv(boost::this_thread::get_id(), sorry_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, SORRYSERVER_RECV); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_max_size, USE_BUFFER_SIZE); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer, recive_data_global.recive_buffer1); + + //メモリの内容をチェックする + cmp_ret = memcmp(recive_data_global.recive_buffer, "HTTP/1.1 200 OK\r\nCoo", 20); + BOOST_CHECK_EQUAL(cmp_ret, 0); + cmp_ret = memcmp(recive_data_global.recive_buffer + 20, response.c_array(), 70); + BOOST_CHECK_EQUAL(cmp_ret, 0); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 90u); + + cout << "[415]--------------------------------------------- " << endl; + // unit_test[415] データバッファ残サイズ > レスポンスデータサイズ + // unit_test[415] ●メモリの内容をチェックする + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 70; + recive_data_global.recive_buffer = recive_data_global.recive_buffer2; + recive_data_global.send_status_list.clear(); + + memcpy(response.c_array(), "HTTP/1.1 200 OK\r\nCookie: monkey=123456789012345678901234567890", 62); + response_len = 62; + + ret = handle_sorryserver_recv(boost::this_thread::get_id(), sorry_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, SORRYSERVER_RECV); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_max_size, USE_BUFFER_SIZE); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_rest_size, 8u); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer, recive_data_global.recive_buffer2); + + //メモリの内容をチェックする + cmp_ret = memcmp(recive_data_global.recive_buffer + 20, response.c_array(), 62); + BOOST_CHECK_EQUAL(cmp_ret, 0); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 20u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 62u); + + cout << "[416]--------------------------------------------- " << endl; + // unit_test[416] データバッファ残サイズ = レスポンスデータサイズ + // unit_test[416] ●メモリの内容をチェックする + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 70; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + memcpy(response.c_array(), "HTTP/1.1 200 OK\r\nCookie: monkey=12345678901234567890123456789012345678", 70); + response_len = 70; + + ret = handle_sorryserver_recv(boost::this_thread::get_id(), sorry_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, SORRYSERVER_RECV); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_max_size, USE_BUFFER_SIZE); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer, recive_data_global.recive_buffer1); + + //メモリの内容をチェックする + cmp_ret = memcmp(recive_data_global.recive_buffer + 20, response.c_array(), 70); + BOOST_CHECK_EQUAL(cmp_ret, 0); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 20u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 70u); + + // unit_test_part3 begin: + cout << "[417]--------------------------------------------- " << endl; + // unit_test[417] 送信状態リストの要素の送信状態が送信継続 + // unit_test[417] ●送信データ残サイズ < レスポンスデータ残サイズ + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 11; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_CONTINUE; + send_status_temp.send_offset = 40; + send_status_temp.send_end_size = 39; + send_status_temp.send_rest_size = 20; + recive_data_global.send_status_list.push_back(send_status_temp); + //未送信データを生成する + memcpy(recive_data_global.recive_buffer + 40, "HTTP/1.1 200 OK\r\nContent-Length: 20\r\n\r\n", 39); + + memcpy(response.c_array(), "12345678901234567890HTTP/1.1 200 OK\r\nContent-Lengt", REQUEST_BUFFER_SIZE); + response_len = REQUEST_BUFFER_SIZE; + + ret = handle_sorryserver_recv(boost::this_thread::get_id(), sorry_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_CONNECTION_CHECK); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 2u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 20u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_offset, 20u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->unsend_size, 30u); + + cout << "[418]--------------------------------------------- " << endl; + // unit_test[418] 送信状態リストの要素の送信状態が送信継続 + // unit_test[418] ●送信データ残サイズ = レスポンスデータ残サイズ + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 11; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_CONTINUE; + send_status_temp.send_offset = 40; + send_status_temp.send_end_size = 39; + send_status_temp.send_rest_size = 50; + recive_data_global.send_status_list.push_back(send_status_temp); + //未送信データを生成する + memcpy(recive_data_global.recive_buffer + 40, "HTTP/1.1 200 OK\r\nContent-Length: 50\r\n\r\n", 39); + + memcpy(response.c_array(), "12345678901234567890123456789012345678901234567890", REQUEST_BUFFER_SIZE); + response_len = REQUEST_BUFFER_SIZE; + + ret = handle_sorryserver_recv(boost::this_thread::get_id(), sorry_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_CONNECTION_CHECK); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 50u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + + cout << "[419]--------------------------------------------- " << endl; + // unit_test[419] 送信状態リストの要素の送信状態が送信継続 + // unit_test[419] ●送信データ残サイズ > レスポンスデータ残サイズ + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 11; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_CONTINUE; + send_status_temp.send_offset = 40; + send_status_temp.send_end_size = 39; + send_status_temp.send_rest_size = 80; + recive_data_global.send_status_list.push_back(send_status_temp); + // 未送信データを生成する + memcpy(recive_data_global.recive_buffer + 40, "HTTP/1.1 200 OK\r\nContent-Length: 80\r\n\r\n", 39); + + memcpy(response.c_array(), "12345678901234567890123456789012345678901234567890", REQUEST_BUFFER_SIZE); + response_len = REQUEST_BUFFER_SIZE; + + ret = handle_sorryserver_recv(boost::this_thread::get_id(), sorry_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_CONNECTION_CHECK); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 30u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 50u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + + cout << "[420]--------------------------------------------- " << endl; + // unit_test[420] 送信状態が送信不可の場合 + // unit_test[420] ●HTTPバージョンの妥当性をチェックして、異常の場合 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 0; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_NG; + send_status_temp.send_offset = 89; + send_status_temp.unsend_size = 1; + recive_data_global.send_status_list.push_back(send_status_temp); + //未送信データを生成する + recive_data_global.recive_buffer[89] = 'H'; + + memcpy(response.c_array(), "TTP/1.9 200 OK\r\n4567890123456789012345678901234567", REQUEST_BUFFER_SIZE); + response_len = REQUEST_BUFFER_SIZE; + + ret = handle_sorryserver_recv(boost::this_thread::get_id(), sorry_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_CONNECTION_CHECK); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 51u); + + cout << "[421]--------------------------------------------- " << endl; + // unit_test[421] 送信状態が送信不可の場合 + // unit_test[421] ●HTTPバージョンの妥当性をチェックして、チェック不可の場合 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 0; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_NG; + send_status_temp.send_offset = 89; + send_status_temp.unsend_size = 1; + recive_data_global.send_status_list.push_back(send_status_temp); + //未送信データを生成する + recive_data_global.recive_buffer[89] = 'H'; + + memcpy(response.c_array(), "OST / HTT", 10); + response_len = 10; + + ret = handle_sorryserver_recv(boost::this_thread::get_id(), sorry_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, SORRYSERVER_RECV); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 11u); + + cout << "[422]--------------------------------------------- " << endl; + // unit_test[422] 送信状態が送信不可の場合 + // unit_test[422] ●HTTPヘッダの妥当性をチェックして、不可の場合 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 0; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + send_status_temp.status = SEND_NG; + send_status_temp.send_offset = 89; + send_status_temp.unsend_size = 1; + recive_data_global.send_status_list.push_back(send_status_temp); + //未送信データを生成する + recive_data_global.recive_buffer[89] = 'H'; + + memcpy(response.c_array(), "TTP/1.0 200 OK\r\nCookie: monkey=1111111111111111111", REQUEST_BUFFER_SIZE); + response_len = REQUEST_BUFFER_SIZE; + + ret = handle_sorryserver_recv(boost::this_thread::get_id(), sorry_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, SORRYSERVER_RECV); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 51u); + + cout << "[423]--------------------------------------------- " << endl; + // unit_test[423] 送信状態が送信不可の場合 + // unit_test[423] ●HTTPヘッダ(ContentLength)があり + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 0; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + send_status_temp.status = SEND_NG; + send_status_temp.send_offset = 89; + send_status_temp.unsend_size = 1; + recive_data_global.send_status_list.push_back(send_status_temp); + //未送信データを生成する + recive_data_global.recive_buffer[89] = 'H'; + + memcpy(response.c_array(), "TTP/1.0 200 OK\r\nContent-Length: 15\r\n\r\n123456789012", REQUEST_BUFFER_SIZE); + response_len = REQUEST_BUFFER_SIZE; + + ret = handle_sorryserver_recv(boost::this_thread::get_id(), sorry_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_CONNECTION_CHECK); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 3u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 51u); + + cout << "[424]--------------------------------------------- " << endl; + // unit_test[424] 送信状態が送信不可の場合 + // unit_test[424] ●HTTPヘッダ(ContentLength)なし + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 0; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + send_status_temp.status = SEND_NG; + send_status_temp.send_offset = 89; + send_status_temp.unsend_size = 1; + recive_data_global.send_status_list.push_back(send_status_temp); + //未送信データを生成する + recive_data_global.recive_buffer[89] = 'H'; + + memcpy(response.c_array(), "TTP/1.0 200 OK\r\nCookie: monkey=111111111111111\r\n\r\n", REQUEST_BUFFER_SIZE); + response_len = REQUEST_BUFFER_SIZE; + + ret = handle_sorryserver_recv(boost::this_thread::get_id(), sorry_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_CONNECTION_CHECK); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 51u); + + cout << "[425]--------------------------------------------- " << endl; + // unit_test[425] 送信状態が送信不可の場合 + // unit_test[425] ●送信データ残サイズ > 未送信データサイズ + レスポンスデータ残サイズ + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 70; + recive_data_global.recive_buffer = recive_data_global.recive_buffer2; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_NG; + send_status_temp.send_offset = 0; + send_status_temp.unsend_size = 20; + recive_data_global.send_status_list.push_back(send_status_temp); + + //未送信データ + memcpy(recive_data_global.recive_buffer, "HTTP/1.0 200 OK\r\nCoo", 20); + + //レスポンスデータ + memcpy(response.c_array(), "kie: monkey=123456789012345678901\r\n\r\nGET", 40); + response_len = 40; + + ret = handle_sorryserver_recv(boost::this_thread::get_id(), sorry_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_CONNECTION_CHECK); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_max_size, USE_BUFFER_SIZE); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_rest_size, 30u); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 2u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 57u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_offset, 57u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->unsend_size, 3u); + + cout << "[426]--------------------------------------------- " << endl; + // unit_test[426] 送信状態が送信不可の場合 + // unit_test[426] ●送信データ残サイズ < 未送信データサイズ + レスポンスデータ残サイズ + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 70; + recive_data_global.recive_buffer = recive_data_global.recive_buffer2; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_NG; + send_status_temp.send_offset = 0; + send_status_temp.unsend_size = 20; + recive_data_global.send_status_list.push_back(send_status_temp); + + //未送信データ + memcpy(recive_data_global.recive_buffer, "HTTP/1.0 200 OK\r\nCoo", 20); + + //レスポンスデータ + memcpy(response.c_array(), "kie: monkey=123\r\nContent-Length: 100\r\n\r\n0123456789", 50); + response_len = 50; + + ret = handle_sorryserver_recv(boost::this_thread::get_id(), sorry_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_CONNECTION_CHECK); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_max_size, USE_BUFFER_SIZE); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_rest_size, 20u); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 90u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 70u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 0u); + + cout << "[427]--------------------------------------------- " << endl; + // unit_test[427] 送信状態が送信不可の場合 + // unit_test[427] ●送信データ残サイズ = 未送信データサイズ + レスポンスデータ残サイズ + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 70; + recive_data_global.recive_buffer = recive_data_global.recive_buffer2; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_NG; + send_status_temp.send_offset = 0; + send_status_temp.unsend_size = 20; + recive_data_global.send_status_list.push_back(send_status_temp); + + //未送信データ + memcpy(recive_data_global.recive_buffer, "HTTP/1.0 200 OK\r\nCoo", 20); + + //レスポンスデータ + memcpy(response.c_array(), "kie: monkey=123\r\nContent-Length: 11\r\n\r\n01234567890", 50); + response_len = 50; + + ret = handle_sorryserver_recv(boost::this_thread::get_id(), sorry_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_CONNECTION_CHECK); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_max_size, USE_BUFFER_SIZE); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_rest_size, 20u); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 70u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 0u); + + cout << "[428]--------------------------------------------- " << endl; + // unit_test[428] レスポンスデータ残サイズ < 0 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 70; + recive_data_global.recive_buffer = recive_data_global.recive_buffer2; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_NG; + send_status_temp.send_offset = 0; + send_status_temp.unsend_size = 20; + recive_data_global.send_status_list.push_back(send_status_temp); + + //未送信データ + memcpy(recive_data_global.recive_buffer, "HTTP/1.0 200 OK\r\nCoo", 20); + + //レスポンスデータ + memcpy(response.c_array(), "kie: monkey=123456789012345678901\r\n\r\nGET", 40); + response_len = 40; + + ret = handle_sorryserver_recv(boost::this_thread::get_id(), sorry_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_CONNECTION_CHECK); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_max_size, USE_BUFFER_SIZE); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_rest_size, 30u); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 2u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 57u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 0u); + + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_offset, 57u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->unsend_size, 3u); + + cout << "[429]--------------------------------------------- " << endl; + // unit_test[429] レスポンスデータ残サイズ = 0 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 70; + recive_data_global.recive_buffer = recive_data_global.recive_buffer2; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_NG; + send_status_temp.send_offset = 0; + send_status_temp.unsend_size = 20; + recive_data_global.send_status_list.push_back(send_status_temp); + + //未送信データ + memcpy(recive_data_global.recive_buffer, "HTTP/1.0 200 OK\r\nCoo", 20); + + //レスポンスデータ + memcpy(response.c_array(), "kie: monkey=123\r\nContent-Length: 11\r\n\r\n01234567890", 50); + response_len = 50; + + ret = handle_sorryserver_recv(boost::this_thread::get_id(), sorry_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_CONNECTION_CHECK); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_max_size, USE_BUFFER_SIZE); + BOOST_CHECK_EQUAL(recive_data_global.recive_buffer_rest_size, 20u); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 70u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 0u); + + // unit_test_part4 begin: + cout << "[430]--------------------------------------------- " << endl; + // unit_test[430] レスポンスデータ残サイズ > 0 + // unit_test[430] ●HTTPバージョンの妥当性をチェックして、不可の場合 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = USE_BUFFER_SIZE; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + memcpy(response.c_array(), "HTTP/1.0 200 OK\r\nContent-Length: 10\r\n\r\n1234567890G", REQUEST_BUFFER_SIZE); + response_len = REQUEST_BUFFER_SIZE; + + ret = handle_sorryserver_recv(boost::this_thread::get_id(), sorry_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_CONNECTION_CHECK); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 2u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 49u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 0u); + + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_offset, 49u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->unsend_size, 1u); + + cout << "[431]--------------------------------------------- " << endl; + // unit_test[431] レスポンスデータ残サイズ > 0 + // unit_test[431] ●HTTPバージョンの妥当性をチェックして、異常の場合 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + memcpy(response.c_array(), "HTTP/2.2 200 OK\r\n567890123456789012345678901234567", REQUEST_BUFFER_SIZE); + response_len = REQUEST_BUFFER_SIZE; + + ret = handle_sorryserver_recv(boost::this_thread::get_id(), sorry_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_CONNECTION_CHECK); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 50u); + + cout << "[432]--------------------------------------------- " << endl; + // unit_test[432] レスポンスデータ残サイズ > 0 + // unit_test[432] ●HTTPヘッダの妥当性をチェックして、不可の場合 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + memcpy(response.c_array(), "HTTP/1.0 200 OK\r\nCookie: monkey=111111111111111111", REQUEST_BUFFER_SIZE); + response_len = REQUEST_BUFFER_SIZE; + + ret = handle_sorryserver_recv(boost::this_thread::get_id(), sorry_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, SORRYSERVER_RECV); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 50u); + + cout << "[433]--------------------------------------------- " << endl; + // unit_test[433] レスポンスデータ残サイズ > 0 + // unit_test[433] ●HTTPヘッダ(ContentLength)があり + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + memcpy(response.c_array(), "HTTP/1.0 200 OK\r\nContent-Length: 15\r\n\r\n12345678901", REQUEST_BUFFER_SIZE); + response_len = REQUEST_BUFFER_SIZE; + + ret = handle_sorryserver_recv(boost::this_thread::get_id(), sorry_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_CONNECTION_CHECK); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 4u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 50u); + + cout << "[434]--------------------------------------------- " << endl; + // unit_test[434] レスポンスデータ残サイズ > 0 + // unit_test[434] ●HTTPヘッダ(ContentLength)なし + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 0; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + memcpy(response.c_array(), "HTTP/1.0 200 OK\r\nCookie: monkey=11111111111111\r\n\r\n", REQUEST_BUFFER_SIZE); + response_len = REQUEST_BUFFER_SIZE; + + ret = handle_sorryserver_recv(boost::this_thread::get_id(), sorry_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_CONNECTION_CHECK); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 50u); + + cout << "[435]--------------------------------------------- " << endl; + // unit_test[435] レスポンスデータ残サイズ > 0 + // unit_test[435] ●送信データ残サイズ = レスポンスデータ残サイズ + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 0; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + memcpy(response.c_array(), "HTTP/1.0 200 OK\r\nCookie: monkey=11111111111111\r\n\r\n", REQUEST_BUFFER_SIZE); + response_len = REQUEST_BUFFER_SIZE; + + ret = handle_sorryserver_recv(boost::this_thread::get_id(), sorry_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_CONNECTION_CHECK); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 50u); + + cout << "[436]--------------------------------------------- " << endl; + // unit_test[436] レスポンスデータ残サイズ > 0 + // unit_test[436] ●送信データ残サイズ < レスポンスデータ残サイズ + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 0; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + memcpy(response.c_array(), "HTTP/1.0 200 OK\r\nContent-Length: 0\r\n\r\nHTTP/1.0 200", REQUEST_BUFFER_SIZE); + response_len = REQUEST_BUFFER_SIZE; + + ret = handle_sorryserver_recv(boost::this_thread::get_id(), sorry_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_CONNECTION_CHECK); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 2u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 38u); + + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_offset, 38u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->unsend_size, 12u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_possible_size, 0u); + + cout << "[437]--------------------------------------------- " << endl; + // unit_test[437] レスポンスデータ残サイズ > 0 + // unit_test[437] ●送信データ残サイズ > レスポンスデータ残サイズ + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + memcpy(response.c_array(), "HTTP/1.0 200 OK\r\nContent-Length: 20\r\n\r\n12345678901", REQUEST_BUFFER_SIZE); + response_len = REQUEST_BUFFER_SIZE; + + ret = handle_sorryserver_recv(boost::this_thread::get_id(), sorry_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_CONNECTION_CHECK); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 9u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, REQUEST_BUFFER_SIZE); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + + cout << "[438]--------------------------------------------- " << endl; + // unit_test[438] レスポンスデータ残サイズ > 0 + // unit_test[438] ●出力の送信状態リスト: 1:送信待 2:送信待 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 76; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_NG; + send_status_temp.send_offset = 0; + send_status_temp.send_end_size = 0; + send_status_temp.unsend_size = 14; + recive_data_global.send_status_list.push_back(send_status_temp); + + //未送信データ + memcpy(recive_data_global.recive_buffer, "HTTP/1.0 200 O", 14); + + memcpy(response.c_array(), "K\r\nCookie: m=1\r\n\r\nHTTP/1.0 200 OK\r\nCookie: m=1\r\n\r\n", 50); + response_len = 50; + + ret = handle_sorryserver_recv(boost::this_thread::get_id(), sorry_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_CONNECTION_CHECK); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 2u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 32u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + + BOOST_CHECK_EQUAL((recive_data_global.send_status_list.rbegin())->status, SEND_OK); + BOOST_CHECK_EQUAL((recive_data_global.send_status_list.rbegin())->send_rest_size, 0u); + BOOST_CHECK_EQUAL((recive_data_global.send_status_list.rbegin())->send_possible_size, 32u); + BOOST_CHECK_EQUAL((recive_data_global.send_status_list.rbegin())->send_offset, 32u); + + cout << "[439]--------------------------------------------- " << endl; + // unit_test[439] レスポンスデータ残サイズ > 0 + // unit_test[439] ●出力の送信状態リスト: 1:送信待 2:送信不可 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = USE_BUFFER_SIZE; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + memcpy(response.c_array(), "HTTP/1.0 200 OK\r\nContent-Length: 10\r\n\r\n1234567890G", REQUEST_BUFFER_SIZE); + response_len = REQUEST_BUFFER_SIZE; + + ret = handle_sorryserver_recv(boost::this_thread::get_id(), sorry_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_CONNECTION_CHECK); + + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 2u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 49u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 0u); + + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->unsend_size, 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.rbegin()->send_offset, 49u); + + cout << "[440]--------------------------------------------- " << endl; + // unit_test[440] レスポンスデータ残サイズ > 0 + // unit_test[440] ●出力の送信状態リスト: 1:送信待 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + memcpy(response.c_array(), "HTTP/1.0 200 OK\r\nContent-Length: 15\r\n\r\n12345678901", REQUEST_BUFFER_SIZE); + response_len = REQUEST_BUFFER_SIZE; + + ret = handle_sorryserver_recv(boost::this_thread::get_id(), sorry_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_CONNECTION_CHECK); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 4u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 50u); + + cout << "[441]--------------------------------------------- " << endl; + // unit_test[441] レスポンスデータ残サイズ > 0 + // unit_test[441] ●出力の送信状態リスト: 1:送信不可 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = USE_BUFFER_SIZE; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + memcpy(response.c_array(), "HTTP/1.0 200 OK\r\n456789012345678901234567890123456", REQUEST_BUFFER_SIZE); + response_len = REQUEST_BUFFER_SIZE; + + ret = handle_sorryserver_recv(boost::this_thread::get_id(), sorry_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, SORRYSERVER_RECV); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 50u); + + cout << "[442]--------------------------------------------- " << endl; + // unit_test[442] 送信可能データがあり + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = USE_BUFFER_SIZE; + delete[] recive_data_global.recive_buffer1; + delete[] recive_data_global.recive_buffer2; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + memcpy(response.c_array(), "HTTP/1.0 200 OK\r\nHOST: KKK\r\n\r\nHTTP/1.0 200 OK\r\nHOS", REQUEST_BUFFER_SIZE); + response_len = REQUEST_BUFFER_SIZE; + + ret = handle_sorryserver_recv(boost::this_thread::get_id(), sorry_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, CLIENT_CONNECTION_CHECK); + + cout << "[443]--------------------------------------------- " << endl; + // unit_test[443] 送信可能データなし + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + memcpy(response.c_array(), "HTTP/1.0 200 OK\r\nCookie: monkey=111111111111111111", REQUEST_BUFFER_SIZE); + response_len = REQUEST_BUFFER_SIZE; + + ret = handle_sorryserver_recv(boost::this_thread::get_id(), sorry_endpoint, response, response_len); + + BOOST_CHECK_EQUAL(ret, SORRYSERVER_RECV); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 1u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_NG); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->unsend_size, 50u); +} + +//handle_sorryserver_recv_test_thread +void handle_sorryserver_recv_test_thread(){ + EVENT_TAG ret; + boost::array response; + send_status send_status_temp; + recive_data recive_data_tmp; + boost::thread down_thread(&down_thread_func); + boost::asio::ip::tcp::endpoint sorry_endpoint = string_to_endpoint("10.10.10.1:8080"); + thread_data_ptr psession_thread_data(new session_thread_data_sessionless); + init_session_thread_data_sessionless(psession_thread_data, down_thread.get_id()); + psession_thread_data->target_endpoint = sorry_endpoint; + + { + boost::mutex::scoped_lock sclock(this->session_thread_data_map_mutex); + this->session_thread_data_map[boost::this_thread::get_id()] = psession_thread_data; + this->forwarded_for = 1; + } + + init_recive_data(recive_data_tmp); + + psession_thread_data->recive_data_map[sorry_endpoint] = recive_data_tmp; + std::map::iterator it = + psession_thread_data->recive_data_map.find(sorry_endpoint); + recive_data& recive_data_global = it->second; + + cout << "[444]--------------------------------------------- " << endl; + // unit_test[444] レスポンスデータ残サイズ > 0 + // unit_test[444] ●出力の送信状態リスト: 1:送信待 2:送信不可 + recive_data_global.recive_buffer_max_size = USE_BUFFER_SIZE; + recive_data_global.recive_buffer_rest_size = 76; + recive_data_global.recive_buffer1 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer2 = new char[recive_data_global.recive_buffer_max_size]; + recive_data_global.recive_buffer = recive_data_global.recive_buffer1; + recive_data_global.send_status_list.clear(); + + init_send_status(send_status_temp); + send_status_temp.status = SEND_NG; + send_status_temp.send_offset = 0; + send_status_temp.send_end_size = 0; + send_status_temp.unsend_size = 14; + recive_data_global.send_status_list.push_back(send_status_temp); + + //未送信データ + memcpy(recive_data_global.recive_buffer, "HTTP/1.0 200 O", 14); + + memcpy(response.c_array(), "K\r\nCookie: m=1\r\n\r\nHTTP/1.0 200 OK\r\nCookie: m=1\r\n\r", 49); + size_t response_len = 49; + + ret = handle_sorryserver_recv(boost::this_thread::get_id(), sorry_endpoint, response, response_len); + + { + boost::mutex::scoped_lock sclock(check_mutex); + BOOST_CHECK_EQUAL(ret, CLIENT_CONNECTION_CHECK); + BOOST_REQUIRE_EQUAL(recive_data_global.send_status_list.size(), 2u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->status, SEND_OK); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_rest_size, 0u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_possible_size, 32u); + BOOST_CHECK_EQUAL(recive_data_global.send_status_list.begin()->send_offset, 0u); + + BOOST_CHECK_EQUAL((recive_data_global.send_status_list.rbegin())->status, SEND_NG); + BOOST_CHECK_EQUAL((recive_data_global.send_status_list.rbegin())->send_rest_size, 0u); + BOOST_CHECK_EQUAL((recive_data_global.send_status_list.rbegin())->unsend_size, 31u); + BOOST_CHECK_EQUAL((recive_data_global.send_status_list.rbegin())->send_offset, 32u); + } +} + +//handle_response_send_inform 馮家純 +void handle_response_send_inform_test(){ + + cout << "[445]--------------------------------------------- " << endl; + //unit_test[445] handle_response_send_inform 戻り値が「STOP」に設定する。 + EVENT_TAG ret = this->handle_response_send_inform(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(ret, STOP); +} + +//handle_client_connection_check 馮家純 +void handle_client_connection_check_test(){ + EVENT_TAG ret; + cout << "[446]--------------------------------------------- " << endl; + //unit_test[446] 異常系 session_thread_data_map中にThreadID対応のデータがない + this->session_thread_data_map.clear(); + this->session_thread_data_map[boost::this_thread::get_id()].reset(); + boost::array sbf_err1; + std::size_t d_err1; + ret = this->handle_client_connection_check(boost::this_thread::get_id(), sbf_err1, d_err1); + + //遷移先ステータスを設定する status = FINALIZE + BOOST_CHECK_EQUAL(ret, FINALIZE); + + cout << "[447]--------------------------------------------- " << endl; + //unit_test[447] 異常系 session_thread_data_map中にThreadIDなし場合のテスト + this->session_thread_data_map.clear(); + + ret = this->handle_client_connection_check(boost::this_thread::get_id(), sbf_err1, d_err1); + + //遷移先ステータスを設定する status = FINALIZE + BOOST_CHECK_EQUAL(ret, FINALIZE); + + cout << "[448]--------------------------------------------- " << endl; + //unit_test[448] 送信バッファサイズ > 送信可能データサイズ + boost::array sbf1; + std::size_t d1; + boost::asio::ip::tcp::endpoint ep1; + + //session_thread_data_sessionless + thread_data_ptr data1(new session_thread_data_sessionless); + this->session_thread_data_map[boost::this_thread::get_id()] = data1; + //send_status + send_status sd1; + sd1.status = SEND_OK; + sd1.send_possible_size = 2u; + sd1.send_offset = 1u; + //recive_data + recive_data rd1; + rd1.recive_buffer = "abcd"; + //send_status->recive_data + rd1.send_status_list.push_back(sd1); + //recive_data->session_thread_data_sessionless + data1->recive_data_map[ep1] = rd1; + + ret = this->handle_client_connection_check(boost::this_thread::get_id(), sbf1, d1); + + std::string chk1 = "bc"; + //送信可能データを先頭から送信可能データサイズ分、送信バッファにコピーする + BOOST_CHECK_EQUAL(memcmp(sbf1.data(), chk1.c_str(), 2u), 0); + //送信済データサイズに送信可能データサイズを設定する + BOOST_CHECK_EQUAL(data1->recive_data_map[ep1].send_status_list.rbegin()->send_end_size, 2u); + //送信可能データサイズに0を設定する + BOOST_CHECK_EQUAL(data1->recive_data_map[ep1].send_status_list.rbegin()->send_possible_size, 0u); + //遷移先ステータスを設定する status = CLIENT_SEND + BOOST_CHECK_EQUAL(ret, CLIENT_SEND); + + cout << "[449]--------------------------------------------- " << endl; + //unit_test[449] 送信バッファサイズ < 送信可能データサイズ + this->session_thread_data_map.clear(); + + boost::array sbf2; + std::size_t d2; + boost::asio::ip::tcp::endpoint ep2; + + //session_thread_data_sessionless + thread_data_ptr data2(new session_thread_data_sessionless); + this->session_thread_data_map[boost::this_thread::get_id()] = data2; + //send_status + send_status sd2; + sd2.status = SEND_OK; + sd2.send_possible_size = sbf2.max_size() + 1u; + sd2.send_offset = 1u; + //recive_data + recive_data rd2; + rd2.recive_buffer = "abcdefg"; + //send_status->recive_data + rd2.send_status_list.push_back(sd2); + //recive_data->session_thread_data_sessionless + data2->recive_data_map[ep2] = rd2; + + ret = this->handle_client_connection_check(boost::this_thread::get_id(), sbf2, d2); + + std::string chk2 = "bcdefg"; + //送信可能データを先頭から送信バッファサイズ分、送信バッファにコピーする + BOOST_CHECK_EQUAL(memcmp(sbf2.data(), chk2.c_str(), 6u), 0); + + std::size_t sbfsize = sbf2.max_size(); + //送信済データサイズに送信バッファサイズを設定する + BOOST_CHECK_EQUAL(data2->recive_data_map[ep2].send_status_list.rbegin()->send_end_size, sbfsize); + //送信可能データサイズから送信バッファサイズを減算する + BOOST_CHECK_EQUAL(data2->recive_data_map[ep2].send_status_list.rbegin()->send_possible_size, 1u); + //遷移先ステータスを設定する status = CLIENT_SEND + BOOST_CHECK_EQUAL(ret, CLIENT_SEND); + + cout << "[450]--------------------------------------------- " << endl; + //unit_test[450] 送信バッファサイズ = 送信可能データサイズ + this->session_thread_data_map.clear(); + + boost::array sbf3; + std::size_t d3; + boost::asio::ip::tcp::endpoint ep3; + + //session_thread_data_sessionless + thread_data_ptr data3(new session_thread_data_sessionless); + this->session_thread_data_map[boost::this_thread::get_id()] = data3; + //send_status + send_status sd3; + sd3.status = SEND_OK; + sd3.send_possible_size = sbf3.max_size(); + sd3.send_offset = 2u; + //recive_data + recive_data rd3; + const std::size_t sbf_size = sbf3.max_size(); + rd3.recive_buffer = (char*)malloc(sbf_size); + memset(rd3.recive_buffer, 'a', sbf_size); + //send_status->recive_data + rd3.send_status_list.push_back(sd3); + //recive_data->session_thread_data_sessionless + data3->recive_data_map[ep3] = rd3; + + ret = this->handle_client_connection_check(boost::this_thread::get_id(), sbf3, d3); + + char *chk3; + chk3 = (char*)malloc(sbf_size - 2); + memset(chk3, 'a', sbf_size - 2); + //送信可能データを先頭から送信可能データサイズ分、送信バッファにコピーする + BOOST_CHECK_EQUAL(memcmp(sbf3.data(), chk3, sbf_size - 2), 0); + //送信済データサイズに送信可能データサイズを設定する + BOOST_CHECK_EQUAL(data3->recive_data_map[ep3].send_status_list.rbegin()->send_end_size, sbf_size); + //送信可能データサイズに0を設定する + BOOST_CHECK_EQUAL(data3->recive_data_map[ep3].send_status_list.rbegin()->send_possible_size, 0u); + //遷移先ステータスを設定する status = CLIENT_SEND + BOOST_CHECK_EQUAL(ret, CLIENT_SEND); + +} + +void handle_client_connection_check_test_thread(){ + EVENT_TAG ret; + cout << "[451]--------------------------------------------- " << endl; + //unit_test[451] 送信バッファサイズ > 送信可能データサイズ + boost::array sbf1; + std::size_t d1; + boost::asio::ip::tcp::endpoint ep1; + + //session_thread_data_sessionless + thread_data_ptr data1(new session_thread_data_sessionless); + + //send_status + send_status sd1; + sd1.status = SEND_OK; + sd1.send_possible_size = 2u; + sd1.send_offset = 1u; + //recive_data + recive_data rd1; + rd1.recive_buffer = "abcd"; + //send_status->recive_data + rd1.send_status_list.push_back(sd1); + //recive_data->session_thread_data_sessionless + data1->recive_data_map[ep1] = rd1; + + { + boost::mutex::scoped_lock sclock(this->session_thread_data_map_mutex); + this->session_thread_data_map[boost::this_thread::get_id()] = data1; + } + + ret = this->handle_client_connection_check(boost::this_thread::get_id(), sbf1, d1); + + std::string chk1 = "bc"; + { + boost::mutex::scoped_lock sclock(check_mutex); + //送信可能データを先頭から送信可能データサイズ分、送信バッファにコピーする + BOOST_CHECK_EQUAL(memcmp(sbf1.data(), chk1.c_str(), 2u), 0); + //送信済データサイズに送信可能データサイズを設定する + BOOST_CHECK_EQUAL(data1->recive_data_map[ep1].send_status_list.rbegin()->send_end_size, 2u); + //送信可能データサイズに0を設定する + BOOST_CHECK_EQUAL(data1->recive_data_map[ep1].send_status_list.rbegin()->send_possible_size, 0u); + //遷移先ステータスを設定する status = CLIENT_SEND + BOOST_CHECK_EQUAL(ret, CLIENT_SEND); + } +} + +//handle_client_select 馮家純 +void handle_client_select_test(){ + + cout << "[452]--------------------------------------------- " << endl; + //unit_test[452] handle_client_select 戻り値が「STOP」に設定する。 + boost::asio::ip::udp::endpoint ep; + boost::array sbf; + std::size_t d; + EVENT_TAG ret = this->handle_client_select(boost::this_thread::get_id(), ep, sbf, d); + + BOOST_CHECK_EQUAL(ret, STOP); +} + +//handle_client_send 郎希倹 +void handle_client_send_test(){ + boost::asio::ip::tcp::endpoint endpoint = string_to_endpoint ("10.10.100.100:8800"); + send_status client_send_status, client_send_status1; + recive_data client_recive_data; + thread_data_ptr data_pro(new session_thread_data_sessionless) ; + + cout << "[453]--------------------------------------------- " << endl; + //unit_test[453] session_thread_data_map中にthread_id無し + EVENT_TAG event_status = this->handle_client_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(event_status, FINALIZE); + + cout << "[454]--------------------------------------------- " << endl; + //unit_test[454] session_thread_data_map中にsession_thread_data_sessionless無し + thread_data_ptr thread_data1 ; + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data1; + event_status = this->handle_client_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(event_status, FINALIZE); + + cout << "[455]--------------------------------------------- " << endl; + //unit_test[455] recive_data_map中にendpoint無し + this->session_thread_data_map.clear(); + this->session_thread_data_map[boost::this_thread::get_id()] = data_pro; + event_status = this->handle_client_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(event_status, FINALIZE); + + cout << "[456]--------------------------------------------- " << endl; + //unit_test[456] send_status_list中にsend_status無し + client_recive_data.send_status_list.clear(); + data_pro->recive_data_map[endpoint] = client_recive_data; + this->session_thread_data_map.clear(); + this->session_thread_data_map[boost::this_thread::get_id()] = data_pro; + + event_status = this->handle_client_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(event_status, FINALIZE); + + cout << "[457]--------------------------------------------- " << endl; + //unit_test[457] 送信状態->SEND_OK/送信可能データサイズ > 0/送信可能データあり + //unit_test[457] test data: 送信状態に送信待を設定,送信データオフセットに送信済データサイズを加算する,送信済データサイズに0を設定する,遷移先ステータスを設定する + client_send_status.send_possible_size = 1u;//送信可能データサイズ > 0 + client_send_status.edit_data_list.clear();//編集データリスト=0 + client_send_status.status = SEND_OK; //送信状態->SEND_OK + client_send_status.send_offset = 0u; + client_send_status.send_end_size = 1u; + client_recive_data.send_status_list.push_back(client_send_status); + + data_pro->target_endpoint = endpoint; + data_pro->recive_data_map.clear(); + data_pro->recive_data_map.insert(std::pair(endpoint,client_recive_data)); + + this->session_thread_data_map.clear(); + this->session_thread_data_map[boost::this_thread::get_id()] = data_pro; + event_status = this->handle_client_send(boost::this_thread::get_id()); + SEND_STATUS_TAG send_status = data_pro->recive_data_map[endpoint].send_status_list.front().status; + size_t offset = data_pro->recive_data_map[endpoint].send_status_list.front().send_offset; + size_t end_size = data_pro->recive_data_map[endpoint].send_status_list.front().send_end_size; + + BOOST_CHECK_EQUAL(event_status, CLIENT_CONNECTION_CHECK); //遷移先ステータスを設定する + BOOST_CHECK_EQUAL(send_status, SEND_OK); //送信状態に送信待を設定する + BOOST_CHECK_EQUAL(offset,1u); //送信データオフセットに送信済データサイズを加算する + BOOST_CHECK_EQUAL(end_size,0u); //送信済データサイズに0を設定する + + cout << "[458]--------------------------------------------- " << endl; + //unit_test[458] 送信状態->SEND_NG + //unit_test[458] test data:遷移先ステータスを設定する + client_send_status.status = SEND_NG; //送信状態->SEND_NG + client_recive_data.send_status_list.clear(); + client_recive_data.send_status_list.push_back(client_send_status); + + data_pro->target_endpoint = endpoint; + data_pro->recive_data_map.clear(); + data_pro->recive_data_map.insert(std::pair(endpoint,client_recive_data)); + + this->session_thread_data_map.clear(); + this->session_thread_data_map[boost::this_thread::get_id()] = data_pro; + event_status = this->handle_client_send(boost::this_thread::get_id()); + + BOOST_CHECK_EQUAL(event_status, FINALIZE); //遷移先ステータスを設定する + + cout << "[459]--------------------------------------------- " << endl; + //unit_test[459] 送信状態->SEND_CONTINUE + //unit_test[459] test data:遷移先ステータスを設定する + client_send_status.status = SEND_CONTINUE; //送信状態->SEND_CONTINUE + client_recive_data.send_status_list.clear(); + client_recive_data.send_status_list.push_back(client_send_status); + + data_pro->target_endpoint = endpoint; + data_pro->recive_data_map.clear(); + data_pro->recive_data_map.insert(std::pair(endpoint,client_recive_data)); + + this->session_thread_data_map.clear(); + this->session_thread_data_map[boost::this_thread::get_id()] = data_pro; + event_status = this->handle_client_send(boost::this_thread::get_id()); + + BOOST_CHECK_EQUAL(event_status, FINALIZE); //遷移先ステータスを設定する + + cout << "[460]--------------------------------------------- " << endl; + //unit_test[460] 送信状態->SEND_OK/送信可能データサイズ = 0/送信データ残サイズ > 0/送信可能データなし/終了フラグがONの場合 + //unit_test[460] test data: 送信状態に送信待を設定 + client_send_status.send_possible_size = 0u;//送信可能データサイズ=0 + client_send_status.send_rest_size = 1u;//送信データ残サイズ > 0 + client_send_status.status = SEND_OK; //送信状態->SEND_OK + client_recive_data.send_status_list.clear(); + client_recive_data.send_status_list.push_back(client_send_status); + + data_pro->target_endpoint = endpoint; + data_pro->recive_data_map.clear(); + data_pro->recive_data_map.insert(std::pair(endpoint,client_recive_data)); + data_pro->end_flag = END_FLAG_ON;//終了フラグがON + + this->session_thread_data_map.clear(); + this->session_thread_data_map[boost::this_thread::get_id()] = data_pro; + event_status = this->handle_client_send(boost::this_thread::get_id()); + send_status = data_pro->recive_data_map[endpoint].send_status_list.front().status; + + BOOST_CHECK_EQUAL(event_status, CLIENT_DISCONNECT); //遷移先ステータスを設定する + BOOST_CHECK_EQUAL(send_status, SEND_CONTINUE); //送信状態に送信待を設定する + + cout << "[461]--------------------------------------------- " << endl; + //unit_test[461] 送信状態->SEND_OK/送信可能データサイズ = 0/送信データ残サイズ > 0/送信可能データなし/終了フラグがOFFの場合/sorry状態の場合 + //unit_test[461] test data: 送信状態に送信待を設定 + client_send_status.send_possible_size = 0u;//送信可能データサイズ=0 + client_send_status.send_rest_size = 1u;//送信データ残サイズ > 0 + client_send_status.status = SEND_OK;//送信状態->SEND_OK + client_recive_data.send_status_list.clear(); + client_recive_data.send_status_list.push_back(client_send_status); + + data_pro->target_endpoint = endpoint; + data_pro->recive_data_map.clear(); + data_pro->recive_data_map.insert(std::pair(endpoint,client_recive_data)); + data_pro->end_flag = END_FLAG_OFF;//終了フラグがOFF + data_pro->sorry_flag = SORRY_FLAG_ON;//sorry状態の場合 + + this->session_thread_data_map.clear(); + this->session_thread_data_map[boost::this_thread::get_id()] = data_pro; + event_status = this->handle_client_send(boost::this_thread::get_id()); + send_status = data_pro->recive_data_map[endpoint].send_status_list.front().status; + + BOOST_CHECK_EQUAL(event_status, SORRYSERVER_RECV); //遷移先ステータスを設定する + BOOST_CHECK_EQUAL(send_status, SEND_CONTINUE); //送信状態に送信待を設定する + + cout << "[462]--------------------------------------------- " << endl; + //unit_test[462] 送信状態->SEND_OK/送信可能データサイズ = 0/送信データ残サイズ > 0/送信可能データなし/終了フラグがOFFの場合/sorry状態以外の場合 + //unit_test[462] test data: 送信状態に送信待を設定 + client_send_status.send_possible_size = 0u;//送信可能データサイズ=0 + client_send_status.send_rest_size = 1u;//送信データ残サイズ > 0 + client_send_status.status = SEND_OK; //送信状態->SEND_OK + client_recive_data.send_status_list.clear(); + client_recive_data.send_status_list.push_back(client_send_status); + + data_pro->target_endpoint = endpoint; + data_pro->recive_data_map.clear(); + data_pro->recive_data_map.insert(std::pair(endpoint,client_recive_data)); + data_pro->end_flag = END_FLAG_OFF;//終了フラグがOFF + data_pro->sorry_flag = SORRY_FLAG_OFF;//sorry状態以外の場合 + + this->session_thread_data_map.clear(); + this->session_thread_data_map[boost::this_thread::get_id()] = data_pro; + event_status = this->handle_client_send(boost::this_thread::get_id()); + send_status = data_pro->recive_data_map[endpoint].send_status_list.front().status; + + BOOST_CHECK_EQUAL(event_status, REALSERVER_RECV); //遷移先ステータスを設定する + BOOST_CHECK_EQUAL(send_status, SEND_CONTINUE); //送信状態に送信待を設定する + + cout << "[463]--------------------------------------------- " << endl; + //unit_test[463] 送信状態->SEND_OK/送信可能データサイズ = 0/送信データ残サイズ = 0/送信可能データなし/終了フラグがONの場合 + //unit_test[463] test data: 送信状態に送信待を設定 + client_send_status.send_possible_size = 0u;//送信可能データサイズ=0 + client_send_status.send_rest_size = 0u;//送信データ残サイズ = 0 + client_send_status.status = SEND_OK;//送信状態->SEND_OK + client_recive_data.send_status_list.clear(); + client_recive_data.send_status_list.push_back(client_send_status); + + data_pro->target_endpoint = endpoint; + data_pro->recive_data_map.clear(); + data_pro->recive_data_map.insert(std::pair(endpoint,client_recive_data)); + data_pro->end_flag = END_FLAG_ON;//終了フラグがON + + this->session_thread_data_map.clear(); + this->session_thread_data_map[boost::this_thread::get_id()] = data_pro; + event_status = this->handle_client_send(boost::this_thread::get_id()); + send_status = data_pro->recive_data_map[endpoint].send_status_list.front().status; + + BOOST_CHECK_EQUAL(event_status, CLIENT_DISCONNECT); //遷移先ステータスを設定する + BOOST_CHECK_EQUAL(send_status, SEND_END); //送信状態に送信待を設定する + + cout << "[464]--------------------------------------------- " << endl; + //unit_test[464] 送信状態->SEND_OK/送信可能データサイズ = 0/送信データ残サイズ = 0/送信可能データなし/終了フラグがOFFの場合/sorry状態の場合 + //unit_test[464] test data: 送信状態に送信待を設定 + client_send_status.send_possible_size = 0u;//送信可能データサイズ=0 + client_send_status.send_rest_size = 0u;//送信データ残サイズ = 0 + client_send_status.status = SEND_OK; //送信状態->SEND_OK + client_recive_data.send_status_list.clear(); + client_recive_data.send_status_list.push_back(client_send_status); + + data_pro->target_endpoint = endpoint; + data_pro->recive_data_map.clear(); + data_pro->recive_data_map.insert(std::pair(endpoint,client_recive_data)); + data_pro->end_flag = END_FLAG_OFF;//終了フラグがOFF + data_pro->sorry_flag = SORRY_FLAG_ON;//sorry状態の場合 + + this->session_thread_data_map.clear(); + this->session_thread_data_map[boost::this_thread::get_id()] = data_pro; + event_status = this->handle_client_send(boost::this_thread::get_id()); + send_status = data_pro->recive_data_map[endpoint].send_status_list.front().status; + + BOOST_CHECK_EQUAL(event_status, SORRYSERVER_RECV); //遷移先ステータスを設定する + BOOST_CHECK_EQUAL(send_status, SEND_END); //送信状態に送信待を設定する + + cout << "[465]--------------------------------------------- " << endl; + //unit_test[465] 送信状態->SEND_OK/送信可能データサイズ = 0/送信データ残サイズ = 0/送信可能データなし/終了フラグがOFFの場合/sorry状態以外の場合 + //unit_test[465] test data: 送信状態に送信待を設定 + client_send_status.send_possible_size = 0u;//送信可能データサイズ=0 + client_send_status.send_rest_size = 0u;//送信データ残サイズ = 0 + client_send_status.status = SEND_OK;//送信状態->SEND_OK + client_recive_data.send_status_list.clear(); + client_recive_data.send_status_list.push_back(client_send_status); + + data_pro->target_endpoint = endpoint; + data_pro->recive_data_map.clear(); + data_pro->recive_data_map.insert(std::pair(endpoint,client_recive_data)); + data_pro->end_flag = END_FLAG_OFF;//終了フラグがOFF + data_pro->sorry_flag = SORRY_FLAG_OFF;//sorry状態以外の場合 + + this->session_thread_data_map.clear(); + this->session_thread_data_map[boost::this_thread::get_id()] = data_pro; + event_status = this->handle_client_send(boost::this_thread::get_id()); + send_status = data_pro->recive_data_map[endpoint].send_status_list.front().status; + + BOOST_CHECK_EQUAL(event_status, REALSERVER_RECV); //遷移先ステータスを設定する + BOOST_CHECK_EQUAL(send_status, SEND_END); //送信状態に送信待を設定する + + cout << "[466]--------------------------------------------- " << endl; + //unit_test[466] 送信状態->SEND_OK,SEND_OK/送信可能データサイズ = 0/送信データ残サイズ > 0 + //unit_test[466] test data: 遷移先ステータスを設定する + client_send_status.send_possible_size = 0u; //送信可能データサイズ = 0 + client_send_status.status = SEND_OK;//送信状態->SEND_OK + client_send_status.send_rest_size = 1u; //送信データ残サイズ > 0 + client_send_status1.status = SEND_OK; + client_recive_data.send_status_list.clear(); + client_recive_data.send_status_list.push_back(client_send_status); + client_recive_data.send_status_list.push_back(client_send_status1); + + data_pro->target_endpoint = endpoint; + data_pro->recive_data_map.clear(); + data_pro->recive_data_map.insert(std::pair(endpoint,client_recive_data)); + + this->session_thread_data_map.clear(); + this->session_thread_data_map[boost::this_thread::get_id()] = data_pro; + event_status = this->handle_client_send(boost::this_thread::get_id()); + + BOOST_CHECK_EQUAL(event_status, FINALIZE); //遷移先ステータスを設定する + + cout << "[467]--------------------------------------------- " << endl; + //unit_test[467] 送信状態->SEND_OK,SEND_OK/送信可能データサイズ = 0/送信データ残サイズ = 0/送信可能データあり + //unit_test[467] test data: 送信状態に送信待を設定,遷移先ステータスを設定する + client_send_status.send_possible_size = 0u; //送信可能データサイズ = 0 + client_send_status.status = SEND_OK;//送信状態->SEND_OK + client_send_status.send_rest_size = 0u; //送信データ残サイズ = 0 + client_send_status1.status = SEND_OK; + client_recive_data.send_status_list.clear(); + client_recive_data.send_status_list.push_back(client_send_status); + client_recive_data.send_status_list.push_back(client_send_status1); + + data_pro->target_endpoint = endpoint; + data_pro->recive_data_map.clear(); + data_pro->recive_data_map.insert(std::pair(endpoint,client_recive_data)); + + this->session_thread_data_map.clear(); + this->session_thread_data_map[boost::this_thread::get_id()] = data_pro; + event_status = this->handle_client_send(boost::this_thread::get_id()); + send_status = data_pro->recive_data_map[endpoint].send_status_list.front().status; + + BOOST_CHECK_EQUAL(event_status, CLIENT_CONNECTION_CHECK); //遷移先ステータスを設定する + BOOST_CHECK_EQUAL(send_status, SEND_END); //送信可能データサイズ = 0,送信データ残サイズ = 0,送信状態に送信待を設定する + + cout << "[468]--------------------------------------------- " << endl; + //unit_test[468] 送信状態->SEND_OK,SEND_NG/送信可能データサイズ = 0 + //unit_test[468] test data: 遷移先ステータスを設定する + client_send_status.send_possible_size = 0u; //送信可能データサイズ = 0 + client_send_status.status = SEND_OK;//送信状態->SEND_OK + client_send_status.send_rest_size = 1u; //送信データ残サイズ > 0 + client_send_status1.status = SEND_NG; + client_recive_data.send_status_list.clear(); + client_recive_data.send_status_list.push_back(client_send_status); + client_recive_data.send_status_list.push_back(client_send_status1); + + data_pro->target_endpoint = endpoint; + data_pro->recive_data_map.clear(); + data_pro->recive_data_map.insert(std::pair(endpoint,client_recive_data)); + data_pro->end_flag = END_FLAG_ON; //終了フラグがONの場合 + + this->session_thread_data_map.clear(); + this->session_thread_data_map[boost::this_thread::get_id()] = data_pro; + event_status = this->handle_client_send(boost::this_thread::get_id()); + send_status = data_pro->recive_data_map[endpoint].send_status_list.front().status; + + BOOST_CHECK_EQUAL(event_status, FINALIZE); //遷移先ステータスを設定する + + cout << "[469]--------------------------------------------- " << endl; + //unit_test[469] 送信状態->SEND_OK,SEND_NG/送信可能データサイズ = 0/送信データ残サイズ = 0/送信可能データなし/終了フラグがONの場合 + //unit_test[469] test data: 送信状態に送信待を設定,遷移先ステータスを設定する + client_send_status.send_possible_size = 0u; //送信可能データサイズ = 0 + client_send_status.status = SEND_OK;//送信状態->SEND_OK + client_send_status.send_rest_size = 0u; //送信データ残サイズ = 0 + client_send_status1.status = SEND_NG; + client_recive_data.send_status_list.clear(); + client_recive_data.send_status_list.push_back(client_send_status); + client_recive_data.send_status_list.push_back(client_send_status1); + + data_pro->target_endpoint = endpoint; + data_pro->recive_data_map.clear(); + data_pro->recive_data_map.insert(std::pair(endpoint,client_recive_data)); + data_pro->end_flag = END_FLAG_ON; //終了フラグがONの場合 + + this->session_thread_data_map.clear(); + this->session_thread_data_map[boost::this_thread::get_id()] = data_pro; + event_status = this->handle_client_send(boost::this_thread::get_id()); + send_status = data_pro->recive_data_map[endpoint].send_status_list.front().status; + + BOOST_CHECK_EQUAL(event_status, CLIENT_DISCONNECT); //遷移先ステータスを設定する + BOOST_CHECK_EQUAL(send_status, SEND_END); //送信可能データサイズ = 0,送信データ残サイズ = 0,送信状態に送信待を設定する + + cout << "[470]--------------------------------------------- " << endl; + //unit_test[470] 送信状態->SEND_END,SEND_OK/送信可能データサイズ > 0 + //unit_test[470] test data: 送信状態に送信待を設定,遷移先ステータスを設定する + client_send_status.status = SEND_END;//送信状態->SEND_END + client_send_status1.send_possible_size = 1u; + client_send_status1.status = SEND_OK; + client_recive_data.send_status_list.clear(); + client_recive_data.send_status_list.push_back(client_send_status); + client_recive_data.send_status_list.push_back(client_send_status1); + + data_pro->target_endpoint = endpoint; + data_pro->recive_data_map.clear(); + data_pro->recive_data_map.insert(std::pair(endpoint,client_recive_data)); + data_pro->end_flag = END_FLAG_ON; //終了フラグがONの場合 + + this->session_thread_data_map.clear(); + this->session_thread_data_map[boost::this_thread::get_id()] = data_pro; + event_status = this->handle_client_send(boost::this_thread::get_id()); + send_status = data_pro->recive_data_map[endpoint].send_status_list.back().status; + + BOOST_CHECK_EQUAL(event_status, CLIENT_CONNECTION_CHECK); //遷移先ステータスを設定する + BOOST_CHECK_EQUAL(send_status, SEND_OK); + + cout << "[471]--------------------------------------------- " << endl; + //unit_test[471] 送信状態->SEND_END,SEND_OK/送信可能データサイズ = 0/送信データ残サイズ > 0/送信可能データなし/終了フラグがONの場合 + //unit_test[471] test data: 送信状態に送信待を設定,遷移先ステータスを設定する + client_send_status.status = SEND_END;//送信状態->SEND_END + client_send_status1.send_rest_size = 1u; //送信データ残サイズ > 0 + client_send_status1.send_possible_size = 0u; //送信可能データサイズ = 0 + client_send_status1.status = SEND_OK; + client_recive_data.send_status_list.clear(); + client_recive_data.send_status_list.push_back(client_send_status); + client_recive_data.send_status_list.push_back(client_send_status1); + + data_pro->target_endpoint = endpoint; + data_pro->recive_data_map.clear(); + data_pro->recive_data_map.insert(std::pair(endpoint,client_recive_data)); + data_pro->end_flag = END_FLAG_ON; //終了フラグがONの場合 + + this->session_thread_data_map.clear(); + this->session_thread_data_map[boost::this_thread::get_id()] = data_pro; + event_status = this->handle_client_send(boost::this_thread::get_id()); + send_status = data_pro->recive_data_map[endpoint].send_status_list.back().status; + + BOOST_CHECK_EQUAL(event_status, CLIENT_DISCONNECT); //遷移先ステータスを設定する + BOOST_CHECK_EQUAL(send_status, SEND_CONTINUE); //送信可能データサイズ = 0,送信データ残サイズ > 0,送信状態に送信待を設定する + + cout << "[472]--------------------------------------------- " << endl; + //unit_test[472] 送信状態->SEND_END + //unit_test[472] test data: 遷移先ステータスを設定する + client_send_status.status = SEND_END;//送信状態->SEND_END + client_recive_data.send_status_list.clear(); + client_recive_data.send_status_list.push_back(client_send_status); + + data_pro->target_endpoint = endpoint; + data_pro->recive_data_map.clear(); + data_pro->recive_data_map.insert(std::pair(endpoint,client_recive_data)); + data_pro->end_flag = END_FLAG_ON; //終了フラグがONの場合 + + this->session_thread_data_map.clear(); + this->session_thread_data_map[boost::this_thread::get_id()] = data_pro; + event_status = this->handle_client_send(boost::this_thread::get_id()); + + BOOST_CHECK_EQUAL(event_status, FINALIZE); //遷移先ステータスを設定する + + cout << "[473]--------------------------------------------- " << endl; + //unit_test[473] 送信状態->SEND_END,SEND_OK/終了フラグがONの場合 + //unit_test[473] test data: 送信状態に送信待を設定,遷移先ステータスを設定する + client_send_status.status = SEND_END;// 送信状態->SEND_END + client_send_status1.status = SEND_OK; //送信状態->SEND_OK + client_send_status1.send_possible_size = 0u; + client_send_status1.send_rest_size = 0u; + client_recive_data.send_status_list.clear(); + client_recive_data.send_status_list.push_back(client_send_status); + client_recive_data.send_status_list.push_back(client_send_status1); + + data_pro->target_endpoint = endpoint; + data_pro->recive_data_map.clear(); + data_pro->recive_data_map.insert(std::pair(endpoint,client_recive_data)); + data_pro->end_flag = END_FLAG_ON; //終了フラグがONの場合 + + this->session_thread_data_map.clear(); + this->session_thread_data_map[boost::this_thread::get_id()] = data_pro; + event_status = this->handle_client_send(boost::this_thread::get_id()); + send_status = data_pro->recive_data_map[endpoint].send_status_list.back().status; + + BOOST_CHECK_EQUAL(event_status, CLIENT_DISCONNECT); //遷移先ステータスを設定する + BOOST_CHECK_EQUAL(send_status, SEND_END); //送信状態に送信待を設定する + + cout << "[474]--------------------------------------------- " << endl; + //unit_test[474] 送信状態->SEND_CONTINUE,SEND_OK/送信可能データサイズ > 0 + //unit_test[474] test data: 遷移先ステータスを設定する + client_send_status.status = SEND_CONTINUE; //送信状態->SEND_CONTINUE + client_send_status1.status = SEND_OK; //送信状態->SEND_OK + client_recive_data.send_status_list.clear(); + client_recive_data.send_status_list.push_back(client_send_status); + client_recive_data.send_status_list.push_back(client_send_status1); + + data_pro->target_endpoint = endpoint; + data_pro->recive_data_map.clear(); + data_pro->recive_data_map.insert(std::pair(endpoint,client_recive_data)); + + this->session_thread_data_map.clear(); + this->session_thread_data_map[boost::this_thread::get_id()] = data_pro; + event_status = this->handle_client_send(boost::this_thread::get_id()); + + BOOST_CHECK_EQUAL(event_status, FINALIZE); //遷移先ステータスを設定する +} + +//handle_client_send 郎希倹 +void handle_client_send_test_thread(){ + boost::asio::ip::tcp::endpoint endpoint = string_to_endpoint ("10.10.100.100:8800"); + send_status client_send_status; + recive_data client_recive_data; + thread_data_ptr data_pro(new session_thread_data_sessionless) ; + + cout << "[475]--------------------------------------------- " << endl; + //unit_test[475] 多スレッドテスト/送信状態->SEND_OK/送信可能データサイズ = 0/送信データ残サイズ = 0/送信可能データなし/終了フラグがOFFの場合/sorry状態以外の場合 + //unit_test[475] test data: 送信状態に送信待を設定 + client_send_status.send_possible_size = 0u;//送信可能データサイズ=0 + client_send_status.send_rest_size = 0u;//送信データ残サイズ = 0 + client_send_status.status = SEND_OK;//送信状態->SEND_OK + client_recive_data.send_status_list.clear(); + client_recive_data.send_status_list.push_back(client_send_status); + + data_pro->target_endpoint = endpoint; + data_pro->recive_data_map.clear(); + data_pro->recive_data_map.insert(std::pair(endpoint,client_recive_data)); + data_pro->end_flag = END_FLAG_OFF;//終了フラグがOFF + data_pro->sorry_flag = SORRY_FLAG_OFF;//sorry状態以外の場合 + + { + boost::mutex::scoped_lock sclock(this->session_thread_data_map_mutex); + this->session_thread_data_map[boost::this_thread::get_id()] = data_pro; + } + EVENT_TAG event_status = this->handle_client_send(boost::this_thread::get_id()); + SEND_STATUS_TAG send_status = data_pro->recive_data_map[endpoint].send_status_list.front().status; + + { + boost::mutex::scoped_lock sclock(check_mutex); + BOOST_CHECK_EQUAL(event_status, REALSERVER_RECV); //遷移先ステータスを設定する + BOOST_CHECK_EQUAL(send_status, SEND_END); //送信状態に送信待を設定する + } +} + +//handle_client_disconnect 馮家純 +void handle_client_disconnect_test(){ + + cout << "[476]--------------------------------------------- " << endl; + //unit_test[476] 遷移先ステータスを設定する status = FINALIZE + EVENT_TAG ret = this->handle_client_disconnect(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(ret, FINALIZE); + + cout << "[477]--------------------------------------------- " << endl; + //unit_test[477] 上りスレッドと下りスレッドの場合 + boost::thread tdown_for_get_id(down_thread_func); + boost::thread_group threads; + threads.create_thread(bind(&protocol_module_sessionless_test_class::handle_client_disconnect_test_thread_func, + this, + boost::this_thread::get_id())); + threads.create_thread(bind(&protocol_module_sessionless_test_class::handle_client_disconnect_test_thread_func, + this, + tdown_for_get_id.get_id())); + threads.join_all(); +} + +void handle_client_disconnect_test_thread_func(const boost::thread::id thread_id){ + EVENT_TAG ret = this->handle_client_disconnect(thread_id); + { + boost::mutex::scoped_lock sclock(check_mutex); + BOOST_CHECK_EQUAL(ret, FINALIZE); + } +} + +//handle_sorry_enable 馬翠翠 +void handle_sorry_enable_test() { + EVENT_TAG status; + send_status sendstatus; + recive_data receivedata; + thread_data_ptr thread_data(new session_thread_data_sessionless); + boost::thread thread_up(&up_thread_func); + boost::thread thread_down(&down_thread_func); + + // 上りスレッドの場合 + thread_data->thread_division = THREAD_DIVISION_UP_STREAM; + thread_data->thread_id = boost::this_thread::get_id(); + this->session_thread_data_map.insert(pair (boost::this_thread::get_id(), + thread_data)); + + cout << "[478]--------------------------------------------- " << endl; + // unit_test[478] 上りスレッド対応のendpointなし,status = FINALIZE + init_send_status(sendstatus); + init_recive_data(receivedata); + this->session_thread_data_map[boost::this_thread::get_id()]->recive_data_map.insert( + pair ( + string_to_endpoint ("192.168.120.1:8800"), + receivedata)); + status = this->handle_sorry_enable(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(status, FINALIZE); + this->session_thread_data_map[boost::this_thread::get_id()]->recive_data_map.clear(); + + cout << "[479]--------------------------------------------- " << endl; + // unit_test[479] accept完了フラグOFFの場合,sorry状態をON,status = ACCEPT + this->session_thread_data_map[boost::this_thread::get_id()]->accept_end_flag = ACCEPT_END_FLAG_OFF; + this->session_thread_data_map[boost::this_thread::get_id()]->client_endpoint_tcp + = string_to_endpoint ("192.168.120.109:8800"); + this->session_thread_data_map[boost::this_thread::get_id()]->recive_data_map.insert( + pair ( + this->session_thread_data_map[boost::this_thread::get_id()]->client_endpoint_tcp, + receivedata)); + status = this->handle_sorry_enable(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->sorry_flag, SORRY_FLAG_ON); + BOOST_CHECK_EQUAL(status, ACCEPT); + this->session_thread_data_map[boost::this_thread::get_id()]->recive_data_map.clear(); + + cout << "[480]--------------------------------------------- " << endl; + // unit_test[480] accept完了フラグON,sorry状態,送信可能データあり list 1件の場合,status = SORRYSERVER_CONNECT + this->session_thread_data_map[boost::this_thread::get_id()]->accept_end_flag = ACCEPT_END_FLAG_ON; + this->session_thread_data_map[boost::this_thread::get_id()]->sorry_flag = SORRY_FLAG_ON; + sendstatus.status = SEND_OK; + sendstatus.send_possible_size = 10; + receivedata.send_status_list.push_back(sendstatus); + this->session_thread_data_map[boost::this_thread::get_id()]->recive_data_map.insert( + pair ( + this->session_thread_data_map[boost::this_thread::get_id()]->client_endpoint_tcp, + receivedata)); + status = this->handle_sorry_enable(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(status, SORRYSERVER_CONNECT); + this->session_thread_data_map[boost::this_thread::get_id()]->recive_data_map.clear(); + + cout << "[481]--------------------------------------------- " << endl; + // unit_test[481] 送信可能データあり list 2件 1件あり場合,status = SORRYSERVER_CONNECT + init_send_status(sendstatus); + init_recive_data(receivedata); + sendstatus.status = SEND_OK; + sendstatus.send_possible_size = 10; + receivedata.send_status_list.push_back(sendstatus); + sendstatus.status = SEND_END; + receivedata.send_status_list.push_back(sendstatus); + this->session_thread_data_map[boost::this_thread::get_id()]->recive_data_map.insert( + pair ( + this->session_thread_data_map[boost::this_thread::get_id()]->client_endpoint_tcp, + receivedata)); + status = this->handle_sorry_enable(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(status, SORRYSERVER_CONNECT); + this->session_thread_data_map[boost::this_thread::get_id()]->recive_data_map.clear(); + + cout << "[482]--------------------------------------------- " << endl; + // unit_test[482] 送信可能データなし list 3件の場合,status =SORRYSERVER_SELECT + init_send_status(sendstatus); + init_recive_data(receivedata); + sendstatus.status = SEND_END; + receivedata.send_status_list.push_back(sendstatus); + sendstatus.status = SEND_CONTINUE; + receivedata.send_status_list.push_back(sendstatus); + sendstatus.status = SEND_NG; + receivedata.send_status_list.size(); + receivedata.send_status_list.push_back(sendstatus); + this->session_thread_data_map[boost::this_thread::get_id()]->recive_data_map.insert( + pair ( + this->session_thread_data_map[boost::this_thread::get_id()]->client_endpoint_tcp, + receivedata)); + status = this->handle_sorry_enable(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(status,SORRYSERVER_SELECT); + this->session_thread_data_map[boost::this_thread::get_id()]->recive_data_map.clear(); + + cout << "[483]--------------------------------------------- " << endl; + // unit_test[483] sorry状態以外,送信継続データあり list 1件の場合,終了フラグをON,status = REALSERVER_DISCONNECT + init_send_status(sendstatus); + init_recive_data(receivedata); + this->session_thread_data_map[boost::this_thread::get_id()]->sorry_flag = SORRY_FLAG_OFF; + sendstatus.status = SEND_CONTINUE; + receivedata.send_status_list.push_back(sendstatus); + this->session_thread_data_map[boost::this_thread::get_id()]->recive_data_map.insert( + pair ( + this->session_thread_data_map[boost::this_thread::get_id()]->client_endpoint_tcp, + receivedata)); + status = this->handle_sorry_enable(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->end_flag,END_FLAG_ON); + BOOST_CHECK_EQUAL(status, REALSERVER_DISCONNECT); + this->session_thread_data_map[boost::this_thread::get_id()]->recive_data_map.clear(); + + cout << "[484]--------------------------------------------- " << endl; + // unit_test[484] 送信継続データあり list 2件 1件あり場合,終了フラグをON,status = REALSERVER_DISCONNECT + init_send_status(sendstatus); + init_recive_data(receivedata); + this->session_thread_data_map[boost::this_thread::get_id()]->sorry_flag = SORRY_FLAG_OFF; + sendstatus.status = SEND_CONTINUE; + receivedata.send_status_list.push_back(sendstatus); + sendstatus.status = SEND_NG; + receivedata.send_status_list.push_back(sendstatus); + this->session_thread_data_map[boost::this_thread::get_id()]->recive_data_map.insert( + pair ( + this->session_thread_data_map[boost::this_thread::get_id()]->client_endpoint_tcp, + receivedata)); + status = this->handle_sorry_enable(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->end_flag, END_FLAG_ON); + BOOST_CHECK_EQUAL(status, REALSERVER_DISCONNECT); + this->session_thread_data_map[boost::this_thread::get_id()]->recive_data_map.clear(); + + cout << "[485]--------------------------------------------- " << endl; + // unit_test[485] 送信継続データなし list 3件の場合,sorryserver切替中フラグON,sorry状態をON,status = REALSERVER_DISCONNECT + init_send_status(sendstatus); + init_recive_data(receivedata); + sendstatus.status = SEND_END; + receivedata.send_status_list.push_back(sendstatus); + sendstatus.status = SEND_NG; + receivedata.send_status_list.push_back(sendstatus); + sendstatus.status = SEND_OK; + receivedata.send_status_list.push_back(sendstatus); + this->session_thread_data_map[boost::this_thread::get_id()]->recive_data_map.insert( + pair ( + this->session_thread_data_map[boost::this_thread::get_id()]->client_endpoint_tcp, + receivedata)); + status = this->handle_sorry_enable(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->sorryserver_switch_flag, SORRYSERVER_SWITCH_FLAG_ON); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->sorry_flag, SORRY_FLAG_ON); + BOOST_CHECK_EQUAL(status,REALSERVER_DISCONNECT); + this->session_thread_data_map[boost::this_thread::get_id()]->recive_data_map.clear(); + + // 下りスレッドの場合 + this->session_thread_data_map.clear(); + thread_data->thread_division = THREAD_DIVISION_DOWN_STREAM; + thread_data->thread_id = boost::this_thread::get_id(); + this->session_thread_data_map.insert(pair (boost::this_thread::get_id(), + thread_data)); + this->session_thread_data_map[boost::this_thread::get_id()]->target_endpoint + = string_to_endpoint ("192.168.120.243:8800"); + + cout << "[486]--------------------------------------------- " << endl; + // unit_test[486] sorry状態,送信可能データあり list 1件の場合,status = CLIENT_CONNECTION_CHECK + init_send_status(sendstatus); + init_recive_data(receivedata); + this->session_thread_data_map[boost::this_thread::get_id()]->sorry_flag = SORRY_FLAG_ON; + sendstatus.status = SEND_OK; + sendstatus.send_possible_size = 10; + receivedata.send_status_list.push_back(sendstatus); + this->session_thread_data_map[boost::this_thread::get_id()]->recive_data_map.insert( + pair ( + this->session_thread_data_map[boost::this_thread::get_id()]->target_endpoint, + receivedata)); + status = this->handle_sorry_enable(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(status, CLIENT_CONNECTION_CHECK); + this->session_thread_data_map[boost::this_thread::get_id()]->recive_data_map.clear(); + + cout << "[487]--------------------------------------------- " << endl; + // unit_test[487] 送信可能データあり list 2件 1件あり場合,status =CLIENT_CONNECTION_CHECK + init_send_status(sendstatus); + init_recive_data(receivedata); + sendstatus.status = SEND_END; + receivedata.send_status_list.push_back(sendstatus); + sendstatus.status = SEND_OK; + sendstatus.send_possible_size = 10; + receivedata.send_status_list.push_back(sendstatus); + this->session_thread_data_map[boost::this_thread::get_id()]->recive_data_map.insert( + pair ( + this->session_thread_data_map[boost::this_thread::get_id()]->target_endpoint, + receivedata)); + status = this->handle_sorry_enable(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(status, CLIENT_CONNECTION_CHECK); + this->session_thread_data_map[boost::this_thread::get_id()]->recive_data_map.clear(); + + cout << "[488]--------------------------------------------- " << endl; + // unit_test[488] 送信可能データなし list 3件の場合,sorryフラグをON,sorryserver切替中フラグON,status = SORRYSERVER_RECV + init_send_status(sendstatus); + init_recive_data(receivedata); + sendstatus.status = SEND_END; + receivedata.send_status_list.push_back(sendstatus); + sendstatus.status = SEND_CONTINUE; + receivedata.send_status_list.push_back(sendstatus); + sendstatus.status = SEND_NG; + receivedata.send_status_list.push_back(sendstatus); + this->session_thread_data_map[boost::this_thread::get_id()]->recive_data_map.insert( + pair ( + this->session_thread_data_map[boost::this_thread::get_id()]->target_endpoint, + receivedata)); + status = this->handle_sorry_enable(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->sorry_flag, SORRY_FLAG_ON); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->sorryserver_switch_flag, SORRYSERVER_SWITCH_FLAG_ON); + BOOST_CHECK_EQUAL(status, SORRYSERVER_RECV); + this->session_thread_data_map[boost::this_thread::get_id()]->recive_data_map.clear(); + + cout << "[489]--------------------------------------------- " << endl; + // unit_test[489] sorry状態以外,送信不可データあり list 1件の場合,終了フラグをON,status = REALSERVER_DISCONNECT + init_send_status(sendstatus); + init_recive_data(receivedata); + this->session_thread_data_map[boost::this_thread::get_id()]->sorry_flag = SORRY_FLAG_OFF; + sendstatus.status = SEND_NG; + receivedata.send_status_list.push_back(sendstatus); + this->session_thread_data_map[boost::this_thread::get_id()]->recive_data_map.insert( + pair ( + this->session_thread_data_map[boost::this_thread::get_id()]->target_endpoint, + receivedata)); + status = this->handle_sorry_enable(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->end_flag , END_FLAG_ON); + BOOST_CHECK_EQUAL(status, REALSERVER_DISCONNECT); + this->session_thread_data_map[boost::this_thread::get_id()]->recive_data_map.clear(); + + cout << "[490]--------------------------------------------- " << endl; + // unit_test[490] 送信データ残サイズ > 0 が存在する list 2件の場合,終了フラグをON,status = REALSERVER_DISCONNECT + init_send_status(sendstatus); + init_recive_data(receivedata); + this->session_thread_data_map[boost::this_thread::get_id()]->sorry_flag = SORRY_FLAG_OFF; + sendstatus.status = SEND_END; + sendstatus.send_rest_size = 10; + receivedata.send_status_list.push_back(sendstatus); + sendstatus.status = SEND_END; + sendstatus.send_rest_size = 20; + receivedata.send_status_list.push_back(sendstatus); + this->session_thread_data_map[boost::this_thread::get_id()]->recive_data_map.insert( + pair ( + this->session_thread_data_map[boost::this_thread::get_id()]->target_endpoint, + receivedata)); + status = this->handle_sorry_enable(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->end_flag , END_FLAG_ON); + BOOST_CHECK_EQUAL(status, REALSERVER_DISCONNECT); + this->session_thread_data_map[boost::this_thread::get_id()]->recive_data_map.clear(); + + cout << "[491]--------------------------------------------- " << endl; + // unit_test[491] 送信不可データなしかつ送信データ残サイズ > 0 が存在しない list 1件の場合,sorry状態をON + init_send_status(sendstatus); + init_recive_data(receivedata); + this->session_thread_data_map[boost::this_thread::get_id()]->sorry_flag = SORRY_FLAG_OFF; + sendstatus.status = SEND_END; + sendstatus.send_rest_size = 0; + receivedata.send_status_list.push_back(sendstatus); + this->session_thread_data_map[boost::this_thread::get_id()]->recive_data_map.insert( + pair ( + this->session_thread_data_map[boost::this_thread::get_id()]->target_endpoint, + receivedata)); + status = this->handle_sorry_enable(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->sorry_flag, SORRY_FLAG_ON); + this->session_thread_data_map[boost::this_thread::get_id()]->recive_data_map.clear(); + + cout << "[492]--------------------------------------------- " << endl; + // unit_test[492] 送信不可データなしかつ送信データ残サイズ > 0が存在しない,送信可能データなし list 1件の場合,status = SORRYSERVER_RECV + init_send_status(sendstatus); + init_recive_data(receivedata); + this->session_thread_data_map[boost::this_thread::get_id()]->sorry_flag = SORRY_FLAG_OFF; + sendstatus.status = SEND_END; + sendstatus.send_rest_size = 0; + receivedata.send_status_list.push_back(sendstatus); + this->session_thread_data_map[boost::this_thread::get_id()]->recive_data_map.insert( + pair ( + this->session_thread_data_map[boost::this_thread::get_id()]->target_endpoint, + receivedata)); + status = this->handle_sorry_enable(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(status, SORRYSERVER_RECV); + this->session_thread_data_map[boost::this_thread::get_id()]->recive_data_map.clear(); + + cout << "[493]--------------------------------------------- " << endl; + // unit_test[493] status = CLIENT_CONNECTION_CHECK + // unit_test[493] test data:送信不可データなし かつ 送信データ残サイズ > 0が存在しない場合,送信可能データあり list 3件 + init_send_status(sendstatus); + init_recive_data(receivedata); + this->session_thread_data_map[boost::this_thread::get_id()]->sorry_flag = SORRY_FLAG_OFF; + sendstatus.status = SEND_OK; + sendstatus.send_possible_size = 10; + sendstatus.send_rest_size = 0; + receivedata.send_status_list.push_back(sendstatus); + sendstatus.status = SEND_CONTINUE; + sendstatus.send_rest_size = 0; + receivedata.send_status_list.push_back(sendstatus); + sendstatus.status = SEND_END; + sendstatus.send_rest_size = 0; + receivedata.send_status_list.push_back(sendstatus); + this->session_thread_data_map[boost::this_thread::get_id()]->recive_data_map.insert( + pair ( + this->session_thread_data_map[boost::this_thread::get_id()]->target_endpoint, + receivedata)); + status = this->handle_sorry_enable(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(status, CLIENT_CONNECTION_CHECK); + this->session_thread_data_map[boost::this_thread::get_id()]->recive_data_map.clear(); + + cout << "[494]--------------------------------------------- " << endl; + // unit_test[494] 下りスレッドのendpoint対応のrecive_dataなし場合,sorry状態をON,status = SORRYSERVER_RECV + init_send_status(sendstatus); + init_recive_data(receivedata); + this->session_thread_data_map[boost::this_thread::get_id()]->recive_data_map.insert( + pair ( + string_to_endpoint ("192.168.120.1:8800"), + receivedata)); + status = this->handle_sorry_enable(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(status, SORRYSERVER_RECV); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->sorry_flag, SORRY_FLAG_ON); + this->session_thread_data_map[boost::this_thread::get_id()]->recive_data_map.clear(); + + cout << "[495]--------------------------------------------- " << endl; + // unit_test[495] session_thread_data NULLの場合,status = FINALIZE + init_send_status(sendstatus); + init_recive_data(receivedata); + thread_data_ptr thread_data_null; + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data_null; + status = this->handle_sorry_enable(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(status, FINALIZE); + + cout << "[496]--------------------------------------------- " << endl; + // unit_test[496] thread_id対応のsession_thread_dataなし場合,status = FINALIZE + this->session_thread_data_map.clear(); + thread_data->thread_division = THREAD_DIVISION_DOWN_STREAM; + thread_data->thread_id = thread_down.get_id(); + this->session_thread_data_map.insert(pair (thread_down.get_id(), + thread_data)); + this->session_thread_data_map[thread_down.get_id()]->target_endpoint + = string_to_endpoint ("192.168.120.243:8800"); + init_send_status(sendstatus); + init_recive_data(receivedata); + sendstatus.status = SEND_OK; + receivedata.send_status_list.push_back(sendstatus); + this->session_thread_data_map[thread_down.get_id()]->recive_data_map.insert( + pair ( + this->session_thread_data_map[thread_down.get_id()]->target_endpoint, + receivedata)); + status = this->handle_sorry_enable(thread_up.get_id()); + BOOST_CHECK_EQUAL(status, FINALIZE); + this->session_thread_data_map[thread_down.get_id()]->recive_data_map.clear(); + + cout << "[497]--------------------------------------------- " << endl; + // unit_test[497] 上りスレッドの戻り値が「ACCEPT」を設定する、下りスレッドの戻り値が「CLIENT_CONNECTION_CHECK」を設定する + // unit_test[497] test data:上りスレッドと下りスレッドの場合 + init_send_status(sendstatus); + init_recive_data(receivedata); + thread_data_ptr thread_data_up(new session_thread_data_sessionless); + // 上りスレッド,accept完了フラグOFFの場合 + thread_data_up->thread_division = THREAD_DIVISION_UP_STREAM; + thread_data_up->accept_end_flag = ACCEPT_END_FLAG_OFF; + thread_data_up->thread_id = thread_up.get_id(); + thread_data_up->pair_thread_id = thread_down.get_id(); + thread_data_up->recive_data_map[thread_data_up->client_endpoint_tcp]; + // 下りスレッド,sorry状態の場合,送信可能データありの場合 + thread_data_ptr thread_data_down(new session_thread_data_sessionless); + thread_data_down->thread_division = THREAD_DIVISION_DOWN_STREAM; + thread_data_down->thread_id = thread_down.get_id(); + thread_data_down->pair_thread_id = thread_up.get_id(); + thread_data_down->sorry_flag = SORRY_FLAG_ON; + sendstatus.status = SEND_OK; + sendstatus.send_possible_size = 10; + thread_data_down->recive_data_map[thread_data_down->target_endpoint].send_status_list.push_back(sendstatus); + + this->session_thread_data_map[thread_up.get_id()] = thread_data_up; + this->session_thread_data_map[thread_down.get_id()] = thread_data_down; + boost::thread_group threads; + threads.create_thread(bind(&protocol_module_sessionless_test_class::handle_sorry_enable_test_thread_func, + this, + thread_up.get_id(), + ACCEPT)); + threads.create_thread(bind(&protocol_module_sessionless_test_class::handle_sorry_enable_test_thread_func, + this, + thread_down.get_id(), + CLIENT_CONNECTION_CHECK)); + threads.join_all(); + // sorry状態をON + BOOST_CHECK_EQUAL(thread_data_up->sorry_flag, SORRY_FLAG_ON); +} +void handle_sorry_enable_test_thread_func(const boost::thread::id thread_id, + EVENT_TAG check_value){ + EVENT_TAG ret = this->handle_sorry_enable(thread_id); + { + boost::mutex::scoped_lock sclock(check_mutex); + BOOST_CHECK_EQUAL(ret, check_value); + } +} + +void handle_sorry_enable_test_thread(){ + + EVENT_TAG status; + send_status sendstatus; + recive_data receivedata; + thread_data_ptr thread_data(new session_thread_data_sessionless); + + // 上りスレッドの場合 + thread_data->thread_division = THREAD_DIVISION_UP_STREAM; + thread_data->thread_id = boost::this_thread::get_id(); + { + boost::mutex::scoped_lock sclock(this->session_thread_data_map_mutex); + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data; + } + + cout << "[498]--------------------------------------------- " << endl; + // unit_test[498] accept完了フラグON,sorry状態,送信可能データあり list 1件の場合,status = SORRYSERVER_CONNECT + this->session_thread_data_map[boost::this_thread::get_id()]->accept_end_flag = ACCEPT_END_FLAG_ON; + this->session_thread_data_map[boost::this_thread::get_id()]->sorry_flag = SORRY_FLAG_ON; + sendstatus.status = SEND_OK; + sendstatus.send_possible_size = 10; + receivedata.send_status_list.push_back(sendstatus); + this->session_thread_data_map[boost::this_thread::get_id()]->recive_data_map.insert( + pair ( + this->session_thread_data_map[boost::this_thread::get_id()]->client_endpoint_tcp, + receivedata)); + status = this->handle_sorry_enable(boost::this_thread::get_id()); + { + boost::mutex::scoped_lock sclock(check_mutex); + BOOST_CHECK_EQUAL(status, SORRYSERVER_CONNECT); + } + +} + +//handle_sorry_disable 馬翠翠 +void handle_sorry_disable_test(){ + EVENT_TAG status; + send_status sendstatus; + recive_data receivedata; + thread_data_ptr thread_data(new session_thread_data_sessionless); + boost::thread thread_up(&up_thread_func); + boost::thread thread_down(&down_thread_func); + + // 上りスレッドの場合 + thread_data->thread_division = THREAD_DIVISION_UP_STREAM; + thread_data->thread_id = boost::this_thread::get_id(); + this->session_thread_data_map.insert(pair (boost::this_thread::get_id(), + thread_data)); + this->session_thread_data_map[boost::this_thread::get_id()]->client_endpoint_tcp + = string_to_endpoint ("192.168.120.109:8800"); + + cout << "[499]--------------------------------------------- " << endl; + // unit_test[499] 上りスレッド対応のendpointなし,status = FINALIZE + init_send_status(sendstatus); + init_recive_data(receivedata); + this->session_thread_data_map[boost::this_thread::get_id()]->recive_data_map.insert( + pair ( + string_to_endpoint ("192.168.120.1:8800"), + receivedata)); + status = this->handle_sorry_disable(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(status, FINALIZE); + this->session_thread_data_map[boost::this_thread::get_id()]->recive_data_map.clear(); + + + cout << "[500]--------------------------------------------- " << endl; + // unit_test[500] accept完了フラグOFFの場合,sorry状態をOFF,status = ACCEPT + this->session_thread_data_map[boost::this_thread::get_id()]->accept_end_flag = ACCEPT_END_FLAG_OFF; + this->session_thread_data_map[boost::this_thread::get_id()]->recive_data_map.insert( + pair ( + this->session_thread_data_map[boost::this_thread::get_id()]->client_endpoint_tcp, + receivedata)); + status = this->handle_sorry_disable(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->sorry_flag, SORRY_FLAG_OFF); + BOOST_CHECK_EQUAL(status, ACCEPT); + this->session_thread_data_map[boost::this_thread::get_id()]->recive_data_map.clear(); + + cout << "[501]--------------------------------------------- " << endl; + // unit_test[501] 終了フラグをON,status = SORRYSERVER_DISCONNECT + // unit_test[501] test data:accept完了フラグONの場合,sorry状態の場合,送信継続データあり list 1件 + this->session_thread_data_map[boost::this_thread::get_id()]->accept_end_flag = ACCEPT_END_FLAG_ON; + this->session_thread_data_map[boost::this_thread::get_id()]->sorry_flag = SORRY_FLAG_ON; + sendstatus.status = SEND_CONTINUE; + receivedata.send_status_list.push_back(sendstatus); + this->session_thread_data_map[boost::this_thread::get_id()]->recive_data_map.insert( + pair ( + this->session_thread_data_map[boost::this_thread::get_id()]->client_endpoint_tcp, + receivedata)); + status = this->handle_sorry_disable(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->end_flag, END_FLAG_ON); + BOOST_CHECK_EQUAL(status, SORRYSERVER_DISCONNECT); + this->session_thread_data_map[boost::this_thread::get_id()]->recive_data_map.clear(); + + cout << "[502]--------------------------------------------- " << endl; + // unit_test[502] 送信継続データあり list 2件 1件あり場合,終了フラグをON,status = SORRYSERVER_DISCONNECT + init_send_status(sendstatus); + init_recive_data(receivedata); + sendstatus.status = SEND_CONTINUE; + receivedata.send_status_list.push_back(sendstatus); + sendstatus.status = SEND_NG; + receivedata.send_status_list.push_back(sendstatus); + this->session_thread_data_map[boost::this_thread::get_id()]->recive_data_map.insert( + pair ( + this->session_thread_data_map[boost::this_thread::get_id()]->client_endpoint_tcp, + receivedata)); + status = this->handle_sorry_disable(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->end_flag, END_FLAG_ON); + BOOST_CHECK_EQUAL(status, SORRYSERVER_DISCONNECT); + this->session_thread_data_map[boost::this_thread::get_id()]->recive_data_map.clear(); + + cout << "[503]--------------------------------------------- " << endl; + // unit_test[503] 送信継続データなし list 3件の場合,realserver切替中,sorry状態をOFF,status = SORRYSERVER_DISCONNECT + init_send_status(sendstatus); + init_recive_data(receivedata); + sendstatus.status = SEND_END; + receivedata.send_status_list.push_back(sendstatus); + sendstatus.status = SEND_NG; + receivedata.send_status_list.push_back(sendstatus); + sendstatus.status = SEND_OK; + receivedata.send_status_list.push_back(sendstatus); + this->session_thread_data_map[boost::this_thread::get_id()]->recive_data_map.insert( + pair ( + this->session_thread_data_map[boost::this_thread::get_id()]->client_endpoint_tcp, + receivedata)); + status = this->handle_sorry_disable(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->realserver_switch_flag, REALSERVER_SWITCH_FLAG_ON); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->sorry_flag, SORRY_FLAG_OFF); + BOOST_CHECK_EQUAL(status, SORRYSERVER_DISCONNECT); + this->session_thread_data_map[boost::this_thread::get_id()]->recive_data_map.clear(); + + cout << "[504]--------------------------------------------- " << endl; + // unit_test[504] sorry状態以外,送信可能データあり list 1件の場合,status = REALSERVER_CONNECT + init_send_status(sendstatus); + init_recive_data(receivedata); + this->session_thread_data_map[boost::this_thread::get_id()]->sorry_flag = SORRY_FLAG_OFF; + sendstatus.status = SEND_OK; + sendstatus.send_possible_size = 10; + receivedata.send_status_list.push_back(sendstatus); + this->session_thread_data_map[boost::this_thread::get_id()]->recive_data_map.insert( + pair ( + this->session_thread_data_map[boost::this_thread::get_id()]->client_endpoint_tcp, + receivedata)); + status = this->handle_sorry_disable(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(status, REALSERVER_CONNECT); + this->session_thread_data_map[boost::this_thread::get_id()]->recive_data_map.clear(); + + cout << "[505]--------------------------------------------- " << endl; + // unit_test[505] 送信可能データあり list 2件 1件ありの場合,status = REALSERVER_CONNECT + init_send_status(sendstatus); + init_recive_data(receivedata); + sendstatus.status = SEND_OK; + sendstatus.send_possible_size = 10; + receivedata.send_status_list.push_back(sendstatus); + sendstatus.status = SEND_END; + receivedata.send_status_list.push_back(sendstatus); + this->session_thread_data_map[boost::this_thread::get_id()]->recive_data_map.insert( + pair ( + this->session_thread_data_map[boost::this_thread::get_id()]->client_endpoint_tcp, + receivedata)); + status = this->handle_sorry_disable(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(status, REALSERVER_CONNECT); + this->session_thread_data_map[boost::this_thread::get_id()]->recive_data_map.clear(); + + cout << "[506]--------------------------------------------- " << endl; + // unit_test[506] 送信可能データなし list 3件の場合,status = REALSERVER_SELECT + init_send_status(sendstatus); + init_recive_data(receivedata); + sendstatus.status = SEND_END; + receivedata.send_status_list.push_back(sendstatus); + sendstatus.status = SEND_CONTINUE; + receivedata.send_status_list.push_back(sendstatus); + sendstatus.status = SEND_NG; + receivedata.send_status_list.push_back(sendstatus); + this->session_thread_data_map[boost::this_thread::get_id()]->recive_data_map.insert( + pair ( + this->session_thread_data_map[boost::this_thread::get_id()]->client_endpoint_tcp, + receivedata)); + status = this->handle_sorry_disable(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(status, REALSERVER_SELECT); + this->session_thread_data_map[boost::this_thread::get_id()]->recive_data_map.clear(); + + // 下りスレッドの場合 + this->session_thread_data_map.clear(); + thread_data->thread_division = THREAD_DIVISION_DOWN_STREAM; + thread_data->thread_id = boost::this_thread::get_id(); + this->session_thread_data_map.insert(pair (boost::this_thread::get_id(), + thread_data)); + this->session_thread_data_map[boost::this_thread::get_id()]->target_endpoint + = string_to_endpoint ("192.168.120.109:8800"); + + + cout << "[507]--------------------------------------------- " << endl; + // unit_test[507] 終了フラグをON,sorry状態をOFF,realserver切替中,status = SORRYSERVER_DISCONNECT + // unit_test[507] test data:sorry状態の場合,送信不可データあり list 1件 + init_send_status(sendstatus); + init_recive_data(receivedata); + this->session_thread_data_map[boost::this_thread::get_id()]->sorry_flag = SORRY_FLAG_ON; + sendstatus.status = SEND_NG; + receivedata.send_status_list.push_back(sendstatus); + this->session_thread_data_map[boost::this_thread::get_id()]->recive_data_map.insert( + std::pair( + this->session_thread_data_map[boost::this_thread::get_id()]->target_endpoint, + receivedata)); + status = this->handle_sorry_disable(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->end_flag, END_FLAG_ON); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->sorry_flag, SORRY_FLAG_OFF); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->realserver_switch_flag, REALSERVER_SWITCH_FLAG_ON); + BOOST_CHECK_EQUAL(status, SORRYSERVER_DISCONNECT); + this->session_thread_data_map[boost::this_thread::get_id()]->recive_data_map.clear(); + + cout << "[508]--------------------------------------------- " << endl; + // unit_test[508] 終了フラグをON,status = SORRYSERVER_DISCONNECT + // unit_test[508] test data:送信データ残サイズ > 0 が存在する場合 list 2件 + init_send_status(sendstatus); + init_recive_data(receivedata); + this->session_thread_data_map[boost::this_thread::get_id()]->sorry_flag = SORRY_FLAG_ON; + sendstatus.status = SEND_END; + sendstatus.send_rest_size = 10; + receivedata.send_status_list.push_back(sendstatus); + sendstatus.status = SEND_END; + sendstatus.send_rest_size = 20; + receivedata.send_status_list.push_back(sendstatus); + this->session_thread_data_map[boost::this_thread::get_id()]->recive_data_map.insert( + pair ( + this->session_thread_data_map[boost::this_thread::get_id()]->target_endpoint, + receivedata)); + status = this->handle_sorry_disable(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->end_flag, END_FLAG_ON); + BOOST_CHECK_EQUAL(status, SORRYSERVER_DISCONNECT); + this->session_thread_data_map[boost::this_thread::get_id()]->recive_data_map.clear(); + + cout << "[509]--------------------------------------------- " << endl; + // unit_test[509] sorry状態をOFF + // unit_test[509] test data:送信不可データなし かつ 送信データ残サイズ > 0 が存在しない場合 list 1件 + init_send_status(sendstatus); + init_recive_data(receivedata); + sendstatus.status = SEND_END; + sendstatus.send_rest_size = 0; + receivedata.send_status_list.push_back(sendstatus); + this->session_thread_data_map[boost::this_thread::get_id()]->recive_data_map.insert( + pair ( + this->session_thread_data_map[boost::this_thread::get_id()]->target_endpoint, + receivedata)); + status = this->handle_sorry_disable(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->sorry_flag, SORRY_FLAG_OFF); + this->session_thread_data_map[boost::this_thread::get_id()]->recive_data_map.clear(); + + cout << "[510]--------------------------------------------- " << endl; + // unit_test[510] sorry状態をOFF,送信可能データなし status = REALSERVER_RECV + // unit_test[510] test data:送信不可データなし かつ 送信データ残サイズ > 0 が存在しない場合,送信可能データなし list 1件 + init_send_status(sendstatus); + init_recive_data(receivedata); + sendstatus.status = SEND_END; + sendstatus.send_rest_size = 0; + receivedata.send_status_list.push_back(sendstatus); + this->session_thread_data_map[boost::this_thread::get_id()]->recive_data_map.insert( + pair ( + this->session_thread_data_map[boost::this_thread::get_id()]->target_endpoint, + receivedata)); + status = this->handle_sorry_disable(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(status, REALSERVER_RECV); + this->session_thread_data_map[boost::this_thread::get_id()]->recive_data_map.clear(); + + cout << "[511]--------------------------------------------- " << endl; + // unit_test[511] status = CLIENT_CONNECTION_CHECK + // unit_test[511] test data:送信不可データなし かつ 送信データ残サイズ > 0 が存在しない場合,送信可能データあり list 3件 + init_send_status(sendstatus); + init_recive_data(receivedata); + sendstatus.status = SEND_OK; + sendstatus.send_possible_size = 10; + sendstatus.send_rest_size = 0; + receivedata.send_status_list.push_back(sendstatus); + sendstatus.status = SEND_CONTINUE; + sendstatus.send_rest_size = 0; + receivedata.send_status_list.push_back(sendstatus); + sendstatus.status = SEND_END; + sendstatus.send_rest_size = 0; + receivedata.send_status_list.push_back(sendstatus); + this->session_thread_data_map[boost::this_thread::get_id()]->recive_data_map.insert( + pair ( + this->session_thread_data_map[boost::this_thread::get_id()]->target_endpoint, + receivedata)); + status = this->handle_sorry_disable(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(status, CLIENT_CONNECTION_CHECK); + this->session_thread_data_map[boost::this_thread::get_id()]->recive_data_map.clear(); + + cout << "[512]--------------------------------------------- " << endl; + // unit_test[512] sorry状態以外,送信可能データあり list 1件の場合,status = CLIENT_CONNECTION_CHECK + init_send_status(sendstatus); + init_recive_data(receivedata); + this->session_thread_data_map[boost::this_thread::get_id()]->sorry_flag = SORRY_FLAG_OFF; + sendstatus.status = SEND_OK; + sendstatus.send_possible_size = 10; + receivedata.send_status_list.push_back(sendstatus); + this->session_thread_data_map[boost::this_thread::get_id()]->recive_data_map.insert( + pair ( + this->session_thread_data_map[boost::this_thread::get_id()]->target_endpoint, + receivedata)); + status = this->handle_sorry_disable(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(status, CLIENT_CONNECTION_CHECK); + this->session_thread_data_map[boost::this_thread::get_id()]->recive_data_map.clear(); + + cout << "[513]--------------------------------------------- " << endl; + // unit_test[513] 送信可能データあり list 2件 1件ありの場合,status = CLIENT_CONNECTION_CHECK + init_send_status(sendstatus); + init_recive_data(receivedata); + sendstatus.status = SEND_END; + receivedata.send_status_list.push_back(sendstatus); + sendstatus.status = SEND_OK; + sendstatus.send_possible_size = 10; + receivedata.send_status_list.push_back(sendstatus); + this->session_thread_data_map[boost::this_thread::get_id()]->recive_data_map.insert( + pair ( + this->session_thread_data_map[boost::this_thread::get_id()]->target_endpoint, + receivedata)); + status = this->handle_sorry_disable(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(status, CLIENT_CONNECTION_CHECK); + this->session_thread_data_map[boost::this_thread::get_id()]->recive_data_map.clear(); + + cout << "[514]--------------------------------------------- " << endl; + // unit_test[514] 送信可能データなし list 3件の場合,status =REALSERVER_RECV + init_send_status(sendstatus); + init_recive_data(receivedata); + sendstatus.status = SEND_END; + receivedata.send_status_list.push_back(sendstatus); + sendstatus.status = SEND_CONTINUE; + receivedata.send_status_list.push_back(sendstatus); + sendstatus.status = SEND_NG; + receivedata.send_status_list.push_back(sendstatus); + this->session_thread_data_map[boost::this_thread::get_id()]->recive_data_map.insert( + pair ( + this->session_thread_data_map[boost::this_thread::get_id()]->target_endpoint, + receivedata)); + status = this->handle_sorry_disable(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(status, REALSERVER_RECV); + this->session_thread_data_map[boost::this_thread::get_id()]->recive_data_map.clear(); + + cout << "[515]--------------------------------------------- " << endl; + // unit_test[515] 下りスレッドのendpoint対応のrecive_dataなし場合,sorry状態をOFF,status = REALSERVER_RECV + init_send_status(sendstatus); + init_recive_data(receivedata); + this->session_thread_data_map[boost::this_thread::get_id()]->recive_data_map.insert( + pair ( + string_to_endpoint ("192.168.120.1:8800"), + receivedata)); + status = this->handle_sorry_disable(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->sorry_flag, SORRY_FLAG_OFF); + BOOST_CHECK_EQUAL(status, REALSERVER_RECV); + this->session_thread_data_map[boost::this_thread::get_id()]->recive_data_map.clear(); + + cout << "[516]--------------------------------------------- " << endl; + // unit_test[516] session_thread_data NULLの場合,status = FINALIZE + init_send_status(sendstatus); + init_recive_data(receivedata); + thread_data_ptr thread_data_null; + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data_null; + status = this->handle_sorry_disable(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(status, FINALIZE); + + cout << "[517]--------------------------------------------- " << endl; + // unit_test[517] thread_id対応のsession_thread_dataなし場合,status =FINALIZE + this->session_thread_data_map.clear(); + thread_data->thread_division = THREAD_DIVISION_DOWN_STREAM; + thread_data->thread_id = thread_down.get_id(); + this->session_thread_data_map.insert(pair (thread_down.get_id(), + thread_data)); + this->session_thread_data_map[thread_down.get_id()]->target_endpoint + = string_to_endpoint ("192.168.120.109:8800"); + init_send_status(sendstatus); + init_recive_data(receivedata); + sendstatus.status = SEND_OK; + receivedata.send_status_list.push_back(sendstatus); + this->session_thread_data_map[thread_down.get_id()]->recive_data_map.insert( + pair ( + this->session_thread_data_map[thread_down.get_id()]->target_endpoint, + receivedata)); + status = this->handle_sorry_disable(thread_up.get_id()); + BOOST_CHECK_EQUAL(status, FINALIZE); + this->session_thread_data_map[thread_down.get_id()]->recive_data_map.clear(); + + cout << "[518]--------------------------------------------- " << endl; + // unit_test[518] 上りスレッドの戻り値が「ACCEPT」を設定する、下りスレッドの戻り値が「CLIENT_CONNECTION_CHECK」を設定する + // unit_test[518] test data:上りスレッドと下りスレッドの場合 + init_send_status(sendstatus); + init_recive_data(receivedata); + thread_data_ptr thread_data_up(new session_thread_data_sessionless); + // 上りスレッド,accept完了フラグOFFの場合 + thread_data_up->thread_division = THREAD_DIVISION_UP_STREAM; + thread_data_up->accept_end_flag = ACCEPT_END_FLAG_OFF; + thread_data_up->thread_id = thread_up.get_id(); + thread_data_up->pair_thread_id = thread_down.get_id(); + thread_data_up->recive_data_map[thread_data_up->client_endpoint_tcp]; + // 下りスレッド,sorry状態以外の場合,送信可能データありの場合 + thread_data_ptr thread_data_down(new session_thread_data_sessionless); + thread_data_down->thread_division = THREAD_DIVISION_DOWN_STREAM; + thread_data_down->thread_id = thread_down.get_id(); + thread_data_down->pair_thread_id = thread_up.get_id(); + thread_data_down->sorry_flag = SORRY_FLAG_OFF; + sendstatus.status = SEND_OK; + sendstatus.send_possible_size = 10; + thread_data_down->recive_data_map[thread_data_down->target_endpoint].send_status_list.push_back(sendstatus); + + this->session_thread_data_map[thread_up.get_id()] = thread_data_up; + this->session_thread_data_map[thread_down.get_id()] = thread_data_down; + boost::thread_group threads; + threads.create_thread(bind(&protocol_module_sessionless_test_class::handle_sorry_disable_test_thread_func, + this, + thread_up.get_id(), + ACCEPT)); + threads.create_thread(bind(&protocol_module_sessionless_test_class::handle_sorry_disable_test_thread_func, + this, + thread_down.get_id(), + CLIENT_CONNECTION_CHECK)); + threads.join_all(); + // sorry状態をOFF + BOOST_CHECK_EQUAL(thread_data_up->sorry_flag, SORRY_FLAG_OFF); +} + + +void handle_sorry_disable_test_thread_func(const boost::thread::id thread_id, + EVENT_TAG check_value){ + EVENT_TAG ret = this->handle_sorry_disable(thread_id); + { + boost::mutex::scoped_lock sclock(check_mutex); + BOOST_CHECK_EQUAL(ret, check_value); + } +} + +void handle_sorry_disable_test_thread(){ + + EVENT_TAG status; + send_status sendstatus; + recive_data receivedata; + thread_data_ptr thread_data(new session_thread_data_sessionless); + + // 上りスレッドの場合 + thread_data->thread_division = THREAD_DIVISION_UP_STREAM; + thread_data->thread_id = boost::this_thread::get_id(); + { + boost::mutex::scoped_lock sclock(this->session_thread_data_map_mutex); + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data; + } + + cout << "[519]--------------------------------------------- " << endl; + // unit_test[519] 終了フラグをON,status = SORRYSERVER_DISCONNECT + // unit_test[519] test data:accept完了フラグONの場合,sorry状態の場合,送信継続データあり list 1件 + thread_data->accept_end_flag = ACCEPT_END_FLAG_ON; + thread_data->sorry_flag = SORRY_FLAG_ON; + sendstatus.status = SEND_CONTINUE; + receivedata.send_status_list.push_back(sendstatus); + thread_data->recive_data_map.insert( + pair ( + thread_data->client_endpoint_tcp, + receivedata)); + status = this->handle_sorry_disable(boost::this_thread::get_id()); + { + boost::mutex::scoped_lock sclock(check_mutex); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->end_flag, END_FLAG_ON); + BOOST_CHECK_EQUAL(status, SORRYSERVER_DISCONNECT); + } +} + +//handle_realserver_disconnect(tcp) 馮家純 +void handle_realserver_disconnect_tcp_test(){ + EVENT_TAG ret; + cout << "[520]--------------------------------------------- " << endl; + //unit_test[520] 異常系 上りスレッドsession_thread_data_map中にThreadID対応のデータがない + this->session_thread_data_map[boost::this_thread::get_id()].reset(); + boost::asio::ip::tcp::endpoint ep_err; + ret = this->handle_realserver_disconnect(boost::this_thread::get_id(), ep_err); + //遷移先ステータスを設定する status = FINALIZE + BOOST_CHECK_EQUAL(ret, FINALIZE); + + cout << "[521]--------------------------------------------- " << endl; + //unit_test[521] 異常系 上りスレッドsession_thread_data_map中にThreadIDなしの場合のテスト + this->session_thread_data_map.clear(); + ret = this->handle_realserver_disconnect(boost::this_thread::get_id(), ep_err); + //遷移先ステータスを設定する status = FINALIZE + BOOST_CHECK_EQUAL(ret, FINALIZE); + + cout << "[522]--------------------------------------------- " << endl; + //unit_test[522] 異常系 下りスレッドsession_thread_data_map中にThreadID対応のデータがない + boost::thread t_err(down_thread_func); + this->session_thread_data_map[t_err.get_id()].reset(); + ret = this->handle_realserver_disconnect(t_err.get_id(), ep_err); + //遷移先ステータスを設定する status = FINALIZE + BOOST_CHECK_EQUAL(ret, FINALIZE); + + cout << "[523]--------------------------------------------- " << endl; + //unit_test[523] 異常系 下りスレッドsession_thread_data_map中にThreadIDなしの場合のテスト + this->session_thread_data_map.clear(); + ret = this->handle_realserver_disconnect(t_err.get_id(), ep_err); + //遷移先ステータスを設定する status = FINALIZE + BOOST_CHECK_EQUAL(ret, FINALIZE); + + cout << "[524]--------------------------------------------- " << endl; + //unit_test[524] 上りスレッドの場合->終了フラグがONの場合 + boost::asio::ip::tcp::endpoint ep1, ep_d1; + + thread_data_ptr data1(new session_thread_data_sessionless); + this->session_thread_data_map[boost::this_thread::get_id()] = data1; + //make 上りスレッドの場合 0->上りスレッド + data1->thread_division = THREAD_DIVISION_UP_STREAM; + //make 終了フラグがONの場合 1->on + data1->end_flag = END_FLAG_ON; + + data1->recive_data_map[ep_d1]; + + ret = this->handle_realserver_disconnect(boost::this_thread::get_id(), ep1); + //遷移先ステータスを設定する status = CLIENT_RECV + BOOST_CHECK_EQUAL(ret, CLIENT_RECV); + + cout << "[525]--------------------------------------------- " << endl; + //unit_test[525] 上りスレッドの場合->終了フラグがOFFの場合->sorryserver切替中の場合->送信可能データあり + this->session_thread_data_map.clear(); + + boost::asio::ip::tcp::endpoint ep2; + + thread_data_ptr data2(new session_thread_data_sessionless); + this->session_thread_data_map[boost::this_thread::get_id()] = data2; + //make 上りスレッドの場合 0->上りスレッド + data2->thread_division = THREAD_DIVISION_UP_STREAM; + //make 終了フラグがOFFの場合 0->off + data2->end_flag = END_FLAG_OFF; + //make sorryserver切替中の場合 1->切替中 + data2->sorryserver_switch_flag = SORRYSERVER_SWITCH_FLAG_ON; + //make 送信可能データあり + send_status st2; + st2.status = SEND_OK; + st2.send_possible_size = 100u; + data2->recive_data_map[ep2].send_status_list.push_back(st2); + + + ret = this->handle_realserver_disconnect(boost::this_thread::get_id(), ep2); + //遷移先ステータスを設定する status = SORRYSERVER_SELECT + BOOST_CHECK_EQUAL(ret, SORRYSERVER_SELECT); + + cout << "[526]--------------------------------------------- " << endl; + //unit_test[526] 上りスレッドの場合->終了フラグがOFFの場合->sorryserver切替中の場合->送信可能データなし + this->session_thread_data_map.clear(); + + boost::asio::ip::tcp::endpoint ep3; + + thread_data_ptr data3(new session_thread_data_sessionless); + this->session_thread_data_map[boost::this_thread::get_id()] = data3; + //make 上りスレッドの場合 0->上りスレッド + data3->thread_division = THREAD_DIVISION_UP_STREAM; + //make 終了フラグがOFFの場合 0->off + data3->end_flag = END_FLAG_OFF; + //make sorryserver切替中の場合 1->切替中 + data3->sorryserver_switch_flag = SORRYSERVER_SWITCH_FLAG_ON; + //make 送信可能データなし + send_status st3; + //send_possible=0 + st3.send_possible_size = 0u; + data3->recive_data_map[ep3].send_status_list.push_back(st3); + + ret = this->handle_realserver_disconnect(boost::this_thread::get_id(), ep3); + //遷移先ステータスを設定する status = SORRYSERVER_SELECT + BOOST_CHECK_EQUAL(ret, SORRYSERVER_SELECT); + + cout << "[527]--------------------------------------------- " << endl; + //unit_test[527] 上りスレッドの場合->終了フラグがOFFの場合->sorryserver切替中でない場合 + this->session_thread_data_map.clear(); + + boost::asio::ip::tcp::endpoint ep4, ep_d4; + + thread_data_ptr data4(new session_thread_data_sessionless); + this->session_thread_data_map[boost::this_thread::get_id()] = data4; + //make 上りスレッドの場合 0->上りスレッド + data4->thread_division = THREAD_DIVISION_UP_STREAM; + //make 終了フラグがOFFの場合 0->off + data4->end_flag = END_FLAG_OFF; + //make sorryserver切替中でない場合 0->切替中でない + data4->sorryserver_switch_flag = SORRYSERVER_SWITCH_FLAG_OFF; + + data4->recive_data_map[ep_d4]; + + ret = this->handle_realserver_disconnect(boost::this_thread::get_id(), ep4); + //終了フラグをON + BOOST_CHECK_EQUAL(data4->end_flag, END_FLAG_ON); + //遷移先ステータスを設定する status = CLIENT_RECV + BOOST_CHECK_EQUAL(ret, CLIENT_RECV); + + cout << "[528]--------------------------------------------- " << endl; + //unit_test[528] 下りスレッドの場合->送信可能データあり + this->session_thread_data_map.clear(); + + boost::thread t5(down_thread_func); + boost::asio::ip::tcp::endpoint ep5; + + thread_data_ptr data5(new session_thread_data_sessionless); + this->session_thread_data_map[t5.get_id()] = data5; + //make 下りスレッドの場合 1->下りスレッド + data5->thread_division = THREAD_DIVISION_DOWN_STREAM; + data5->sorryserver_switch_flag = SORRYSERVER_SWITCH_FLAG_OFF; + //make 送信可能データあり + send_status st5; + st5.status = SEND_OK; + //send_possible>0 + st5.send_possible_size = 100u; + data5->recive_data_map[ep5].send_status_list.push_back(st5); + + ret = this->handle_realserver_disconnect(t5.get_id(), ep5); + //終了フラグをON + BOOST_CHECK_EQUAL(data5->end_flag, END_FLAG_ON); + //遷移先ステータスを設定する status = CLIENT_CONNECTION_CHECK + BOOST_CHECK_EQUAL(ret, CLIENT_CONNECTION_CHECK); + + cout << "[529]--------------------------------------------- " << endl; + //unit_test[529] 下りスレッドの場合->送信可能データなし + this->session_thread_data_map.clear(); + + boost::thread t6(down_thread_func); + boost::asio::ip::tcp::endpoint ep6; + + thread_data_ptr data6(new session_thread_data_sessionless); + this->session_thread_data_map[t6.get_id()] = data6; + //make 下りスレッドの場合 1->下りスレッド + data6->thread_division = THREAD_DIVISION_DOWN_STREAM; + //make 送信可能データなし + send_status st6; + //send_possible>0 + st6.send_possible_size = 0u; + data6->recive_data_map[ep6].send_status_list.push_back(st6); + + ret = this->handle_realserver_disconnect(t6.get_id(), ep6); + //終了フラグをON + BOOST_CHECK_EQUAL(data6->end_flag, END_FLAG_ON); + //遷移先ステータスを設定する status = CLIENT_DISCONNECT + BOOST_CHECK_EQUAL(ret, CLIENT_DISCONNECT); + + cout << "[530]--------------------------------------------- " << endl; + //unit_test[530] 上りスレッドと下りスレッドの場合 + this->session_thread_data_map.clear(); + + boost::thread tdown_for_get_id(down_thread_func); + + boost::asio::ip::tcp::endpoint epup; + boost::asio::ip::tcp::endpoint epdown; + + //上りスレッドの場合->終了フラグがONの場合 + thread_data_ptr dataup(new session_thread_data_sessionless); + dataup->thread_id = boost::this_thread::get_id(); + dataup->thread_division = THREAD_DIVISION_UP_STREAM; + dataup->pair_thread_id = tdown_for_get_id.get_id(); + dataup->end_flag = END_FLAG_ON; + dataup->recive_data_map[epup]; + + // 下りスレッドの場合->送信可能データあり + thread_data_ptr datadown(new session_thread_data_sessionless); + datadown->thread_id = tdown_for_get_id.get_id(); + datadown->thread_division = THREAD_DIVISION_DOWN_STREAM; + datadown->sorryserver_switch_flag = SORRYSERVER_SWITCH_FLAG_OFF; + datadown->pair_thread_id = boost::this_thread::get_id(); + //make 送信可能データあり + send_status st; + st.status = SEND_OK; + st.send_possible_size = 100u; + datadown->recive_data_map[epdown].send_status_list.push_back(st); + + this->session_thread_data_map[boost::this_thread::get_id()] = dataup; + this->session_thread_data_map[tdown_for_get_id.get_id()] = datadown; + + boost::thread_group threads; + threads.create_thread(bind(&protocol_module_sessionless_test_class::handle_realserver_disconnect_test_thread_func, + this, + boost::this_thread::get_id(), + epup, + CLIENT_RECV)); + threads.create_thread(bind(&protocol_module_sessionless_test_class::handle_realserver_disconnect_test_thread_func, + this, + tdown_for_get_id.get_id(), + epdown, + CLIENT_CONNECTION_CHECK)); + threads.join_all(); + + //終了フラグをON + BOOST_CHECK_EQUAL(datadown->end_flag, END_FLAG_ON); + +} + +void handle_realserver_disconnect_test_thread_func(const boost::thread::id thread_id, + const boost::asio::ip::tcp::endpoint & rs_endpoint, + EVENT_TAG check_value){ + EVENT_TAG ret = this->handle_realserver_disconnect(thread_id, rs_endpoint); + { + boost::mutex::scoped_lock sclock(check_mutex); + BOOST_CHECK_EQUAL(ret, check_value); + } +} + +void handle_realserver_disconnect_tcp_test_thread(){ + EVENT_TAG ret; + cout << "[531]--------------------------------------------- " << endl; + //unit_test[531] 上りスレッドの場合->終了フラグがOFFの場合->sorryserver切替中の場合->送信可能データなし + + boost::asio::ip::tcp::endpoint ep3; + + thread_data_ptr data3(new session_thread_data_sessionless); + + //make 上りスレッドの場合 0->上りスレッド + data3->thread_division = THREAD_DIVISION_UP_STREAM; + //make 終了フラグがOFFの場合 0->off + data3->end_flag = END_FLAG_OFF; + //make sorryserver切替中の場合 1->切替中 + data3->sorryserver_switch_flag = SORRYSERVER_SWITCH_FLAG_ON; + //make 送信可能データなし + send_status st3; + //send_possible=0 + st3.send_possible_size = 0u; + data3->recive_data_map[ep3].send_status_list.push_back(st3); + + { + boost::mutex::scoped_lock sclock(this->session_thread_data_map_mutex); + this->session_thread_data_map[boost::this_thread::get_id()] = data3; + } + + ret = this->handle_realserver_disconnect(boost::this_thread::get_id(), ep3); + { + boost::mutex::scoped_lock sclock(check_mutex); + //遷移先ステータスを設定する status = SORRYSERVER_SELECT + BOOST_CHECK_EQUAL(ret, SORRYSERVER_SELECT); + } +} + +//handle_sorryserver_disconnect 馮家純 +void handle_sorryserver_disconnect_test(){ + EVENT_TAG ret; + cout << "[532]--------------------------------------------- " << endl; + //unit_test[532] 異常系 上りスレッドsession_thread_data_map中にThreadID対応のデータなし + this->session_thread_data_map[boost::this_thread::get_id()].reset(); + boost::asio::ip::tcp::endpoint ep_err; + ret = this->handle_sorryserver_disconnect(boost::this_thread::get_id(), ep_err); + //遷移先ステータスを設定する status = FINALIZE + BOOST_CHECK_EQUAL(ret, FINALIZE); + + cout << "[533]--------------------------------------------- " << endl; + //unit_test[533] 異常系 上りスレッドsession_thread_data_map中にThreadIDなしの場合のテスト + this->session_thread_data_map.clear(); + ret = this->handle_sorryserver_disconnect(boost::this_thread::get_id(), ep_err); + //遷移先ステータスを設定する status = FINALIZE + BOOST_CHECK_EQUAL(ret, FINALIZE); + + cout << "[534]--------------------------------------------- " << endl; + //unit_test[534] 異常系 下りスレッドsession_thread_data_map中にThreadID対応のデータなし + boost::thread t_err(down_thread_func); + this->session_thread_data_map[t_err.get_id()].reset(); + ret = this->handle_sorryserver_disconnect(t_err.get_id(), ep_err); + //遷移先ステータスを設定する status = FINALIZE + BOOST_CHECK_EQUAL(ret, FINALIZE); + + cout << "[535]--------------------------------------------- " << endl; + //unit_test[535] 異常系 下りスレッドsession_thread_data_map中にThreadIDなしの場合のテスト + this->session_thread_data_map.clear(); + ret = this->handle_sorryserver_disconnect(t_err.get_id(), ep_err); + //遷移先ステータスを設定する status = FINALIZE + BOOST_CHECK_EQUAL(ret, FINALIZE); + + cout << "[536]--------------------------------------------- " << endl; + //unit_test[536] 異常系 recive_data_mapにendpointなしの場合のテスト + boost::asio::ip::tcp::endpoint ep1, ep_d1; + + thread_data_ptr data1(new session_thread_data_sessionless); + this->session_thread_data_map[boost::this_thread::get_id()] = data1; + //make 上りスレッドの場合 0->上りスレッド + data1->thread_division = THREAD_DIVISION_UP_STREAM; + //make 終了フラグがONの場合 1->on + data1->end_flag = END_FLAG_ON; + + ret = this->handle_sorryserver_disconnect(boost::this_thread::get_id(), ep1); + //遷移先ステータスを設定する status = FINALIZE + BOOST_CHECK_EQUAL(ret, FINALIZE); + + cout << "[537]--------------------------------------------- " << endl; + //unit_test[537] 上りスレッドの場合->終了フラグがONの場合 + data1->recive_data_map[ep_d1]; + ret = this->handle_sorryserver_disconnect(boost::this_thread::get_id(), ep1); + //遷移先ステータスを設定する status = CLIENT_RECV + BOOST_CHECK_EQUAL(ret, CLIENT_RECV); + + cout << "[538]--------------------------------------------- " << endl; + //unit_test[538] 上りスレッドの場合->終了フラグがOFFの場合->realserver切替中の場合->送信可能データあり + this->session_thread_data_map.clear(); + + boost::asio::ip::tcp::endpoint ep2; + + thread_data_ptr data2(new session_thread_data_sessionless); + this->session_thread_data_map[boost::this_thread::get_id()] = data2; + //make 上りスレッドの場合 0->上りスレッド + data2->thread_division = THREAD_DIVISION_UP_STREAM; + //make 終了フラグがOFFの場合 0->off + data2->end_flag = END_FLAG_OFF; + //make realserver切替中の場合 1->切替中 + data2->realserver_switch_flag = REALSERVER_SWITCH_FLAG_ON; + //make 送信可能データあり + send_status st2; + st2.status = SEND_OK; + //send_possible>0 + st2.send_possible_size = 100u; + data2->recive_data_map[ep2].send_status_list.push_back(st2); + + ret = this->handle_sorryserver_disconnect(boost::this_thread::get_id(), ep2); + //遷移先ステータスを設定する status = REALSERVER_SELECT + BOOST_CHECK_EQUAL(ret, REALSERVER_SELECT); + + cout << "[539]--------------------------------------------- " << endl; + //unit_test[539] 上りスレッドの場合->終了フラグがOFFの場合->realserver切替中の場合->送信可能データなし + this->session_thread_data_map.clear(); + + boost::asio::ip::tcp::endpoint ep3; + + thread_data_ptr data3(new session_thread_data_sessionless); + this->session_thread_data_map[boost::this_thread::get_id()] = data3; + //make 上りスレッドの場合 0->上りスレッド + data3->thread_division = THREAD_DIVISION_UP_STREAM; + //make 終了フラグがOFFの場合 0->off + data3->end_flag = END_FLAG_OFF; + //make realserver切替中の場合 1->切替中 + data3->realserver_switch_flag = REALSERVER_SWITCH_FLAG_ON; + //make 送信可能データなし + send_status st3; + //send_possible=0 + st3.send_possible_size = 0u; + data3->recive_data_map[ep3].send_status_list.push_back(st3); + + ret = this->handle_sorryserver_disconnect(boost::this_thread::get_id(), ep3); + //遷移先ステータスを設定する status = REALSERVER_SELECT + BOOST_CHECK_EQUAL(ret, REALSERVER_SELECT); + + cout << "[540]--------------------------------------------- " << endl; + //unit_test[540] 上りスレッドの場合->終了フラグがOFFの場合->realserver切替中でない場合 + this->session_thread_data_map.clear(); + + boost::asio::ip::tcp::endpoint ep4, ep_d4; + + thread_data_ptr data4(new session_thread_data_sessionless); + this->session_thread_data_map[boost::this_thread::get_id()] = data4; + //make 上りスレッドの場合 0->上りスレッド + data4->thread_division = THREAD_DIVISION_UP_STREAM; + //make 終了フラグがOFFの場合 0->off + data4->end_flag = 0; + //make realserver切替中でない場合 0->切替中でない + data4->realserver_switch_flag = REALSERVER_SWITCH_FLAG_OFF; + + data4->recive_data_map[ep_d4]; + + ret = this->handle_sorryserver_disconnect(boost::this_thread::get_id(), ep4); + //終了フラグをON + BOOST_CHECK_EQUAL(data4->end_flag, END_FLAG_ON); + //遷移先ステータスを設定する status = CLIENT_RECV + BOOST_CHECK_EQUAL(ret, CLIENT_RECV); + + cout << "[541]--------------------------------------------- " << endl; + //unit_test[541] 下りスレッドの場合->送信可能データあり + this->session_thread_data_map.clear(); + + boost::thread t5(down_thread_func); + boost::asio::ip::tcp::endpoint ep5; + + thread_data_ptr data5(new session_thread_data_sessionless); + this->session_thread_data_map[t5.get_id()] = data5; + //make 下りスレッドの場合 1->下りスレッド + data5->thread_division = THREAD_DIVISION_DOWN_STREAM; + data5->realserver_switch_flag = REALSERVER_SWITCH_FLAG_OFF; + data5->end_flag = END_FLAG_OFF; + //make 送信可能データあり + send_status st5; + st5.status = SEND_OK; + //send_possible>0 + st5.send_possible_size = 100u; + data5->recive_data_map[ep5].send_status_list.push_back(st5); + + ret = this->handle_sorryserver_disconnect(t5.get_id(), ep5); + //終了フラグをON + BOOST_CHECK_EQUAL(data5->end_flag, END_FLAG_ON); + //遷移先ステータスを設定する status = CLIENT_CONNECTION_CHECK + BOOST_CHECK_EQUAL(ret, CLIENT_CONNECTION_CHECK); + + cout << "[542]--------------------------------------------- " << endl; + //unit_test[542] 下りスレッドの場合->送信可能データなし + this->session_thread_data_map.clear(); + + boost::thread t6(down_thread_func); + boost::asio::ip::tcp::endpoint ep6; + + thread_data_ptr data6(new session_thread_data_sessionless); + this->session_thread_data_map[t6.get_id()] = data6; + //make 下りスレッドの場合 1->下りスレッド + data6->thread_division = THREAD_DIVISION_DOWN_STREAM; + data6->realserver_switch_flag = REALSERVER_SWITCH_FLAG_OFF; + data6->end_flag = END_FLAG_OFF; + //make 送信可能データなし + send_status st6; + //send_possible=0 + st6.send_possible_size = 0u; + data6->recive_data_map[ep6].send_status_list.push_back(st6); + + ret = this->handle_sorryserver_disconnect(t6.get_id(), ep6); + //終了フラグをON + BOOST_CHECK_EQUAL(data6->end_flag, END_FLAG_ON); + //遷移先ステータスを設定する status = CLIENT_DISCONNECT + BOOST_CHECK_EQUAL(ret, CLIENT_DISCONNECT); + + cout << "[543]--------------------------------------------- " << endl; + //unit_test[543] 上りスレッドと下りスレッドの場合 + this->session_thread_data_map.clear(); + + boost::thread tdown_for_get_id(down_thread_func); + + boost::asio::ip::tcp::endpoint epup; + boost::asio::ip::tcp::endpoint epdown; + + //上りスレッドの場合->終了フラグがONの場合 + thread_data_ptr dataup(new session_thread_data_sessionless); + dataup->thread_id = boost::this_thread::get_id(); + dataup->thread_division = THREAD_DIVISION_UP_STREAM; + dataup->pair_thread_id = tdown_for_get_id.get_id(); + dataup->end_flag = END_FLAG_ON; + dataup->recive_data_map[epup]; + + // 下りスレッドの場合->送信可能データあり + thread_data_ptr datadown(new session_thread_data_sessionless); + datadown->thread_id = tdown_for_get_id.get_id(); + datadown->thread_division = THREAD_DIVISION_DOWN_STREAM; + datadown->realserver_switch_flag = REALSERVER_SWITCH_FLAG_OFF; + datadown->pair_thread_id = boost::this_thread::get_id(); + //make 送信可能データあり + send_status st; + st.status = SEND_OK; + st.send_possible_size = 100u; + datadown->recive_data_map[epdown].send_status_list.push_back(st); + + this->session_thread_data_map[boost::this_thread::get_id()] = dataup; + this->session_thread_data_map[tdown_for_get_id.get_id()] = datadown; + + boost::thread_group threads; + threads.create_thread(bind(&protocol_module_sessionless_test_class::handle_sorryserver_disconnect_test_thread_func, + this, + boost::this_thread::get_id(), + epup, + CLIENT_RECV)); + threads.create_thread(bind(&protocol_module_sessionless_test_class::handle_sorryserver_disconnect_test_thread_func, + this, + tdown_for_get_id.get_id(), + epdown, + CLIENT_CONNECTION_CHECK)); + threads.join_all(); + + //終了フラグをON + BOOST_CHECK_EQUAL(datadown->end_flag, END_FLAG_ON); + +} + +void handle_sorryserver_disconnect_test_thread_func(const boost::thread::id thread_id, + const boost::asio::ip::tcp::endpoint & rs_endpoint, EVENT_TAG check_value){ + EVENT_TAG ret = this->handle_sorryserver_disconnect(thread_id, rs_endpoint); + { + boost::mutex::scoped_lock sclock(check_mutex); + BOOST_CHECK_EQUAL(ret, check_value); + } +} + +void handle_sorryserver_disconnect_test_thread(){ + cout << "[544]--------------------------------------------- " << endl; + //unit_test[544] 上りスレッドの場合->終了フラグがOFFの場合->realserver切替中の場合->送信可能データなし + EVENT_TAG ret; + boost::asio::ip::tcp::endpoint ep3; + + thread_data_ptr data3(new session_thread_data_sessionless); + + //make 上りスレッドの場合 0->上りスレッド + data3->thread_division = THREAD_DIVISION_UP_STREAM; + //make 終了フラグがOFFの場合 0->off + data3->end_flag = END_FLAG_OFF; + //make realserver切替中の場合 1->切替中 + data3->realserver_switch_flag = REALSERVER_SWITCH_FLAG_ON; + //make 送信可能データなし + send_status st3; + //send_possible=0 + st3.send_possible_size = 0u; + data3->recive_data_map[ep3].send_status_list.push_back(st3); + + { + boost::mutex::scoped_lock sclock(this->session_thread_data_map_mutex); + this->session_thread_data_map[boost::this_thread::get_id()] = data3; + } + + ret = this->handle_sorryserver_disconnect(boost::this_thread::get_id(), ep3); + { + boost::mutex::scoped_lock sclock(check_mutex); + //遷移先ステータスを設定する status = REALSERVER_SELECT + BOOST_CHECK_EQUAL(ret, REALSERVER_SELECT); + } +} + +//handle_realserver_close 馮家純 +void handle_realserver_close_test(){ + cout << "[545]--------------------------------------------- " << endl; + //unit_test[545] handle_realserver_close 戻り値が「STOP」に設定する。 + boost::asio::ip::udp::endpoint ep; + EVENT_TAG ret = this->handle_realserver_close(boost::this_thread::get_id(), ep); + BOOST_CHECK_EQUAL(ret, STOP); +} + +}; + +/*********************************************************************************** + *以下はBOOST_TEST_SUITEに入れる関数 + ***********************************************************************************/ +//protocol_module_sessionless 馮家純 +void protocol_module_sessionless_test(){ + protocol_module_sessionless_test_class obj; + obj.protocol_module_sessionless_test(); +} + +//is_tcp 馮家純 +void is_tcp_test(){ + protocol_module_sessionless_test_class obj; + obj.is_tcp_test(); +} + +//is_udp 馮家純 +void is_udp_test(){ + protocol_module_sessionless_test_class obj; + obj.is_udp_test(); +} + +//get_name 馮家純 +void get_name_test(){ + protocol_module_sessionless_test_class obj; + obj.get_name_test(); +} + +//initialize 董作方 +void initialize_test() { + protocol_module_sessionless_test_class obj; + obj.initialize_test(); +} + +//finalize 董作方 +void finalize_test() { + protocol_module_sessionless_test_class obj; + obj.finalize_test(); +} + +//is_use_sorry 馬翠翠 +void is_use_sorry_test() { + protocol_module_sessionless_test_class obj; + obj.is_use_sorry_test(); +} + +//check_parameter 馬翠翠 +void check_parameter_test() { + protocol_module_sessionless_test_class obj; + obj.check_parameter_test(); +} + +//set_parameter 馬翠翠 +void set_parameter_test() { + protocol_module_sessionless_test_class obj; + obj.set_parameter_test(); +} + +//add_parameter 馬翠翠 +void add_parameter_test() { + protocol_module_sessionless_test_class obj; + obj.add_parameter_test(); +} + +//register_schedule(tcp) 董作方 +void register_schedule_tcp_test() { + protocol_module_sessionless_test_class obj; + obj.register_schedule_tcp_test(); +} + +//handle_session_initialize 董作方 +void handle_session_initialize_test() { + protocol_module_sessionless_test_class obj; + obj.handle_session_initialize_test(); +} + +//handle_session_initialize 董作方 +void handle_session_initialize_test_thread() { + protocol_module_sessionless_test_class obj; + boost::thread_group threads; + for(int i=0; iadd(BOOST_TEST_CASE(&protocol_module_sessionless_test)); + ts->add(BOOST_TEST_CASE(&is_tcp_test)); + ts->add(BOOST_TEST_CASE(&is_udp_test)); + ts->add(BOOST_TEST_CASE(&get_name_test)); + ts->add(BOOST_TEST_CASE(&initialize_test)); + ts->add(BOOST_TEST_CASE(&finalize_test)); + ts->add(BOOST_TEST_CASE(&is_use_sorry_test)); + ts->add(BOOST_TEST_CASE(&check_parameter_test)); + ts->add(BOOST_TEST_CASE(&set_parameter_test)); + ts->add(BOOST_TEST_CASE(&add_parameter_test)); + ts->add(BOOST_TEST_CASE(®ister_schedule_tcp_test)); + ts->add(BOOST_TEST_CASE(&handle_session_initialize_test)); + ts->add(BOOST_TEST_CASE(&handle_session_initialize_test_thread)); + ts->add(BOOST_TEST_CASE(&handle_session_finalize_test)); + ts->add(BOOST_TEST_CASE(&handle_session_finalize_test_thread)); + ts->add(BOOST_TEST_CASE(&handle_accept_test)); + ts->add(BOOST_TEST_CASE(&handle_accept_test_thread)); + ts->add(BOOST_TEST_CASE(&handle_client_recv_test)); + ts->add(BOOST_TEST_CASE(&handle_client_recv_test_thread)); + ts->add(BOOST_TEST_CASE(&handle_realserver_select_tcp_test)); + ts->add(BOOST_TEST_CASE(&handle_realserver_select_tcp_test_thread)); + ts->add(BOOST_TEST_CASE(&handle_realserver_select_udp_test)); + ts->add(BOOST_TEST_CASE(&handle_realserver_connect_test)); + ts->add(BOOST_TEST_CASE(&handle_realserver_connect_test_thread)); + ts->add(BOOST_TEST_CASE(&handle_realserver_connection_fail_test)); + ts->add(BOOST_TEST_CASE(&handle_realserver_connection_fail_test_thread)); + ts->add(BOOST_TEST_CASE(&handle_realserver_send_test)); + ts->add(BOOST_TEST_CASE(&handle_realserver_send_test_thread)); + ts->add(BOOST_TEST_CASE(&handle_sorryserver_select_test)); + ts->add(BOOST_TEST_CASE(&handle_sorryserver_select_test_thread)); + ts->add(BOOST_TEST_CASE(&handle_sorryserver_connect_test)); + ts->add(BOOST_TEST_CASE(&handle_sorryserver_connect_test_thread)); + ts->add(BOOST_TEST_CASE(&handle_sorryserver_connection_fail_test)); + ts->add(BOOST_TEST_CASE(&handle_sorryserver_connection_fail_test_thread)); + ts->add(BOOST_TEST_CASE(&handle_sorryserver_send_test)); + ts->add(BOOST_TEST_CASE(&handle_sorryserver_send_test_thread)); + ts->add(BOOST_TEST_CASE(&handle_realserver_recv_tcp_test)); + ts->add(BOOST_TEST_CASE(&handle_realserver_recv_tcp_test_thread)); + ts->add(BOOST_TEST_CASE(&handle_realserver_recv_udp_test)); + ts->add(BOOST_TEST_CASE(&handle_sorryserver_recv_test)); + ts->add(BOOST_TEST_CASE(&handle_sorryserver_recv_test_thread)); + ts->add(BOOST_TEST_CASE(&handle_response_send_inform_test)); + ts->add(BOOST_TEST_CASE(&handle_client_connection_check_test)); + ts->add(BOOST_TEST_CASE(&handle_client_connection_check_test_thread)); + ts->add(BOOST_TEST_CASE(&handle_client_select_test)); + ts->add(BOOST_TEST_CASE(&handle_client_send_test)); + ts->add(BOOST_TEST_CASE(&handle_client_send_test_thread)); + ts->add(BOOST_TEST_CASE(&handle_client_disconnect_test)); + ts->add(BOOST_TEST_CASE(&handle_sorry_enable_test)); + ts->add(BOOST_TEST_CASE(&handle_sorry_enable_test_thread)); + ts->add(BOOST_TEST_CASE(&handle_sorry_disable_test)); + ts->add(BOOST_TEST_CASE(&handle_sorry_disable_test_thread)); + ts->add(BOOST_TEST_CASE(&handle_realserver_disconnect_tcp_test)); + ts->add(BOOST_TEST_CASE(&handle_realserver_disconnect_tcp_test_thread)); + ts->add(BOOST_TEST_CASE(&handle_sorryserver_disconnect_test)); + ts->add(BOOST_TEST_CASE(&handle_sorryserver_disconnect_test_thread)); + ts->add(BOOST_TEST_CASE(&handle_realserver_close_test)); + + framework::master_test_suite().add(ts); + return 0; +} diff --git a/unit_tests/module_test/protocol_module_sslid_test/Makefile b/unit_tests/module_test/protocol_module_sslid_test/Makefile new file mode 100644 index 00000000..0b4cd383 --- /dev/null +++ b/unit_tests/module_test/protocol_module_sslid_test/Makefile @@ -0,0 +1,36 @@ +# +# +# Makefile for sslid unit test frameworks. +# +# +TARGET = sslid_ut +CPP = g++ +CPPFLAGS = -g -Wall -Werror -pthread -O0 -DMAX_BUFFER_SIZE=65535 +INCLUDES = -I../../../include \ + -I../../../logger \ + -I../../../module/protocol + +LIBS = -lboost_system-gcc41-mt \ + -lboost_thread-gcc41-mt \ + -lboost_unit_test_framework-gcc41-mt + +LDFLAGS = -lrt -ldl + +SRCS = sslid_ut.cpp + +OBJS = $(SRCS:.cpp=.o) + +all: $(TARGET) + +$(TARGET): $(OBJS) + @$(CPP) $(INCLUDES) -o $@ $(OBJS) $(LIBS) + @echo "make all done!(^_^)" + +clean: + @echo "clean...(>_<)" + @rm -f $(TARGET) $(OBJS) *.o + @echo "clean done!" + +.cpp.o: + @$(CPP) $(CPPFLAGS) $(INCLUDES) -c $< + diff --git a/unit_tests/module_test/protocol_module_sslid_test/protocol_module_sslid_test.cpp b/unit_tests/module_test/protocol_module_sslid_test/protocol_module_sslid_test.cpp new file mode 100644 index 00000000..652aeba8 --- /dev/null +++ b/unit_tests/module_test/protocol_module_sslid_test/protocol_module_sslid_test.cpp @@ -0,0 +1,6398 @@ +/* + * @file protocol_module_sslid_test.cpp + * @brief protocol module sslid test file. + * + * L7VSD: Linux Virtual Server for Layer7 Load Balancing + * Copyright (C) 2009 NTT COMWARE Corporation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + **********************************************************************/ + +#include "sslid_to_be_test_file.h" +#include "../../include/protocol_module_base.h" +#include + +using namespace std; +using namespace boost; +using namespace boost::unit_test; +using namespace l7vs; + +//log stub function +char hostname[] = "127.0.0.1"; + +LOG_LEVEL_TAG stb_getloglevel(){ + //return LOG_LV_NONE; + return LOG_LV_DEBUG; +} + +LOG_LEVEL_TAG stb_getloglevel_is_none(){ + return LOG_LV_NONE; +} + +void stb_putLogFatal( const unsigned int message_id, const std::string& message, const char* file, int line){ + // cout << boost::format( "%s%d%06d %s %s" ) + // % "PM" + // % LOG_LV_FATAL + // % message_id + // % message.c_str() + // % hostname; + // cout << endl; +} +void stb_putLogError( const unsigned int message_id, const std::string& message, const char* file, int line){ + // cout << boost::format( "%s%d%06d %s %s" ) + // % "PM" + // % LOG_LV_ERROR + // % message_id + // % message.c_str() + // % hostname; + // cout << endl; +} +void stb_putLogWarn( const unsigned int message_id, const std::string& message, const char* file, int line){ + // cout << boost::format( "%s%d%06d %s %s" ) + // % "PM" + // % LOG_LV_WARN + // % message_id + // % message.c_str() + // % hostname; + // cout << endl; +} +void stb_putLogInfo( const unsigned int message_id, const std::string& message, const char* file, int line){ + // cout << boost::format( "%s%d%06d %s %s" ) + // % "PM" + // % LOG_LV_INFO + // % message_id + // % message.c_str() + // % hostname; + // cout << endl; +} +void stb_putLogDebug( const unsigned int message_id, const std::string& message, const char* file, int line){ + // cout << boost::format( "%s%d%06d %s %s" ) + // % "PM" + // % LOG_LV_DEBUG + // % message_id + // % message.c_str() + // % hostname; + // cout << endl; +} + +//new operator function +static bool new_flg = false; +void new_install(){ + new_flg = true; +} +void new_uninstall(){ + new_flg = false; +} + void* operator new[](size_t size){ + if (new_flg) + throw std::bad_alloc(); + else + { + void* p = malloc(size); + return p; + } + } +void operator delete[](void* p){ + free(p); +} + +std::list rs_list; +bool function_check_flag = false; +//RealServerリストの各操作関数 +//RealServerリスト先頭取得関数 +protocol_module_sslid::realserverlist_type::iterator rslist_begin() { + function_check_flag = true; + return rs_list.begin(); +} +//RealServerリスト末端取得関数 +protocol_module_sslid::realserverlist_type::iterator rslist_end() { + function_check_flag = true; + return rs_list.end(); +} +//RealServerリスト次要素取得関数 +protocol_module_sslid::realserverlist_type::iterator rslist_next(protocol_module_sslid::realserverlist_type::iterator itr) { + function_check_flag = true; + return ++rs_list.begin(); +} +//RealServerリストロック関数 +void rslist_lock() { + function_check_flag = true; +} +//ealServerリストアンロック関数 +void rslist_unlock() { + function_check_flag = true; +} + + +protocol_module_sslid::realserverlist_type::iterator rslist_begin_func(protocol_module_sslid::realserverlist_type * p_rs_list) +{ + return p_rs_list->begin(); +} +protocol_module_sslid::realserverlist_type::iterator rslist_end_func(protocol_module_sslid::realserverlist_type * p_rs_list) +{ + return p_rs_list->end(); +} +protocol_module_sslid::realserverlist_type::iterator rslist_next_func(protocol_module_sslid::realserverlist_type::iterator itr) +{ + return ++itr; +} +void rslist_lock_func() { +} +void rslist_unlock_func() { +} + + + +void schedule_tcp_func1(const boost::thread::id thread_id, boost::function< + std::list::iterator(void)>, boost::function::iterator(void)>, boost::function< + std::list::iterator(std::list::iterator)>, + boost::asio::ip::tcp::endpoint& rs_endpoint) { + boost::asio::ip::tcp::endpoint ep(boost::asio::ip::address::from_string( + "192.168.120.249"), 1234); + rs_endpoint = ep; + +} + +void schedule_tcp_func2(const boost::thread::id thread_id, boost::function< + std::list::iterator(void)>, boost::function::iterator(void)>, boost::function< + std::list::iterator(std::list::iterator)>, + boost::asio::ip::tcp::endpoint& rs_endpoint) { + boost::asio::ip::tcp::endpoint ep; + rs_endpoint = ep; +} + +void schedule_tcp_func3(const boost::thread::id thread_id, boost::function< + std::list::iterator(void)>, boost::function::iterator(void)>, boost::function< + std::list::iterator(std::list::iterator)>, + boost::asio::ip::tcp::endpoint& rs_endpoint, + const boost::asio::ip::tcp::endpoint& result_endpoint) { + rs_endpoint = result_endpoint; + +} + + +void* replication_pay_memory_stb(const std::string& module_name, unsigned int* data_size) +{ + *data_size = 400; + void* data_addr = malloc( *data_size * DATA_SIZE ); + memset( data_addr, 0, *data_size * DATA_SIZE ); + sslid_replication_data_header* replication_header; + replication_header=(sslid_replication_data_header *)data_addr; + strcpy(replication_header->virtualserver_ip,"192.168.120.246"); + replication_header->virtualserver_port=8888; + replication_header->offset=128*sizeof(sslid_replication_data_header); + replication_header->size=1024*sizeof(sslid_replication_data); + sslid_replication_data* replication_data=(sslid_replication_data*)((sslid_replication_data_header*)data_addr+128); + strcpy(replication_data->session_id,"0123456789695442355522125555987"); + strcpy(replication_data->realserver_ip,"192.168.120.246"); + replication_data->realserver_port=8888; + replication_data->last_time=time(0); + replication_data->valid=1; + + return data_addr; +} + +bool check_register_schedule=false; +bool check_replication_area_lock=false; +bool check_replication_area_unlock=false; + +void t_schedule(const boost::thread::id w, + protocol_module_base::rs_list_itr_func_type e, + protocol_module_base::rs_list_itr_func_type r, + protocol_module_base::rs_list_itr_next_func_type t, + boost::asio::ip::tcp::endpoint& u){ + check_register_schedule=true; +} + +void replication_area_lock_stb(){ + check_replication_area_lock=true; +} + +void replication_area_unlock_stb(){ + check_replication_area_unlock=true; +} + +//Thread function +void up_thread_func() { +} +void down_thread_func() { +} + +class sslid_session_data_processor_stub : public sslid_session_data_processor +{ + public: + sslid_session_data_processor_stub( + int maxlist, + int timeout, + sslid_replication_data_processor* replication_data_processor, + getloglevel_func_type ingetloglevel, + logger_func_type inputLogFatal, + logger_func_type inputLogError, + logger_func_type inputLogWarn, + logger_func_type inputLogInfo, + logger_func_type inputLogDebug ): + sslid_session_data_processor(maxlist, + timeout, + replication_data_processor, + ingetloglevel, + inputLogFatal, + inputLogError, + inputLogWarn, + inputLogInfo, + inputLogDebug){} + + ~sslid_session_data_processor_stub(){} + + std::map& get_session_endpoint_map() + { + return session_endpoint_map; + } + + std::map& get_session_lasttime_map() + { + return session_lasttime_map; + } + + std::multimap& get_lasttime_session_map() + { + return lasttime_session_map; + } + +}; + +class sslid_replication_data_processor_stub : public sslid_replication_data_processor +{ + public: + sslid_replication_data_processor_stub( + int maxlist, + char* sslid_replication_area_begain, + int sslid_replication_area_size, + const boost::asio::ip::tcp::endpoint& virtual_service_endpoint, + getloglevel_func_type ingetloglevel, + logger_func_type inputLogFatal, + logger_func_type inputLogError, + logger_func_type inputLogWarn, + logger_func_type inputLogInfo, + logger_func_type inputLogDebug ): + sslid_replication_data_processor(maxlist, + sslid_replication_area_begain, + sslid_replication_area_size, + virtual_service_endpoint, + ingetloglevel, + inputLogFatal, + inputLogError, + inputLogWarn, + inputLogInfo, + inputLogDebug){} + + ~sslid_replication_data_processor_stub(){} + + sslid_replication_data*& get_replication_area() + { + return replication_area; + } + + std::deque& get_temp_list() + { + return temp_list; + } +}; + +//test class +class protocol_module_sslid_test_class: public protocol_module_sslid { + public: + boost::mutex check_mutex; + + void set_replication_data_processor(sslid_replication_data_processor* p) + { + this->replication_data_processor = p; + } + + void set_session_data_processor(sslid_session_data_processor* p) + { + this->session_data_processor = p; + } + + void set_reschedule(int i) + { + this->reschedule = i; + } + + sslid_replication_data_processor*& get_replication_data_processor() + { + return this->replication_data_processor; + } + + void set_schedule_tcp(tcp_schedule_func_type p) + { + this->schedule_tcp = p; + } + void install_stb_log_func() { + typedef boost::function log_func_type; + + boost::function getloglevel = &stb_getloglevel; + log_func_type putLogFatal = &stb_putLogFatal; + log_func_type putLogError = &stb_putLogError; + log_func_type putLogWarn = &stb_putLogWarn; + log_func_type putLogInfo = &stb_putLogInfo; + log_func_type putLogDebug = &stb_putLogDebug; + this->init_logger_functions(getloglevel, putLogFatal, putLogError, + putLogWarn, putLogInfo, putLogDebug); + } + + void install_stb_replication_func(){ + boost::function< void* ( const std::string&, unsigned int* ) > inreplication_pay_memory=&replication_pay_memory_stb; + boost::function inlock_func=&replication_area_lock_stb; + boost::function inunlock_func=&replication_area_unlock_stb; + boost::asio::ip::tcp::endpoint tcp_ep; + boost::asio::ip::udp::endpoint udp_ep; + this->init_replication_functions(inreplication_pay_memory,inlock_func,inunlock_func,tcp_ep,udp_ep); + } + + protocol_module_sslid_test_class() { + install_stb_log_func(); + } + + //protocol_module_sslid + void protocol_module_sslid_test() { + + cout << "[1]--------------------------------------------- " << endl; + //unit_test[1] モジュール名が"sslid"に設定する。 + protocol_module_sslid obj; + BOOST_CHECK_EQUAL(obj.get_name(), "sslid"); + + cout << "[2]--------------------------------------------- " << endl; + //unit_test[2] sslidのインスタンスを生成する。 + protocol_module_sslid* p = new protocol_module_sslid(); + BOOST_CHECK_EQUAL(p->get_name(), "sslid"); + delete p; + } + + //~protocol_module_sslid + + //is_tcp + void is_tcp_test(){ + cout << "[3]--------------------------------------------- " << endl; + //unit_test[3] is_tcp()メソッドのテスト,正常系で必ずTRUEを返す + BOOST_CHECK(this->is_tcp()); + } + + //is_udp + void is_udp_test(){ + cout << "[4]--------------------------------------------- " << endl; + //unit_test[4] is_udp()メソッドのテスト,正常系で必ずFALSEを返す + BOOST_CHECK(!this->is_udp()); + } + + //get_name + void get_name_test(){ + cout << "[5]--------------------------------------------- " << endl; + //unit_test[5] get_name()メソッドのテスト,正常系で必ず"sslid"を返す + BOOST_CHECK_EQUAL(this->get_name(), "sslid"); + } + + //initialize + void initialize_test() { + boost::function::iterator(void)> inrslist_begin = + rslist_begin; + boost::function::iterator(void)> inrslist_end = + rslist_end; + boost::function::iterator(std::list::iterator)> inrslist_next = + rslist_next; + std::list::iterator itr; + boost::function inlist_lock = rslist_lock; + boost::function inlist_unlock = rslist_unlock; + + cout << "[6]--------------------------------------------- " << endl; + // unit_test[6] initialize 初期値がある場合 + this->initialize(inrslist_begin, inrslist_end, inrslist_next, + inlist_lock, inlist_unlock); + BOOST_CHECK_EQUAL(this->rs_list_begin, rslist_begin); + function_check_flag = false; + this->rs_list_begin(); + BOOST_CHECK(function_check_flag); + BOOST_CHECK_EQUAL(this->rs_list_end, rslist_end); + function_check_flag = false; + this->rs_list_end(); + BOOST_CHECK(function_check_flag); + BOOST_CHECK_EQUAL(this->rs_list_next, rslist_next); + function_check_flag = false; + this->rs_list_next(itr); + BOOST_CHECK(function_check_flag); + BOOST_CHECK_EQUAL(this->rs_list_lock, rslist_lock); + function_check_flag = false; + this->rs_list_lock(); + BOOST_CHECK(function_check_flag); + BOOST_CHECK_EQUAL(this->rs_list_unlock, rslist_unlock); + function_check_flag = false; + this->rs_list_unlock(); + BOOST_CHECK(function_check_flag); + + cout << "[7]--------------------------------------------- " << endl; + // unit_test[7] initialize 初期値が空の場合 + this->initialize(NULL, NULL, NULL, NULL, NULL); + BOOST_CHECK(!this->rs_list_begin); + BOOST_CHECK(!this->rs_list_end); + BOOST_CHECK(!this->rs_list_next); + BOOST_CHECK(!this->rs_list_lock); + BOOST_CHECK(!this->rs_list_unlock); + } + + //finalize + void finalize_test() { + boost::function::iterator(void)> inrslist_begin = + rslist_begin; + boost::function::iterator(void)> inrslist_end = + rslist_end; + boost::function::iterator(std::list::iterator)> inrslist_next = + rslist_next; + boost::function inlist_lock = rslist_lock; + boost::function inlist_unlock = rslist_unlock; + char* sslid_replication_area_begain = new char[10]; + int sslid_replication_area_size = 0; + boost::asio::ip::tcp::endpoint virtual_service_endpoint; + getloglevel_func_type ingetloglevel = stb_getloglevel; + logger_func_type inputLogFatal = stb_putLogFatal; + logger_func_type inputLogError = stb_putLogError; + logger_func_type inputLogWarn = stb_putLogWarn; + logger_func_type inputLogInfo = stb_putLogInfo; + logger_func_type inputLogDebug = stb_putLogDebug; + + cout << "[8]--------------------------------------------- " << endl; + // unit_test[8] 初期値がある場合 + this->initialize(inrslist_begin, inrslist_end, inrslist_next, + inlist_lock, inlist_unlock); + this->finalize(); + BOOST_CHECK(!this->getloglevel); + BOOST_CHECK(!this->putLogFatal); + BOOST_CHECK(!this->putLogError); + BOOST_CHECK(!this->putLogWarn); + BOOST_CHECK(!this->putLogInfo); + BOOST_CHECK(!this->putLogDebug); + BOOST_CHECK(!this->rs_list_begin); + BOOST_CHECK(!this->rs_list_end); + BOOST_CHECK(!this->rs_list_next); + BOOST_CHECK(!this->rs_list_lock); + BOOST_CHECK(!this->rs_list_unlock); + BOOST_CHECK(!this->replication_pay_memory); + BOOST_CHECK(!this->replication_area_lock); + BOOST_CHECK(!this->replication_area_unlock); + BOOST_CHECK(!this->schedule_tcp); + BOOST_CHECK(!this->schedule_udp); + BOOST_CHECK_EQUAL(this->timeout, 0); + BOOST_CHECK_EQUAL(this->maxlist, 0); + BOOST_CHECK_EQUAL(this->reschedule, 0); + BOOST_CHECK(this->session_data_processor == NULL); + BOOST_CHECK(this->replication_data_processor == NULL); + + cout << "[9]--------------------------------------------- " << endl; + // unit_test[9] 初期値が空の場合 + this->getloglevel = stb_getloglevel; + this->putLogFatal = stb_putLogFatal; + this->putLogError = stb_putLogError; + this->putLogWarn = stb_putLogWarn; + this->putLogInfo = stb_putLogInfo; + this->putLogDebug = stb_putLogDebug; + this->rs_list_begin = NULL; + this->rs_list_end = NULL; + this->rs_list_next = NULL; + this->rs_list_lock = NULL; + this->rs_list_unlock = NULL; + this->replication_pay_memory = NULL; + this->replication_area_lock = NULL; + replication_area_unlock = NULL; + this->schedule_tcp = NULL; + this->schedule_udp = NULL; + this->timeout = 10; + this->maxlist = 10; + this->reschedule = 10; + this->replication_data_processor + = new sslid_replication_data_processor(this->maxlist, + sslid_replication_area_begain, + sslid_replication_area_size, virtual_service_endpoint, + ingetloglevel, inputLogFatal, inputLogError, + inputLogWarn, inputLogInfo, inputLogDebug); + this->session_data_processor = new sslid_session_data_processor( + this->maxlist, this->timeout, this->replication_data_processor, + ingetloglevel, inputLogFatal, inputLogError, inputLogWarn, + inputLogInfo, inputLogDebug); + this->finalize(); + BOOST_CHECK(!this->getloglevel); + BOOST_CHECK(!this->putLogFatal); + BOOST_CHECK(!this->putLogError); + BOOST_CHECK(!this->putLogWarn); + BOOST_CHECK(!this->putLogInfo); + BOOST_CHECK(!this->putLogDebug); + BOOST_CHECK(!this->rs_list_begin); + BOOST_CHECK(!this->rs_list_end); + BOOST_CHECK(!this->rs_list_next); + BOOST_CHECK(!this->rs_list_lock); + BOOST_CHECK(!this->rs_list_unlock); + BOOST_CHECK(!this->replication_pay_memory); + BOOST_CHECK(!this->replication_area_lock); + BOOST_CHECK(!this->replication_area_unlock); + BOOST_CHECK(!this->schedule_tcp); + BOOST_CHECK(!this->schedule_udp); + BOOST_CHECK_EQUAL(this->timeout, 0); + BOOST_CHECK_EQUAL(this->maxlist, 0); + BOOST_CHECK_EQUAL(this->reschedule, 0); + BOOST_CHECK(this->session_data_processor == NULL); + BOOST_CHECK(this->replication_data_processor == NULL); + delete[] sslid_replication_area_begain; + } + + //is_use_sorry + void is_use_sorry_test(){ + cout << "[10]--------------------------------------------- " << endl; + //unit_test[10] is_use_sorry()メソッドのテスト,正常系で必ずFALSEを返す + BOOST_CHECK(!this->is_use_sorry()); + } + + //check_parameter + void check_parameter_test(){ + std::vector args; + + cout << "[11]--------------------------------------------- " << endl; + //unit_test[11] オプション文字列が存在しない場合, チェック結果フラグにTRUEを設定する + protocol_module_base::check_message_result check_message; + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,true); + + cout << "[12]--------------------------------------------- " << endl; + //unit_test[12] オプション文字列 = "-T", timeout設定フラグ = OFFの場合,チェック結果フラグにTRUEを設定する + args.push_back("-T"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,true); + + cout << "[13]--------------------------------------------- " << endl; + //unit_test[13] オプション文字列 = "--T", timeout設定フラグ = OFFの場合,チェック結果フラグにFALSEを設定する、チェック結果メッセージに"Option error."を設定する + args.clear(); + args.push_back("--T"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL(check_message.message,"Option error."); + + cout << "[14]--------------------------------------------- " << endl; + //unit_test[14] オプション文字列 = "-T -T", timeout設定フラグ = OFFの場合,チェック結果フラグにTRUEを設定する + args.clear(); + args.push_back("-T"); + args.push_back("-T"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,true); + + cout << "[15]--------------------------------------------- " << endl; + //unit_test[15] チェック結果フラグにFALSEを設定する,チェック結果メッセージに"'-T/--timeout' option value '2ewqt' is not numeric character."を設定する + //unit_test[15] data test:オプション文字列 = "-T 2ewqt" timeout設定フラグ = OFFの場合 + args.clear(); + args.push_back("-T"); + args.push_back("2ewqt"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL(check_message.message,"'-T/--timeout' option value '2ewqt' is not numeric character."); + + cout << "[16]--------------------------------------------- " << endl; + //unit_test[16] チェック結果フラグにFALSEを設定する,チェック結果メッセージに"'-T/--timeout' option value '$@#' is not numeric character."を設定する + //unit_test[16] data test:オプション文字列 = "-T $@#" timeout設定フラグ = OFFの場合 + args.clear(); + args.push_back("-T"); + args.push_back("$@#"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL(check_message.message,"'-T/--timeout' option value '$@#' is not numeric character."); + + cout << "[17]--------------------------------------------- " << endl; + //unit_test[17] チェック結果フラグにFALSEを設定する,チェック結果メッセージに"'-T/--timeout' option value '2148583647' is too large."を設定する + //unit_test[17] test data:オプション文字列 = "-T 2148583647" timeout設定フラグ = OFF の場合 + args.clear(); + args.push_back("-T"); + args.push_back("2148583647"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL(check_message.message,"'-T/--timeout' option value '2148583647' is too large."); + + cout << "[18]--------------------------------------------- " << endl; + //unit_test[18] チェック結果フラグにTRUEを設定する + //unit_test[18] test data:オプション文字列 = "-T 2000" timeout設定フラグ = OFF の場合 + args.clear(); + args.push_back("-T"); + args.push_back("2000"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,true); + + cout << "[19]--------------------------------------------- " << endl; + //unit_test[19] チェック結果フラグにTRUEを設定する + //unit_test[19] test data:オプション文字列 = "-T 2147483647" timeout設定フラグ = OFF の場合 + args.clear(); + args.push_back("-T"); + args.push_back("2147483647"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,true); + + cout << "[20]--------------------------------------------- " << endl; + //unit_test[20] チェック結果フラグにFALSEを設定する,チェック結果メッセージに"Cannot set multiple option '-T/timeout'"を設定する + //unit_test[20] test data:オプション文字列 = "-T 2000 -T" timeout設定フラグ = ON の場合 + args.clear(); + args.push_back("-T"); + args.push_back("2000"); + args.push_back("-T"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL("Cannot set multiple option '-T/--timeout'.",check_message.message); + + cout << "[21]--------------------------------------------- " << endl; + //unit_test[21] チェック結果フラグにFALSEを設定する,チェック結果メッセージに"Cannot set multiple option '-T/timeout'"を設定する + //unit_test[21] test data:オプション文字列 = "-T 2000 -T 2000" timeout設定フラグ = ON の場合 + args.clear(); + args.push_back("-T"); + args.push_back("2000"); + args.push_back("-T"); + args.push_back("2000"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL("Cannot set multiple option '-T/--timeout'.",check_message.message); + + cout << "[22]--------------------------------------------- " << endl; + //unit_test[22] チェック結果フラグにFALSEを設定する,チェック結果メッセージに"Cannot set multiple option '-T/timeout'"を設定する + //unit_test[22] test data:オプション文字列 = "-T -T 20 -T" timeout設定フラグ = ON の場合 + args.clear(); + args.push_back("-T"); + args.push_back("-T"); + args.push_back("20"); + args.push_back("-T"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL("Cannot set multiple option '-T/--timeout'.",check_message.message); + + cout << "[23]--------------------------------------------- " << endl; + //unit_test[23] オプション文字列 = "--timeout" timeout設定フラグ = OFF 次要素が存在しない場合,チェック結果フラグにTRUEを設定する + args.clear(); + args.push_back("--timeout"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,true); + + cout << "[24]--------------------------------------------- " << endl; + //unit_test[24] オプション文字列 = "--timeout --timeout" の場合,チェック結果フラグにTRUEを設定する + args.clear(); + args.push_back("--timeout"); + args.push_back("--timeout"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,true); + + cout << "[25]--------------------------------------------- " << endl; + //unit_test[25] チェック結果フラグにFALSEを設定する,チェック結果メッセージに"'-T/--timeout' option value '2ewqt' is not numeric character."を設定する + //unit_test[25] test data:オプション文字列 = "--timeout 2ewqt" timeout設定フラグ = OFF の場合 + args.clear(); + args.push_back("--timeout"); + args.push_back("2ewqt"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL(check_message.message,"'-T/--timeout' option value '2ewqt' is not numeric character."); + + cout << "[26]--------------------------------------------- " << endl; + //unit_test[26] チェック結果フラグにFALSEを設定する,チェック結果メッセージに"'-T/--timeout' option value '2148583647' is too large."を設定する + //unit_test[26] test data:オプション文字列 = "--timeout 2148583647" timeout設定フラグ = OFF の場合 + args.clear(); + args.push_back("--timeout"); + args.push_back("2148583647"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL(check_message.message,"'-T/--timeout' option value '2148583647' is too large."); + + cout << "[27]--------------------------------------------- " << endl; + //unit_test[27] チェック結果フラグにTRUEを設定する + //unit_test[27] test data:オプション文字列 = "--timeout 2000" timeout設定フラグ = OFF の場合 + args.clear(); + args.push_back("--timeout"); + args.push_back("2000"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,true); + + cout << "[28]--------------------------------------------- " << endl; + //unit_test[28] チェック結果フラグにTRUEを設定する + //unit_test[28] test data:オプション文字列 = "--timeout 2147483647" timeout設定フラグ = OFFの場合 + args.clear(); + args.push_back("--timeout"); + args.push_back("2147483647"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,true); + + cout << "[29]--------------------------------------------- " << endl; + //unit_test[29] チェック結果フラグにFALSEを設定する,チェック結果メッセージに"Cannot set multiple option '-T/timeout'"を設定する + //unit_test[29] test data:オプション文字列 = "--timeout 2000 --timeout" timeout設定フラグ = ONの場合 + args.clear(); + args.push_back("--timeout"); + args.push_back("2000"); + args.push_back("--timeout"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL("Cannot set multiple option '-T/--timeout'.",check_message.message); + + cout << "[30]--------------------------------------------- " << endl; + //unit_test[30] チェック結果フラグにFALSEを設定する,チェック結果メッセージに"Cannot set multiple option '-T/timeout'"を設定する + //unit_test[30] test data:オプション文字列 = "--timeout 2000 --timeout 2000" timeout設定フラグ = ONの場合 + args.clear(); + args.push_back("--timeout"); + args.push_back("2000"); + args.push_back("--timeout"); + args.push_back("2000"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL("Cannot set multiple option '-T/--timeout'.",check_message.message); + + cout << "[31]--------------------------------------------- " << endl; + //unit_test[31] チェック結果フラグにFALSEを設定する,チェック結果メッセージに"Cannot set multiple option '-T/timeout'"を設定する + //unit_test[31] test data:オプション文字列 = "--timeout --timeout 2000 --timeout" timeout設定フラグ = ONの場合 + args.clear(); + args.push_back("--timeout"); + args.push_back("--timeout"); + args.push_back("2000"); + args.push_back("--timeout"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL("Cannot set multiple option '-T/--timeout'.",check_message.message); + + cout << "[32]--------------------------------------------- " << endl; + //unit_test[32] オプション文字列 = "-M" maxlist設定フラグ = OFFの場合,チェック結果フラグにTRUEを設定する + args.clear(); + args.push_back("-M"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(true,check_message.flag); + + cout << "[33]--------------------------------------------- " << endl; + //unit_test[33] オプション文字列 = "-M -M" maxlist設定フラグ = OFFの場合,チェック結果フラグにTRUEを設定する + args.clear(); + args.push_back("-M"); + args.push_back("-M"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,true); + + cout << "[34]--------------------------------------------- " << endl; + //unit_test[34] チェック結果フラグにFALSEを設定する,チェック結果メッセージに"'-M/--maxlist' option value '1st' is not numeric character."を設定する + //unit_test[34] test data:オプション文字列 = "-M 1st" maxlist設定フラグ = OFFの場合 + args.clear(); + args.push_back("-M"); + args.push_back("1st"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL(check_message.message,"'-M/--maxlist' option value '1st' is not numeric character."); + + cout << "[35]--------------------------------------------- " << endl; + //unit_test[35] チェック結果フラグにFALSEを設定する,チェック結果メッセージに"'-M/--maxlist' option value '2148583647' is too large."を設定する + //unit_test[35] test data:オプション文字列 = "-M 2148583647" maxlist設定フラグ = OFFの場合 + args.clear(); + args.push_back("-M"); + args.push_back("2148583647"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL(check_message.message,"'-M/--maxlist' option value '2148583647' is too large."); + + cout << "[36]--------------------------------------------- " << endl; + //unit_test[36] チェック結果フラグにTRUEを設定する + //unit_test[36] test data:オプション文字列 = "-M 100" maxlist設定フラグ = OFFの場合 + args.clear(); + args.push_back("-M"); + args.push_back("100"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,true); + + cout << "[37]--------------------------------------------- " << endl; + //unit_test[37] チェック結果フラグにTRUEを設定する + //unit_test[37] test data:オプション文字列 = "-M 2147483647" maxlist設定フラグ = OFFの場合 + args.clear(); + args.push_back("-M"); + args.push_back("2147483647"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,true); + + cout << "[38]--------------------------------------------- " << endl; + //unit_test[38] チェック結果フラグにFALSEを設定する,チェック結果メッセージに"Cannot set multiple option '-M/maxlist'"を設定する + //unit_test[38] test data:オプション文字列 = "-M 100 -M"の場合 + args.clear(); + args.push_back("-M"); + args.push_back("100"); + args.push_back("-M"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL("Cannot set multiple option '-M/--maxlist'.",check_message.message); + + cout << "[39]--------------------------------------------- " << endl; + //unit_test[39] チェック結果フラグにFALSEを設定する,チェック結果メッセージに"Cannot set multiple option '-M/maxlist'"を設定する + //unit_test[39] test data:オプション文字列 = "-M 100 -M 100"の場合 + args.clear(); + args.push_back("-M"); + args.push_back("100"); + args.push_back("-M"); + args.push_back("100"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL("Cannot set multiple option '-M/--maxlist'.",check_message.message); + + cout << "[40]--------------------------------------------- " << endl; + //unit_test[40] チェック結果フラグにFALSEを設定する,チェック結果メッセージに"Cannot set multiple option '-M/maxlist'"を設定する + //unit_test[40] test data:オプション文字列 = "-M -M 20 -M"の場合 + args.clear(); + args.push_back("-M"); + args.push_back("-M"); + args.push_back("20"); + args.push_back("-M"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL("Cannot set multiple option '-M/--maxlist'.",check_message.message); + + cout << "[41]--------------------------------------------- " << endl; + //unit_test[41] チェック結果フラグにTRUEを設定する + //unit_test[41] test data:オプション文字列 = "--maxlist" maxlist設定フラグ = OFFの場合 + args.clear(); + args.push_back("--maxlist"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,true); + + cout << "[42]--------------------------------------------- " << endl; + //unit_test[42] チェック結果フラグにFALSEを設定する,チェック結果メッセージに"'-M/--maxlist option' value '1st' is not numeric character."を設定する + //unit_test[42] test data:オプション文字列 = "--maxlist 1st" maxlist設定フラグ = OFFの場合 + args.clear(); + args.push_back("--maxlist"); + args.push_back("1st"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL(check_message.message,"'-M/--maxlist' option value '1st' is not numeric character."); + + cout << "[43]--------------------------------------------- " << endl; + //unit_test[43] チェック結果フラグにFALSEを設定する,チェック結果メッセージに"'-M/--maxlist option' value '2148583647' is too large."を設定する + //unit_test[43] test data:オプション文字列 = "--maxlist 2148583647" maxlist設定フラグ = OFFの場合 + args.clear(); + args.push_back("--maxlist"); + args.push_back("2148583647"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL(check_message.message,"'-M/--maxlist' option value '2148583647' is too large."); + + cout << "[44]--------------------------------------------- " << endl; + //unit_test[44] チェック結果フラグにTRUEを設定する + //unit_test[44] test data:オプション文字列 = "--maxlist 100" maxlist設定フラグ = OFFの場合 + args.clear(); + args.push_back("--maxlist"); + args.push_back("100"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,true); + + cout << "[45]--------------------------------------------- " << endl; + //unit_test[45] チェック結果フラグにTRUEを設定する + //unit_test[45] test data:オプション文字列 = "--maxlist 2147483647" maxlist設定フラグ = OFFの場合 + args.clear(); + args.push_back("--maxlist"); + args.push_back("2147483647"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,true); + + + cout << "[46]--------------------------------------------- " << endl; + //unit_test[46] チェック結果メッセージに"Cannot set multiple option '-M/maxlist'"を設定する + //unit_test[46] test data:オプション文字列 = "--maxlist 100 --maxlist"の場合 + args.clear(); + args.push_back("--maxlist"); + args.push_back("100"); + args.push_back("--maxlist"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL("Cannot set multiple option '-M/--maxlist'.",check_message.message); + + cout << "[47]--------------------------------------------- " << endl; + //unit_test[47] チェック結果メッセージに"Cannot set multiple option '-M/maxlist'"を設定する + //unit_test[47] test data:オプション文字列 = "--maxlist 100 --maxlist"の場合 + args.clear(); + args.push_back("--maxlist"); + args.push_back("100"); + args.push_back("--maxlist"); + args.push_back("100"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL("Cannot set multiple option '-M/--maxlist'.",check_message.message); + + cout << "[48]--------------------------------------------- " << endl; + //unit_test[48] チェック結果メッセージに"Cannot set multiple option '-M/maxlist'"を設定する + //unit_test[48] test data:オプション文字列 = "--maxlist --maxlist 100 --maxlist"の場合 + args.clear(); + args.push_back("--maxlist"); + args.push_back("--maxlist"); + args.push_back("100"); + args.push_back("--maxlist"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL("Cannot set multiple option '-M/--maxlist'.",check_message.message); + + cout << "[49]--------------------------------------------- " << endl; + //unit_test[49] チェック結果フラグにFALSEを設定する,チェック結果メッセージに"You have to choose either of reschedule or no_rescheduleを設定する + //unit_test[49] test data:オプション文字列 ="-N -R"の場合 + args.clear(); + args.push_back("-N"); + args.push_back("-R"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL("You have to choose either of reschedule or no-reschedule.",check_message.message); + + cout << "[50]--------------------------------------------- " << endl; + //unit_test[50] オプション文字列 ="-N",reschedule設定フラグ = ON,チェック結果フラグにFALSEを設定する,チェック結果メッセージに"You have to choose either of reschedule or no_rescheduleを設定する + //unit_test[50] test data:オプション文字列 ="-R -N"の場合 + args.clear(); + args.push_back("-R"); + args.push_back("-N"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL("You have to choose either of reschedule or no-reschedule.",check_message.message); + + cout << "[51]--------------------------------------------- " << endl; + //unit_test[51] オプション文字列 ="-T -M -R -N"の場合,チェック結果フラグにFALSEを設定する、チェック結果メッセージに"You have to choose either of reschedule or no_rescheduleを設定する + args.clear(); + args.push_back("-T"); + args.push_back("-M"); + args.push_back("-R"); + args.push_back("-N"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL("You have to choose either of reschedule or no-reschedule.",check_message.message); + + cout << "[52]--------------------------------------------- " << endl; + //unit_test[52] オプション文字列 ="-M -T -N -R"の場合,チェック結果フラグにFALSEを設定する、チェック結果メッセージに"You have to choose either of reschedule or no_rescheduleを設定する + args.clear(); + args.push_back("-M"); + args.push_back("-T"); + args.push_back("-N"); + args.push_back("-R"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL("You have to choose either of reschedule or no-reschedule.",check_message.message); + + cout << "[53]--------------------------------------------- " << endl; + //unit_test[53] オプション文字列 ="-T 2000 -M 100 -R"の場合,チェック結果フラグにTRUEを設定する + args.clear(); + args.push_back("-T"); + args.push_back("2000"); + args.push_back("-M"); + args.push_back("100"); + args.push_back("-R"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,true); + + cout << "[54]--------------------------------------------- " << endl; + //unit_test[54] オプション文字列 ="--timeout 2000 -M 100 -R"の場合,チェック結果フラグにTRUEを設定する + args.clear(); + args.push_back("--timeout"); + args.push_back("2000"); + args.push_back("-M"); + args.push_back("100"); + args.push_back("-R"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,true); + + cout << "[55]--------------------------------------------- " << endl; + //unit_test[55] オプション文字列 ="-T 2000 --maxlist 100 -R"の場合,チェック結果フラグにTRUEを設定する + args.clear(); + args.push_back("-T"); + args.push_back("2000"); + args.push_back("--maxlist"); + args.push_back("100"); + args.push_back("-R"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,true); + + cout << "[56]--------------------------------------------- " << endl; + //unit_test[56] オプション文字列 ="--timeout 2000 --maxlist 100 -R"の場合,チェック結果フラグにTRUEを設定する + args.clear(); + args.push_back("--timeout"); + args.push_back("2000"); + args.push_back("--maxlist"); + args.push_back("100"); + args.push_back("-R"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,true); + + cout << "[57]--------------------------------------------- " << endl; + //unit_test[57] チェック結果フラグにFALSEを設定する,チェック結果メッセージに"You have to choose either of reschedule or no_rescheduleを設定する + //unit_test[57] test data:オプション文字列 ="-T 2000 --maxlist 100 -R -N"の場合 + args.clear(); + args.push_back("-T"); + args.push_back("2000"); + args.push_back("--maxlist"); + args.push_back("100"); + args.push_back("-R"); + args.push_back("-N"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL("You have to choose either of reschedule or no-reschedule.",check_message.message); + + cout << "[58]--------------------------------------------- " << endl; + //unit_test[58] オプション文字列 = 上記以外の場合,チェック結果フラグにFALSEを設定する,チェック結果メッセージに"Option error"を設定する + args.clear(); + args.push_back("-A"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL("Option error.",check_message.message); + } + + //set_parameter + void set_parameter_test(){ + cout << "[59]--------------------------------------------- " << endl; + //unit_test[59] チェック結果フラグにTRUEを設定する,timeoutに3600を設定する,maxlistに1024を設定する,rescheduleに0を設定する,sessionデータをreplication_areaから回復する + //unit_test[59] test data:オプション文字列が存在しない,timeout設定フラグ = OFF,maxlist設定フラグ = OFF,reschedule設定フラグ = OFFの場合 + protocol_module_base::check_message_result check_message; + vector args; + install_stb_replication_func(); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,true); + BOOST_CHECK_EQUAL(this->timeout,3600); + BOOST_CHECK_EQUAL(this->maxlist,1024); + BOOST_CHECK_EQUAL(this->reschedule,0); + BOOST_CHECK(this->session_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->maxlist=111; + this->reschedule=111; + + cout << "[60]--------------------------------------------- " << endl; + //unit_test[60] チェック結果フラグにTRUEを設定する,timeoutに3600を設定する,maxlistに1024を設定する,rescheduleに0を設定する,sessionデータをreplication_areaから回復する + //unit_test[60] test data:オプション文字列 = "-T",timeout設定フラグ = OFF,maxlist設定フラグ = OFF,reschedule設定フラグ = OFFの場合 + args.clear(); + args.push_back("-T"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,true); + BOOST_CHECK_EQUAL(this->timeout,3600); + BOOST_CHECK_EQUAL(this->maxlist,1024); + BOOST_CHECK_EQUAL(this->reschedule,0); + BOOST_CHECK(this->session_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->maxlist=111; + this->reschedule=111; + + cout << "[61]--------------------------------------------- " << endl; + //unit_test[61] チェック結果フラグにFALSEを設定する,チェック結果メッセージに"Option error"を設定する,sessionデータをreplication_areaから回復する + //unit_test[61] test data:オプション文字列 = "--T",timeout設定フラグ = OFF,maxlist設定フラグ = OFF,reschedule設定フラグ = OFFの場合 + args.clear(); + args.push_back("--T"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL("Option error.",check_message.message); + BOOST_CHECK(this->session_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->maxlist=111; + this->reschedule=111; + + cout << "[62]--------------------------------------------- " << endl; + //unit_test[62] チェック結果フラグにTRUEを設定する,timeoutに3600を設定する,maxlistに1024を設定する,rescheduleに0を設定する,sessionデータをreplication_areaから回復する + //unit_test[62] test data:オプション文字列 = "-T -T",timeout設定フラグ = OFF,maxlist設定フラグ = OFF,reschedule設定フラグ = OFFの場合 + args.clear(); + args.push_back("-T"); + args.push_back("-T"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,true); + BOOST_CHECK_EQUAL(this->timeout,3600); + BOOST_CHECK_EQUAL(this->maxlist,1024); + BOOST_CHECK_EQUAL(this->reschedule,0); + BOOST_CHECK(this->session_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->maxlist=111; + this->reschedule=111; + + cout << "[63]--------------------------------------------- " << endl; + //unit_test[63] チェック結果フラグにFALSEを設定する,チェック結果メッセージに"'-T/--timeout' option value '2ewqt' is not numeric character."を設定する,sessionデータをreplication_areaから回復する + //unit_test[63] test data:オプション文字列 = "-T 2ewqt",timeout設定フラグ = OFF,maxlist設定フラグ = OFF,reschedule設定フラグ = OFFの場合 + args.clear(); + args.push_back("-T"); + args.push_back("2ewqt"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL(check_message.message,"'-T/--timeout' option value '2ewqt' is not numeric character."); + BOOST_CHECK(this->session_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->maxlist=111; + this->reschedule=111; + + cout << "[64]--------------------------------------------- " << endl; + //unit_test[64] チェック結果フラグにFALSEを設定する,チェック結果メッセージに"'-T/--timeout option' value '$@#' is not numeric character."を設定する,sessionデータをreplication_areaから回復する + //unit_test[64] test data:オプション文字列 = "-T $@#",timeout設定フラグ = OFF,maxlist設定フラグ = OFF,reschedule設定フラグ = OFFの場合 + args.clear(); + args.push_back("-T"); + args.push_back("$@#"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL(check_message.message,"'-T/--timeout' option value '$@#' is not numeric character."); + BOOST_CHECK(this->session_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->maxlist=111; + this->reschedule=111; + + cout << "[65]--------------------------------------------- " << endl; + //unit_test[65] チェック結果フラグにFALSEを設定する,チェック結果メッセージに"'-T/--timeout' option value '2148583647' is too large."を設定する,sessionデータをreplication_areaから回復する + //unit_test[65] test data:オプション文字列 = "-T 2148583647"の場合 + args.clear(); + args.push_back("-T"); + args.push_back("2148583647"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL(check_message.message,"'-T/--timeout' option value '2148583647' is too large."); + this->timeout=111; + this->maxlist=111; + this->reschedule=111; + + cout << "[66]--------------------------------------------- " << endl; + //unit_test[66] チェック結果フラグにTRUEを設定する,timeoutに2000を設定する,maxlistに1024を設定する,rescheduleに0を設定する,sessionデータをreplication_areaから回復する + //unit_test[66] test data:オプション文字列 = "-T 2000",timeout設定フラグ = OFF,maxlist設定フラグ = OFF,reschedule設定フラグ = OFFの場合 + args.clear(); + args.push_back("-T"); + args.push_back("2000"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(this->timeout,2000); + BOOST_CHECK_EQUAL(this->maxlist,1024); + BOOST_CHECK_EQUAL(this->reschedule,0); + BOOST_CHECK_EQUAL(check_message.flag,true); + BOOST_CHECK(this->session_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->maxlist=111; + this->reschedule=111; + + cout << "[67]--------------------------------------------- " << endl; + //unit_test[67] チェック結果フラグにTRUEを設定する,timeoutに2147483647を設定する,maxlistに1024を設定する,rescheduleに0を設定する,sessionデータをreplication_areaから回復する + //unit_test[67] test data:オプション文字列 = "-T 2147483647",timeout設定フラグ = OFF,maxlist設定フラグ = OFF,reschedule設定フラグ = OFFの場合 + args.clear(); + args.push_back("-T"); + args.push_back("2147483647"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(this->timeout,INT_MAX); + BOOST_CHECK_EQUAL(this->maxlist,1024); + BOOST_CHECK_EQUAL(this->reschedule,0); + BOOST_CHECK_EQUAL(check_message.flag,true); + BOOST_CHECK(this->session_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->maxlist=111; + this->reschedule=111; + + cout << "[68]--------------------------------------------- " << endl; + //unit_test[68] チェック結果フラグにTRUEを設定する,timeoutに2147483647を設定する,maxlistに1024を設定する,rescheduleに0を設定する,sessionデータをreplication_areaから回復する + //unit_test[68] test data:オプション文字列 = "-T -T 2147483647",timeout設定フラグ = OFF,maxlist設定フラグ = OFF,reschedule設定フラグ = OFFの場合 + args.clear(); + args.push_back("-T"); + args.push_back("-T"); + args.push_back("2147483647"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(this->timeout,INT_MAX); + BOOST_CHECK_EQUAL(this->maxlist,1024); + BOOST_CHECK_EQUAL(this->reschedule,0); + BOOST_CHECK_EQUAL(check_message.flag,true); + BOOST_CHECK(this->session_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->maxlist=111; + this->reschedule=111; + + cout << "[69]--------------------------------------------- " << endl; + //unit_test[69] チェック結果フラグにFALSEを設定する,timeoutに2147483647を設定する,チェック結果メッセージに"Cannot set multiple option '-T/timeout'"を設定する,sessionデータをreplication_areaから回復する + //unit_test[69] test data:オプション文字列 = "-T 2147483647 -T",timeout設定フラグ = ON,maxlist設定フラグ = OFF,reschedule設定フラグ = OFFの場合 + args.clear(); + args.push_back("-T"); + args.push_back("2147483647"); + args.push_back("-T"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL(this->timeout,INT_MAX); + BOOST_CHECK_EQUAL("Cannot set multiple option '-T/--timeout'.",check_message.message); + BOOST_CHECK(this->session_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->maxlist=111; + this->reschedule=111; + + cout << "[70]--------------------------------------------- " << endl; + //unit_test[70] チェック結果フラグにFALSEを設定する,timeoutに2147483647を設定する,チェック結果メッセージに"Cannot set multiple option '-T/timeout'"を設定する,sessionデータをreplication_areaから回復する + //unit_test[70] test data:オプション文字列 = "-T 2147483647 -T 2147483647",timeout設定フラグ = ON,maxlist設定フラグ = OFF,reschedule設定フラグ = OFFの場合 + args.clear(); + args.push_back("-T"); + args.push_back("2147483647"); + args.push_back("-T"); + args.push_back("2147483647"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL(this->timeout,INT_MAX); + BOOST_CHECK_EQUAL("Cannot set multiple option '-T/--timeout'.",check_message.message); + this->timeout=111; + this->maxlist=111; + this->reschedule=111; + + cout << "[71]--------------------------------------------- " << endl; + //unit_test[71] チェック結果フラグにFALSEを設定する,timeoutに2147483647を設定する,チェック結果メッセージに"Cannot set multiple option '-T/timeout'"を設定する,sessionデータをreplication_areaから回復する + //unit_test[71] test data:オプション文字列 = "-T -T 2147483647 -T" timeout設定フラグ = ON,maxlist設定フラグ = OFF,reschedule設定フラグ = OFFの場合 + args.clear(); + args.push_back("-T"); + args.push_back("-T"); + args.push_back("2147483647"); + args.push_back("-T"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL(this->timeout,INT_MAX); + BOOST_CHECK_EQUAL("Cannot set multiple option '-T/--timeout'.",check_message.message); + BOOST_CHECK(this->session_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->maxlist=111; + this->reschedule=111; + + cout << "[72]--------------------------------------------- " << endl; + //unit_test[72] チェック結果フラグにTRUEを設定する,timeoutに3600を設定する,maxlistに1024を設定する,rescheduleに0を設定する,sessionデータをreplication_areaから回復する + //unit_test[72] test data:オプション文字列 = "--timeout" timeout設定フラグ = OFF,maxlist設定フラグ = OFF,reschedule設定フラグ = OFF の場合 + args.clear(); + args.push_back("--timeout"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,true); + BOOST_CHECK_EQUAL(this->timeout,3600); + BOOST_CHECK_EQUAL(this->maxlist,1024); + BOOST_CHECK_EQUAL(this->reschedule,0); + this->timeout=111; + this->maxlist=111; + this->reschedule=111; + + cout << "[73]--------------------------------------------- " << endl; + //unit_test[73] チェック結果フラグにTRUEを設定する,timeoutに3600を設定する,maxlistに1024を設定する,rescheduleに0を設定する,sessionデータをreplication_areaから回復する + //unit_test[73] test data:オプション文字列 = "--timeout --timeout" timeout設定フラグ = OFF,maxlist設定フラグ = OFF,reschedule設定フラグ = OFFの場合 + args.clear(); + args.push_back("--timeout"); + args.push_back("--timeout"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,true); + BOOST_CHECK_EQUAL(this->timeout,3600); + BOOST_CHECK_EQUAL(this->maxlist,1024); + BOOST_CHECK_EQUAL(this->reschedule,0); + BOOST_CHECK(this->session_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->maxlist=111; + this->reschedule=111; + + cout << "[74]--------------------------------------------- " << endl; + //unit_test[74] チェック結果フラグにFALSEを設定する,チェック結果メッセージに"'-T/--timeout' option value '2ewqt' is not numeric character."を設定する,sessionデータをreplication_areaから回復する + //unit_test[74] test data:オプション文字列 = "--timeout 2ewqt" timeout設定フラグ = OFF,maxlist設定フラグ = OFF,reschedule設定フラグ = OFFの場合 + args.clear(); + args.push_back("--timeout"); + args.push_back("2ewqt"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL(check_message.message,"'-T/--timeout' option value '2ewqt' is not numeric character."); + BOOST_CHECK(this->session_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->maxlist=111; + this->reschedule=111; + + cout << "[75]--------------------------------------------- " << endl; + //unit_test[75] チェック結果フラグにFALSEを設定する,チェック結果メッセージに"'-T/--timeout' option value '2148583647' is too large."を設定する,sessionデータをreplication_areaから回復する + //unit_test[75] test data:オプション文字列 = "--timeout 2148583647" timeout設定フラグ = OFF,maxlist設定フラグ = OFF,reschedule設定フラグ = OFFの場合 + args.clear(); + args.push_back("--timeout"); + args.push_back("2148583647"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL(check_message.message,"'-T/--timeout' option value '2148583647' is too large."); + BOOST_CHECK(this->session_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->maxlist=111; + this->reschedule=111; + + cout << "[76]--------------------------------------------- " << endl; + //unit_test[76] チェック結果フラグにTRUEを設定する,timeoutに2000を設定する,maxlistに1024を設定する,rescheduleに0を設定する,sessionデータをreplication_areaから回復する + //unit_test[76] test data:オプション文字列 = "--timeout 2000" timeout設定フラグ = OFF,maxlist設定フラグ = OFF,reschedule設定フラグ = OFFの場合 + args.clear(); + args.push_back("--timeout"); + args.push_back("2000"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(this->timeout,2000); + BOOST_CHECK_EQUAL(this->maxlist,1024); + BOOST_CHECK_EQUAL(this->reschedule,0); + BOOST_CHECK_EQUAL(check_message.flag,true); + BOOST_CHECK(this->session_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->maxlist=111; + this->reschedule=111; + + cout << "[77]--------------------------------------------- " << endl; + //unit_test[77] チェック結果フラグにTRUEを設定する,timeoutに2147483647を設定する,maxlistに1024を設定する,rescheduleに0を設定する,sessionデータをreplication_areaから回復する + //unit_test[77] test data:オプション文字列 = "--timeout" timeout設定フラグ = OFF,maxlist設定フラグ = OFF,reschedule設定フラグ = OFFの場合 + args.clear(); + args.push_back("--timeout"); + args.push_back("2147483647"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(this->timeout,INT_MAX); + BOOST_CHECK_EQUAL(this->maxlist,1024); + BOOST_CHECK_EQUAL(this->reschedule,0); + BOOST_CHECK_EQUAL(check_message.flag,true); + BOOST_CHECK(this->session_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->maxlist=111; + this->reschedule=111; + + cout << "[78]--------------------------------------------- " << endl; + //unit_test[78] チェック結果フラグにTRUEを設定する,timeoutに2147483647を設定する,maxlistに1024を設定する,rescheduleに0を設定する,sessionデータをreplication_areaから回復する + //unit_test[78] test data:オプション文字列 = "--timeout --timeout 2147483647" timeout設定フラグ = OFF,maxlist設定フラグ = OFF,reschedule設定フラグ = OFFの場合 + args.clear(); + args.push_back("--timeout"); + args.push_back("--timeout"); + args.push_back("2147483647"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(this->timeout,INT_MAX); + BOOST_CHECK_EQUAL(this->maxlist,1024); + BOOST_CHECK_EQUAL(this->reschedule,0); + BOOST_CHECK_EQUAL(check_message.flag,true); + BOOST_CHECK(this->session_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->maxlist=111; + this->reschedule=111; + + cout << "[79]--------------------------------------------- " << endl; + //unit_test[79] チェック結果フラグにFALSEを設定する,timeoutに2147483647を設定する,チェック結果メッセージに"Cannot set multiple option '-T/timeout'"を設定する,sessionデータをreplication_areaから回復する + //unit_test[79] test data:オプション文字列 = "--timeout 2147483647 --timeout" timeout設定フラグ = ON,maxlist設定フラグ = OFF,reschedule設定フラグ = OFFの場合 + args.clear(); + args.push_back("--timeout"); + args.push_back("2147483647"); + args.push_back("--timeout"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL(this->timeout,INT_MAX); + BOOST_CHECK_EQUAL("Cannot set multiple option '-T/--timeout'.",check_message.message); + BOOST_CHECK(this->session_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->maxlist=111; + this->reschedule=111; + + cout << "[80]--------------------------------------------- " << endl; + //unit_test[80] チェック結果フラグにFALSEを設定する,timeoutに2147483647を設定する,チェック結果メッセージに"Cannot set multiple option '-T/timeout'"を設定する,sessionデータをreplication_areaから回復する + //unit_test[80] test data:オプション文字列 = "--timeout 2147483647 --timeout 2147483647" timeout設定フラグ = ON,maxlist設定フラグ = OFF,reschedule設定フラグ = OFFの場合 + args.clear(); + args.push_back("--timeout"); + args.push_back("2147483647"); + args.push_back("--timeout"); + args.push_back("2147483647"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL(this->timeout,INT_MAX); + BOOST_CHECK_EQUAL("Cannot set multiple option '-T/--timeout'.",check_message.message); + BOOST_CHECK(this->session_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->maxlist=111; + this->reschedule=111; + + cout << "[81]--------------------------------------------- " << endl; + //unit_test[81] チェック結果フラグにFALSEを設定する,timeoutに2147483647を設定する,チェック結果メッセージに"Cannot set multiple option '-T/timeout'"を設定する,sessionデータをreplication_areaから回復する + //unit_test[81] test data:オプション文字列 = "--timeout 2147483647 --timeout" timeout設定フラグ = ON,maxlist設定フラグ = OFF,reschedule設定フラグ = OFFの場合 + args.clear(); + args.push_back("--timeout"); + args.push_back("--timeout"); + args.push_back("2147483647"); + args.push_back("--timeout"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL("Cannot set multiple option '-T/--timeout'.",check_message.message); + BOOST_CHECK(this->session_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->maxlist=111; + this->reschedule=111; + + cout << "[82]--------------------------------------------- " << endl; + //unit_test[82] チェック結果フラグにTRUEを設定する,timeに3600を設定する,maxlistに1024を設定する,rescheduleに0を設定する,sessionデータをreplication_areaから回復する + //unit_test[82] test data:オプション文字列 = "-M" timeout設定フラグ = OFF,maxlist設定フラグ = OFF,reschedule設定フラグ = OFF + args.clear(); + args.push_back("-M"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,true); + BOOST_CHECK_EQUAL(this->maxlist,1024); + BOOST_CHECK_EQUAL(this->timeout,3600); + BOOST_CHECK_EQUAL(this->reschedule,0); + BOOST_CHECK(this->session_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->maxlist=111; + this->reschedule=111; + + cout << "[83]--------------------------------------------- " << endl; + //unit_test[83] チェック結果フラグにTRUEを設定する,timeに3600を設定する,maxlistに1024を設定する,rescheduleに0を設定する,sessionデータをreplication_areaから回復する + //unit_test[83] test data:オプション文字列 = "-M -M" timeout設定フラグ = OFF,maxlist設定フラグ = OFF,reschedule設定フラグ = OFF + args.clear(); + args.push_back("-M"); + args.push_back("-M"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,true); + BOOST_CHECK_EQUAL(this->maxlist,1024); + BOOST_CHECK_EQUAL(this->timeout,3600); + BOOST_CHECK_EQUAL(this->reschedule,0); + BOOST_CHECK(this->session_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->maxlist=111; + this->reschedule=111; + + cout << "[84]--------------------------------------------- " << endl; + //unit_test[84] チェック結果フラグにFALSEを設定する,チェック結果メッセージに"'-M/--maxlist' option value '2ewqt' is not numeric character."を設定する,sessionデータをreplication_areaから回復する + //unit_test[84] test data:オプション文字列 = "-M 2ewqt" timeout設定フラグ = OFF,maxlist設定フラグ = OFF,reschedule設定フラグ = OFF + args.clear(); + args.push_back("-M"); + args.push_back("2ewqt"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL(check_message.message,"'-M/--maxlist' option value '2ewqt' is not numeric character."); + BOOST_CHECK(this->session_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->maxlist=111; + this->reschedule=111; + + cout << "[85]--------------------------------------------- " << endl; + //unit_test[85] チェック結果フラグにFALSEを設定する,チェック結果メッセージに"'-M/--maxlist' option value '2148583647' is too large."を設定する,sessionデータをreplication_areaから回復する + //unit_test[85] test data:オプション文字列 = "-M 2148583647" timeout設定フラグ = OFF,maxlist設定フラグ = OFF,reschedule設定フラグ = OFF + args.clear(); + args.push_back("-M"); + args.push_back("2148583647"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL(check_message.message,"'-M/--maxlist' option value '2148583647' is too large."); + BOOST_CHECK(this->session_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->maxlist=111; + this->reschedule=111; + + cout << "[86]--------------------------------------------- " << endl; + //unit_test[86] チェック結果フラグにTRUEを設定する,timeoutに3600を設定する,maxlistに100を設定する,rescheduleに0を設定する,sessionデータをreplication_areaから回復する + //unit_test[86] test data:オプション文字列 = "-M 100" timeout設定フラグ = OFF,maxlist設定フラグ = OFF,reschdule設定フラグ = OFF + args.clear(); + args.push_back("-M"); + args.push_back("100"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(this->maxlist,100); + BOOST_CHECK_EQUAL(this->timeout,3600); + BOOST_CHECK_EQUAL(this->reschedule,0); + BOOST_CHECK_EQUAL(check_message.flag,true); + BOOST_CHECK(this->session_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->maxlist=111; + this->reschedule=111; + + cout << "[87]--------------------------------------------- " << endl; + //unit_test[87] チェック結果フラグにTRUEを設定する,timeoutに3600を設定する,maxlistに100を設定する,rescheduleに0を設定する,sessionデータをreplication_areaから回復する + //unit_test[87] test data:オプション文字列 = "-M -M 100" timeout設定フラグ = OFF,maxlist設定フラグ = OFF,reschdule設定フラグ = OFF + args.clear(); + args.push_back("-M"); + args.push_back("-M"); + args.push_back("100"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(this->maxlist,100); + BOOST_CHECK_EQUAL(this->timeout,3600); + BOOST_CHECK_EQUAL(this->reschedule,0); + BOOST_CHECK_EQUAL(check_message.flag,true); + BOOST_CHECK(this->session_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->maxlist=111; + this->reschedule=111; + + cout << "[88]--------------------------------------------- " << endl; + //unit_test[88] チェック結果フラグにTRUEを設定する,timeoutに3600を設定する,maxlistに2147483674を設定する,rescheduleに0を設定する,sessionデータをreplication_areaから回復する + //unit_test[88] test data:オプション文字列 = "-M 1024" timeout設定フラグ = OFF,maxlist設定フラグ = OFF,reschedule設定フラグ = OFF + args.clear(); + args.push_back("-M"); + args.push_back("1024"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(this->maxlist,1024); + BOOST_CHECK_EQUAL(this->timeout,3600); + BOOST_CHECK_EQUAL(this->reschedule,0); + BOOST_CHECK_EQUAL(check_message.flag,true); + BOOST_CHECK(this->session_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->maxlist=111; + this->reschedule=111; + + cout << "[89]--------------------------------------------- " << endl; + //unit_test[89] チェック結果フラグにFALSEを設定する,maxlistに200を設定する,チェック結果メッセージに"Cannot set multiple option '-M/maxlist'"を設定する,sessionデータをreplication_areaから回復する + //unit_test[89] test data:オプション文字列 = "-M 200 -M" maxlist設定フラグ = ON,timeout設定フラグ = OFF,reschedule設定フラグ = OFF + args.clear(); + args.push_back("-M"); + args.push_back("200"); + args.push_back("-M"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL(this->maxlist,200); + BOOST_CHECK_EQUAL("Cannot set multiple option '-M/--maxlist'.",check_message.message); + BOOST_CHECK(this->session_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->maxlist=111; + this->reschedule=111; + + cout << "[90]--------------------------------------------- " << endl; + //unit_test[90] チェック結果フラグにFALSEを設定する,maxlistに200を設定する,チェック結果メッセージに"Cannot set multiple option '-M/maxlist'"を設定する,sessionデータをreplication_areaから回復する + //unit_test[90] test data:オプション文字列 = "-M 200 -M 200" maxlist設定フラグ = ON,timeout設定フラグ = OFF,reschedule設定フラグ = OFF + args.clear(); + args.push_back("-M"); + args.push_back("200"); + args.push_back("-M"); + args.push_back("200"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL(this->maxlist,200); + BOOST_CHECK_EQUAL("Cannot set multiple option '-M/--maxlist'.",check_message.message); + BOOST_CHECK(this->session_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->maxlist=111; + this->reschedule=111; + + cout << "[91]--------------------------------------------- " << endl; + //unit_test[91] チェック結果フラグにFALSEを設定する,maxlistに200を設定する,チェック結果メッセージに"Cannot set multiple option '-M/maxlist'"を設定する,sessionデータをreplication_areaから回復する + //unit_test[91] test data:オプション文字列 = "-M -M 200 -M" maxlist設定フラグ = ON,timeout設定フラグ = OFF,reschedule設定フラグ = OFF + args.clear(); + args.push_back("-M"); + args.push_back("-M"); + args.push_back("200"); + args.push_back("-M"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL(this->maxlist,200); + BOOST_CHECK_EQUAL("Cannot set multiple option '-M/--maxlist'.",check_message.message); + BOOST_CHECK(this->session_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->maxlist=111; + this->reschedule=111; + + cout << "[92]--------------------------------------------- " << endl; + //unit_test[92] チェック結果フラグにTRUEを設定する,timeoutに3600を設定する,maxlistに1024を設定する,rescheduleに0を設定する,sessionデータをreplication_areaから回復する + //unit_test[92] test data:オプション文字列 = "--maxlist" timeout設定フラグ = OFF,maxlist設定フラグ = OFF,reschedule設定フラグ = OFF + args.clear(); + args.push_back("--maxlist"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,true); + BOOST_CHECK_EQUAL(this->maxlist,1024); + BOOST_CHECK_EQUAL(this->timeout,3600); + BOOST_CHECK_EQUAL(this->reschedule,0); + BOOST_CHECK(this->session_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->maxlist=111; + this->reschedule=111; + + cout << "[93]--------------------------------------------- " << endl; + //unit_test[93] チェック結果フラグにTRUEを設定する,timeoutに3600を設定する,maxlistに1024を設定する,rescheduleに0を設定する,sessionデータをreplication_areaから回復する + //unit_test[93] test data:オプション文字列 = "--maxlist --maxlist" timeout設定フラグ = OFF,maxlist設定フラグ = OFF,reschedule設定フラグ = OFF + args.clear(); + args.push_back("--maxlist"); + args.push_back("--maxlist"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,true); + BOOST_CHECK_EQUAL(this->maxlist,1024); + BOOST_CHECK_EQUAL(this->timeout,3600); + BOOST_CHECK_EQUAL(this->reschedule,0); + BOOST_CHECK(this->session_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->maxlist=111; + this->reschedule=111; + + cout << "[94]--------------------------------------------- " << endl; + //unit_test[94] チェック結果フラグにFALSEを設定する,チェック結果メッセージに"'-M/--maxlist' option value '2ewqt' is not numeric character."を設定する,sessionデータをreplication_areaから回復する + //unit_test[94] test data:オプション文字列 = "--maxlist 2ewqt" maxlist設定フラグ = OFF,maxlist設定フラグ = OFF,reschedule設定フラグ = OFF + args.clear(); + args.push_back("--maxlist"); + args.push_back("2ewqt"); + check_message=this->check_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL(check_message.message,"'-M/--maxlist' option value '2ewqt' is not numeric character."); + BOOST_CHECK(this->session_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->maxlist=111; + this->reschedule=111; + + cout << "[95]--------------------------------------------- " << endl; + //unit_test[95] チェック結果フラグにFALSEを設定する,チェック結果メッセージに"'-M/--maxlist' option value '2148583647' is too large."を設定する,sessionデータをreplication_areaから回復する + //unit_test[95] test data:オプション文字列 = "--maxlist 2148583647" timeout設定フラグ = OFF ,maxlist設定フラグ = OFF,reschedule設定フラグ = OFF + args.clear(); + args.push_back("--maxlist"); + args.push_back("2148583647"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL(check_message.message,"'-M/--maxlist' option value '2148583647' is too large."); + BOOST_CHECK(this->session_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->maxlist=111; + this->reschedule=111; + + cout << "[96]--------------------------------------------- " << endl; + //unit_test[96] チェック結果フラグにTRUEを設定する,timeoutに3600を設定する,maxlistに100を設定する,rescheduleに0を設定する,sessionデータをreplication_areaから回復する + //unit_test[96] test data:オプション文字列 = "--maxlist 100" timeout設定フラグ = OFF ,maxlist設定フラグ = OFF,reschedule設定フラグ = OFF + args.clear(); + args.push_back("--maxlist"); + args.push_back("100"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(this->maxlist,100); + BOOST_CHECK_EQUAL(this->timeout,3600); + BOOST_CHECK_EQUAL(this->reschedule,0); + BOOST_CHECK_EQUAL(check_message.flag,true); + BOOST_CHECK(this->session_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->maxlist=111; + this->reschedule=111; + + cout << "[97]--------------------------------------------- " << endl; + //unit_test[97] チェック結果フラグにTRUEを設定する,timeoutに3600を設定する,maxlistに100を設定する,rescheduleに0を設定する,sessionデータをreplication_areaから回復する + //unit_test[97] test data:オプション文字列 = "--maxlist --maxlist 100" timeout設定フラグ = OFF ,reschedule設定フラグ = OFF + args.clear(); + args.push_back("--maxlist"); + args.push_back("--maxlist"); + args.push_back("100"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(this->maxlist,100); + BOOST_CHECK_EQUAL(this->timeout,3600); + BOOST_CHECK_EQUAL(this->reschedule,0); + BOOST_CHECK_EQUAL(check_message.flag,true); + BOOST_CHECK(this->session_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->maxlist=111; + this->reschedule=111; + + cout << "[98]--------------------------------------------- " << endl; + //unit_test[98] チェック結果フラグにTRUEを設定する,maxlistにINT_MAXを設定する,timeoutに3600を設定する,rescheduleに0を設定する,sessionデータをreplication_areaから回復する + //unit_test[98] test data:オプション文字列 = "--maxlist 1024" maxlist設定フラグ = OFF,timeout設定フラグ = OFF ,reschedule設定フラグ = OFF + args.clear(); + args.push_back("--maxlist"); + args.push_back("1024"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(this->maxlist,1024); + BOOST_CHECK_EQUAL(check_message.flag,true); + BOOST_CHECK_EQUAL(this->timeout,3600); + BOOST_CHECK_EQUAL(this->reschedule,0); + BOOST_CHECK(this->session_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->maxlist=111; + this->reschedule=111; + + cout << "[99]--------------------------------------------- " << endl; + //unit_test[99] チェック結果フラグにFALSEを設定する,チェック結果メッセージに"Cannot set multiple option '-M/maxlist'"を設定する,sessionデータをreplication_areaから回復する + //unit_test[99] test data:オプション文字列 = "--maxlist 20 --maxlist" + args.clear(); + args.push_back("--maxlist"); + args.push_back("20"); + args.push_back("--maxlist"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL("Cannot set multiple option '-M/--maxlist'.",check_message.message); + BOOST_CHECK(this->session_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->maxlist=111; + this->reschedule=111; + + cout << "[100]--------------------------------------------- " << endl; + //unit_test[100] チェック結果フラグにFALSEを設定する,チェック結果メッセージに"Cannot set multiple option '-M/maxlist'"を設定する,sessionデータをreplication_areaから回復する + //unit_test[100] test data:オプション文字列 = "--maxlist 20 --maxlist 20" + args.clear(); + args.push_back("--maxlist"); + args.push_back("20"); + args.push_back("--maxlist"); + args.push_back("20"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL("Cannot set multiple option '-M/--maxlist'.",check_message.message); + BOOST_CHECK(this->session_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->maxlist=111; + this->reschedule=111; + + cout << "[101]--------------------------------------------- " << endl; + //unit_test[101] チェック結果フラグにFALSEを設定する,チェック結果メッセージに"Cannot set multiple option '-M/maxlist'"を設定する,sessionデータをreplication_areaから回復する + //unit_test[101] test data:オプション文字列 = "--maxlist --maxlist 20 --maxlist" + args.clear(); + args.push_back("--maxlist"); + args.push_back("--maxlist"); + args.push_back("20"); + args.push_back("--maxlist"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL("Cannot set multiple option '-M/--maxlist'.",check_message.message); + BOOST_CHECK(this->session_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->maxlist=111; + this->reschedule=111; + + cout << "[102]--------------------------------------------- " << endl; + //unit_test[102] チェック結果フラグにTRUEを設定する,rescheduleに1を設定する,timeoutに3600を設定する,maxlistに1024を設定する,sessionデータをreplication_areaから回復する + //unit_test[102] test data:オプション文字列 = "-R" no_reschedule設定フラグ = OFF + args.clear(); + args.push_back("-R"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,true); + BOOST_CHECK_EQUAL(this->reschedule,1); + BOOST_CHECK_EQUAL(this->timeout,3600); + BOOST_CHECK_EQUAL(this->maxlist,1024); + BOOST_CHECK(this->session_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->maxlist=111; + this->reschedule=111; + + cout << "[103]--------------------------------------------- " << endl; + //unit_test[103] チェック結果フラグにFALSEを設定する,rescheduleに0を設定する,チェック結果メッセージに"You have to choose either of reschedule or no_reschedule"を設定する,sessionデータをreplication_areaから回復する + //unit_test[103] test data:オプション文字列 ="-N -R" + args.clear(); + args.push_back("-N"); + args.push_back("-R"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(this->reschedule,0); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL("You have to choose either of reschedule or no-reschedule.",check_message.message); + BOOST_CHECK(this->session_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->maxlist=111; + this->reschedule=111; + + cout << "[104]--------------------------------------------- " << endl; + //unit_test[104] チェック結果フラグにTRUEを設定する,rescheduleに0を設定する,timeoutに3600を設定する,maxlistに1024を設定する,sessionデータをreplication_areaから回復する + //unit_test[104] test data:オプション文字列 = "-N" reschedule設定フラグ = OFF + args.clear(); + args.push_back("-N"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(this->reschedule,0); + BOOST_CHECK_EQUAL(check_message.flag,true); + BOOST_CHECK_EQUAL(this->timeout,3600); + BOOST_CHECK_EQUAL(this->maxlist,1024); + BOOST_CHECK(this->session_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->maxlist=111; + this->reschedule=111; + + cout << "[105]--------------------------------------------- " << endl; + //unit_test[105] チェック結果フラグにFALSEを設定する,rescheduleに1を設定する,チェック結果メッセージに"You have to choose either of reschedule or no_reschedule"を設定する,sessionデータをreplication_areaから回復する + //unit_test[105] test data:オプション文字列 = "-R -N" + args.clear(); + args.push_back("-R"); + args.push_back("-N"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(this->reschedule,1); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL("You have to choose either of reschedule or no-reschedule.",check_message.message); + BOOST_CHECK(this->session_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->maxlist=111; + this->reschedule=111; + + cout << "[106]--------------------------------------------- " << endl; + //unit_test[106] チェック結果フラグにFALSEを設定する,チェック結果メッセージに"You have to choose either of reschedule or no_reschedule"を設定する,timeoutに2000を設定する,maxlistに100を設定する,rescheduleに1を設定する,sessionデータをreplication_areaから回復する + //unit_test[106] test data:オプション文字列 = "-T -M -R -N" + args.clear(); + args.push_back("-T"); + args.push_back("-M"); + args.push_back("-R"); + args.push_back("-N"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL("You have to choose either of reschedule or no-reschedule.",check_message.message); + BOOST_CHECK(this->session_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->maxlist=111; + this->reschedule=111; + + cout << "[107]--------------------------------------------- " << endl; + //unit_test[107] チェック結果フラグにFALSEを設定する,チェック結果メッセージに"You have to choose either of reschedule or no_reschedule"を設定する,timeoutに2000を設定する,maxlistに100を設定する,rescheduleに1を設定する,sessionデータをreplication_areaから回復する + //unit_test[107] test data:オプション文字列 = "-M -T -N -R" + args.clear(); + args.push_back("-M"); + args.push_back("-T"); + args.push_back("-N"); + args.push_back("-R"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL("You have to choose either of reschedule or no-reschedule.",check_message.message); + BOOST_CHECK(this->session_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->maxlist=111; + this->reschedule=111; + + cout << "[108]--------------------------------------------- " << endl; + //unit_test[108] チェック結果フラグにTRUEを設定する,timeoutに2000を設定する,maxlistに100を設定する,rescheduleに1を設定する,sessionデータをreplication_areaから回復する + //unit_test[108] test data:オプション文字列 = "-T 2000 -M 100 -R" + args.clear(); + args.push_back("-T"); + args.push_back("2000"); + args.push_back("-M"); + args.push_back("100"); + args.push_back("-R"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,true); + BOOST_CHECK_EQUAL(this->timeout,2000); + BOOST_CHECK_EQUAL(this->maxlist,100); + BOOST_CHECK_EQUAL(this->reschedule,1); + BOOST_CHECK(this->session_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->maxlist=111; + this->reschedule=111; + + cout << "[109]--------------------------------------------- " << endl; + //unit_test[109] チェック結果フラグにTRUEを設定する,reschedule設定フラグ = OFF,timeoutに2000を設定する,maxlistに100を設定する,rescheduleに1を設定する,sessionデータをreplication_areaから回復する + //unit_test[109] test data:オプション文字列 = "-T 2000 --maxlist 100 -R" + args.clear(); + args.push_back("-T"); + args.push_back("2000"); + args.push_back("--maxlist"); + args.push_back("100"); + args.push_back("-R"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,true); + BOOST_CHECK_EQUAL(this->timeout,2000); + BOOST_CHECK_EQUAL(this->maxlist,100); + BOOST_CHECK_EQUAL(this->reschedule,1); + BOOST_CHECK(this->session_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->maxlist=111; + this->reschedule=111; + + cout << "[110]--------------------------------------------- " << endl; + //unit_test[110] チェック結果フラグにTRUEを設定する,reschedule設定フラグ = OFF,timeoutに2000を設定する,maxlistに100を設定する,rescheduleに1を設定する,sessionデータをreplication_areaから回復する + //unit_test[110] test data:オプション文字列 = "--timeout 2000 -M 100 -R" + args.clear(); + args.push_back("--timeout"); + args.push_back("2000"); + args.push_back("-M"); + args.push_back("100"); + args.push_back("-R"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,true); + BOOST_CHECK_EQUAL(this->timeout,2000); + BOOST_CHECK_EQUAL(this->maxlist,100); + BOOST_CHECK_EQUAL(this->reschedule,1); + BOOST_CHECK(this->session_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->maxlist=111; + this->reschedule=111; + + cout << "[111]--------------------------------------------- " << endl; + //unit_test[111] チェック結果フラグにTRUEを設定する,reschedule設定フラグ = OFF,timeoutに2000を設定する,maxlistに100を設定する,rescheduleに1を設定する,sessionデータをreplication_areaから回復する + //unit_test[111] test data:オプション文字列 = "--timeout 2000 --maxlist 100 -R" + args.clear(); + args.push_back("--timeout"); + args.push_back("2000"); + args.push_back("--maxlist"); + args.push_back("100"); + args.push_back("-R"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,true); + BOOST_CHECK_EQUAL(this->timeout,2000); + BOOST_CHECK_EQUAL(this->maxlist,100); + BOOST_CHECK_EQUAL(this->reschedule,1); + BOOST_CHECK(this->session_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->maxlist=111; + this->reschedule=111; + + cout << "[112]--------------------------------------------- " << endl; + //unit_test[112] チェック結果フラグにFALSEを設定する,チェック結果メッセージに"You have to choose either of reschedule or no_reschedule"を設定する,timeoutに2000を設定する,maxlistに100を設定する,rescheduleに0を設定する,sessionデータをreplication_areaから回復する + //unit_test[112] test data:オプション文字列 = "-T 2000 --maxlist 100 -R -N" + args.clear(); + args.push_back("-T"); + args.push_back("2000"); + args.push_back("--maxlist"); + args.push_back("100"); + args.push_back("-R"); + args.push_back("-N"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL("You have to choose either of reschedule or no-reschedule.",check_message.message); + BOOST_CHECK_EQUAL(this->timeout,2000); + BOOST_CHECK_EQUAL(this->maxlist,100); + BOOST_CHECK(this->session_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->maxlist=111; + this->reschedule=111; + + cout << "[113]--------------------------------------------- " << endl; + //unit_test[113] チェック結果フラグにFALSEを設定する,チェック結果メッセージに"Option error"を設定する,sessionデータをreplication_areaから回復する + //unit_test[113] test data:オプション文字列 = 上記以外 + args.clear(); + args.push_back("-A"); + check_message=this->set_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL("Option error.",check_message.message); + BOOST_CHECK(this->session_data_processor!=NULL); + BOOST_CHECK(this->replication_data_processor!=NULL); + this->timeout=111; + this->maxlist=111; + this->reschedule=111; + } + + //add_parameter + void add_parameter_test(){ + std::vector args; + + cout << "[114]--------------------------------------------- " << endl; + //unit_test[114] オプション文字列が存在ない場合,チェック結果フラグにTRUEを設定する + check_message_result check_message; + check_message=this->add_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,true); + + cout << "[115]--------------------------------------------- " << endl; + //unit_test[115] チェック結果フラグにFALSEを設定する,チェック結果メッセージに"Cannot add option."を設定する + //unit_test[115] test data:オプション文字列が存在する場合 + args.push_back("-T"); + args.push_back("2000"); + args.push_back("-R"); + args.push_back("1"); + check_message=this->add_parameter(args); + BOOST_CHECK_EQUAL(check_message.flag,false); + BOOST_CHECK_EQUAL(check_message.message,"Cannot add option."); + } + + //handle_rslist_update + + //register_schedule(tcp) + void register_schedule_tcp_test(){ + protocol_module_base::rs_list_itr_func_type rs_1,rs_2; + protocol_module_base::rs_list_itr_next_func_type rs_3; + boost::asio::ip::tcp::endpoint ep; + protocol_module_base::tcp_schedule_func_type tcp_schedule; + cout << "[116]--------------------------------------------- " << endl; + //unit_test[116] parameterがNULLの場合,schedule_tcpにNULLを設定する + tcp_schedule=NULL; + this->register_schedule(tcp_schedule); + BOOST_CHECK(this->schedule_tcp==NULL); + cout << "[117]--------------------------------------------- " << endl; + //unit_test[117] parameterがtcp_scheduleの場合,schedule_tcpにt_scheduleを設定する + tcp_schedule=&t_schedule; + this->register_schedule(tcp_schedule); + this->schedule_tcp(boost::this_thread::get_id(),rs_1,rs_2,rs_3,ep); + BOOST_CHECK(check_register_schedule); + } + + //register_schedule(udp) + + //handle_session_initialize + void handle_session_initialize_test() { + + boost::thread down_thread(down_thread_func); + boost::asio::ip::tcp::endpoint ep; + boost::asio::ip::tcp::endpoint client_endpoint_tcp; + boost::asio::ip::udp::endpoint client_endpoint_udp; + + cout << "[118]--------------------------------------------- " << endl; + // unit_test[118] パラメータが正常に入力去れた場合、戻り値にACCEPTを設定する。 + EVENT_TAG status = + this->handle_session_initialize(boost::this_thread::get_id(), + down_thread.get_id(), client_endpoint_tcp, + client_endpoint_udp); + BOOST_CHECK_EQUAL(status, ACCEPT); + std::map::iterator + itr; + itr = this->session_thread_data_map.find(boost::this_thread::get_id()); + BOOST_CHECK(itr != this->session_thread_data_map.end()); + BOOST_CHECK_EQUAL(itr->second->thread_division, THREAD_DIVISION_UP_STREAM); + BOOST_CHECK_EQUAL(itr->second->pair_thread_id, down_thread.get_id()); + BOOST_CHECK_EQUAL(itr->second->end_flag, END_FLAG_OFF); + BOOST_CHECK_EQUAL(itr->second->realserver_connect_failed_count, 0); + BOOST_CHECK_EQUAL(itr->second->data_begain_offset, 0u); + BOOST_CHECK_EQUAL(itr->second->data_size, 0u); + BOOST_CHECK_EQUAL(itr->second->current_record_rest_size, 0u); + BOOST_CHECK_EQUAL(itr->second->selected_realserver, ep); + BOOST_CHECK(!itr->second->hello_message_flag); + itr = this->session_thread_data_map.find(down_thread.get_id()); + BOOST_CHECK(itr != this->session_thread_data_map.end()); + BOOST_CHECK_EQUAL(itr->second->thread_division, THREAD_DIVISION_DOWN_STREAM); + BOOST_CHECK_EQUAL(itr->second->pair_thread_id, boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(itr->second->end_flag, END_FLAG_OFF); + BOOST_CHECK_EQUAL(itr->second->realserver_connect_failed_count, 0); + BOOST_CHECK_EQUAL(itr->second->data_begain_offset, 0u); + BOOST_CHECK_EQUAL(itr->second->data_size, 0u); + BOOST_CHECK_EQUAL(itr->second->current_record_rest_size, 0u); + BOOST_CHECK_EQUAL(itr->second->selected_realserver, ep); + BOOST_CHECK(!itr->second->hello_message_flag); + + } + + //handle_session_initialize + void handle_session_initialize_test_thread() { + + boost::thread down_thread(down_thread_func); + boost::asio::ip::tcp::endpoint ep; + boost::asio::ip::tcp::endpoint client_endpoint_tcp; + boost::asio::ip::udp::endpoint client_endpoint_udp; + + cout << "[119]--------------------------------------------- " << endl; + // unit_test[119] パラメータが正常に入力去れた場合、戻り値にACCEPTを設定する。 + EVENT_TAG status = + this->handle_session_initialize(boost::this_thread::get_id(), + down_thread.get_id(), client_endpoint_tcp, + client_endpoint_udp); + { + boost::mutex::scoped_lock sclock(check_mutex); + BOOST_CHECK_EQUAL(status, ACCEPT); + } + std::map::iterator itr; + { + boost::mutex::scoped_lock sclock(this->session_thread_data_map_mutex); + itr = this->session_thread_data_map.find(boost::this_thread::get_id()); + BOOST_CHECK(itr != this->session_thread_data_map.end()); + } + { + boost::mutex::scoped_lock sclock(check_mutex); + BOOST_CHECK_EQUAL(itr->second->thread_division, THREAD_DIVISION_UP_STREAM); + BOOST_CHECK_EQUAL(itr->second->pair_thread_id, down_thread.get_id()); + BOOST_CHECK_EQUAL(itr->second->end_flag, END_FLAG_OFF); + BOOST_CHECK_EQUAL(itr->second->realserver_connect_failed_count, 0); + BOOST_CHECK_EQUAL(itr->second->data_begain_offset, 0u); + BOOST_CHECK_EQUAL(itr->second->data_size, 0u); + BOOST_CHECK_EQUAL(itr->second->current_record_rest_size, 0u); + BOOST_CHECK_EQUAL(itr->second->selected_realserver, ep); + BOOST_CHECK(!itr->second->hello_message_flag); + } + { + boost::mutex::scoped_lock sclock(this->session_thread_data_map_mutex); + itr = this->session_thread_data_map.find(down_thread.get_id()); + BOOST_CHECK(itr != this->session_thread_data_map.end()); + } + { + boost::mutex::scoped_lock sclock(check_mutex); + BOOST_CHECK_EQUAL(itr->second->thread_division, THREAD_DIVISION_DOWN_STREAM); + BOOST_CHECK_EQUAL(itr->second->pair_thread_id, boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(itr->second->end_flag, END_FLAG_OFF); + BOOST_CHECK_EQUAL(itr->second->realserver_connect_failed_count, 0); + BOOST_CHECK_EQUAL(itr->second->data_begain_offset, 0u); + BOOST_CHECK_EQUAL(itr->second->data_size, 0u); + BOOST_CHECK_EQUAL(itr->second->current_record_rest_size, 0u); + BOOST_CHECK_EQUAL(itr->second->selected_realserver, ep); + BOOST_CHECK(!itr->second->hello_message_flag); + } + } + + //handle_session_finalize + void handle_session_finalize_test() { + boost::thread down_thread(down_thread_func); + EVENT_TAG status; + boost::asio::ip::tcp::endpoint client_endpoint_tcp; + boost::asio::ip::udp::endpoint client_endpoint_udp; + + cout << "[120]--------------------------------------------- " << endl; + // unit_test[120] パラメータが正常に入力された場合、戻り値にSTOPを設定する。 + this->handle_session_initialize(boost::this_thread::get_id(), + down_thread.get_id(), client_endpoint_tcp, client_endpoint_udp); + status = this->handle_session_finalize(boost::this_thread::get_id(), + down_thread.get_id()); + BOOST_CHECK_EQUAL(status, STOP); + std::map::iterator + itr; + itr = this->session_thread_data_map.find(boost::this_thread::get_id()); + BOOST_CHECK(itr == this->session_thread_data_map.end()); + itr = this->session_thread_data_map.find(down_thread.get_id()); + BOOST_CHECK(itr == this->session_thread_data_map.end()); + + cout << "[121]--------------------------------------------- " << endl; + // unit_test[121] 初期化しなくて、直接該当関数を呼び出す場合、戻り値にSTOPを設定する。 + this->session_thread_data_map[boost::this_thread::get_id()] = thread_data_ptr(new session_thread_data_sslid); + this->session_thread_data_map[down_thread.get_id()] = thread_data_ptr(new session_thread_data_sslid); + status = this->handle_session_finalize(boost::this_thread::get_id(), + down_thread.get_id()); + BOOST_CHECK_EQUAL(status, STOP); + itr = this->session_thread_data_map.find(boost::this_thread::get_id()); + BOOST_CHECK(itr == this->session_thread_data_map.end()); + itr = this->session_thread_data_map.find(down_thread.get_id()); + BOOST_CHECK(itr == this->session_thread_data_map.end()); + } + + //handle_session_finalize + void handle_session_finalize_test_thread() { + boost::thread down_thread(down_thread_func); + EVENT_TAG status; + boost::asio::ip::tcp::endpoint client_endpoint_tcp; + boost::asio::ip::udp::endpoint client_endpoint_udp; + + cout << "[122]--------------------------------------------- " << endl; + // unit_test[122] パラメータが正常に入力された場合、戻り値にSTOPを設定する。 + this->handle_session_initialize(boost::this_thread::get_id(), + down_thread.get_id(), client_endpoint_tcp, client_endpoint_udp); + status = this->handle_session_finalize(boost::this_thread::get_id(), + down_thread.get_id()); + { + boost::mutex::scoped_lock sclock(check_mutex); + BOOST_CHECK_EQUAL(status, STOP); + } + std::map::iterator itr; + { + boost::mutex::scoped_lock sclock(this->session_thread_data_map_mutex); + itr = this->session_thread_data_map.find(boost::this_thread::get_id()); + BOOST_CHECK(itr == this->session_thread_data_map.end()); + } + { + boost::mutex::scoped_lock sclock(this->session_thread_data_map_mutex); + itr = this->session_thread_data_map.find(down_thread.get_id()); + BOOST_CHECK(itr == this->session_thread_data_map.end()); + } + } + + //handle_accept + void handle_accept_test(){ + cout << "[123]--------------------------------------------- " << endl; + //unit_test[123] handle_accpet()メソッドのテスト,正常系で必ずCLIENT_RECVを返す + + boost::asio::ip::tcp::endpoint ep; + session_thread_data_sslid* thread_up_data_value = new session_thread_data_sslid; + thread_up_data_value->thread_division=THREAD_DIVISION_UP_STREAM; + thread_up_data_value->realserver_connect_failed_count=0; + thread_up_data_value->data_begain_offset=0; + thread_up_data_value->data_size=0; + thread_up_data_value->current_record_rest_size=0; + thread_up_data_value->hello_message_flag=false; + thread_data_ptr thread_data(thread_up_data_value); + this->session_thread_data_map.insert(std::pair(boost::this_thread::get_id(),thread_data)); + BOOST_CHECK_EQUAL(this->handle_accept(boost::this_thread::get_id()), protocol_module_base::CLIENT_RECV); + this->session_thread_data_map.clear(); + } + + void handle_accept_test_thread(){ + cout << "[124]--------------------------------------------- " << endl; + //unit_test[124] handle_accpet()メソッドのテスト,正常系で必ずCLIENT_RECVを返す + + boost::asio::ip::tcp::endpoint ep; + session_thread_data_sslid* thread_up_data_value = new session_thread_data_sslid; + thread_up_data_value->thread_division=THREAD_DIVISION_UP_STREAM; + thread_up_data_value->realserver_connect_failed_count=0; + thread_up_data_value->data_begain_offset=0; + thread_up_data_value->data_size=0; + thread_up_data_value->current_record_rest_size=0; + thread_up_data_value->hello_message_flag=false; + thread_data_ptr thread_data(thread_up_data_value); + { + boost::mutex::scoped_lock sclock(this->session_thread_data_map_mutex); + this->session_thread_data_map.insert(std::pair(boost::this_thread::get_id(),thread_data)); + } + { + boost::mutex::scoped_lock sclock(check_mutex); + BOOST_CHECK_EQUAL(this->handle_accept(boost::this_thread::get_id()), protocol_module_base::CLIENT_RECV); + } + } + + //handle_client_recv + void handle_client_recv_test() { + + boost::array recvbuffer; + int recvlen = 0; + EVENT_TAG status; + char* mem_cmp_buffer; + int mem_cmp_result; + int mem_cmp_length; + + cout << "[125]--------------------------------------------- " << endl; + // unit_test[125] 終了フラグがONの場合、戻り値にCLIENT_RECVを設定する。 + { + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->end_flag = END_FLAG_ON; + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + status = this->handle_client_recv(boost::this_thread::get_id(), + recvbuffer, recvlen); + BOOST_CHECK_EQUAL(status, CLIENT_RECV); + this->session_thread_data_map.clear(); + } + + cout << "[126]--------------------------------------------- " << endl; + // unit_test[126] 終了フラグがOFFで、且つ データサイズが0で、且つ 新SSLレコードでなくて、 + // unit_test[126] 且つ受信データサイズ > 0、且つdata_begain_offset = 0の場合、戻り値をREALSERVER_SELECTに設定する。 + { + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->end_flag = END_FLAG_OFF; + up_thread_data->data_size = 0u; + up_thread_data->data_begain_offset = 0u; + up_thread_data->current_record_rest_size = 10u; + recvlen = 3; + for(int i=0; isession_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + status = this->handle_client_recv(boost::this_thread::get_id(), + recvbuffer, recvlen); + mem_cmp_result = memcmp(this->session_thread_data_map[boost::this_thread::get_id()]->data_buffer.c_array(), recvbuffer.c_array(), recvlen); + BOOST_CHECK_EQUAL(mem_cmp_result, 0); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_size, 3u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_begain_offset, 0u); + BOOST_CHECK_EQUAL(status, REALSERVER_SELECT); + this->session_thread_data_map.clear(); + } + + cout << "[127]--------------------------------------------- " << endl; + // unit_test[127] 終了フラグがOFFで、且つ データサイズが0で、且つ 新SSLレコードでなくて、 + // unit_test[127] 且つ受信データサイズ > 0、且つdata_begain_offset > 0の場合、戻り値をREALSERVER_SELECTに設定する。 + { + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->end_flag = END_FLAG_OFF; + up_thread_data->data_size = 0u; + up_thread_data->data_begain_offset = 10u; + up_thread_data->current_record_rest_size = 10u; + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + recvlen = 3; + for(int i=0; ihandle_client_recv(boost::this_thread::get_id(), + recvbuffer, recvlen); + mem_cmp_result = memcmp(this->session_thread_data_map[boost::this_thread::get_id()]->data_buffer.c_array(), recvbuffer.c_array(), recvlen); + BOOST_CHECK_EQUAL(mem_cmp_result, 0); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_size, 3u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_begain_offset, 0u); + BOOST_CHECK_EQUAL(status, REALSERVER_SELECT); + this->session_thread_data_map.clear(); + } + + cout << "[128]--------------------------------------------- " << endl; + // unit_test[128] 終了フラグがOFFで、 且つ データサイズが0で、 且つ 新SSLレコードで、 + // unit_test[128] 且つdata_begain_offset が 0で,且つcheck_ssl_record_sendable()の戻り値が-1 (異常)の場合、戻り値をFINALIZEに設定する。 + { + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->end_flag = END_FLAG_OFF; + up_thread_data->data_size = 0u; + up_thread_data->data_begain_offset = 0u; + up_thread_data->current_record_rest_size = 0u; + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + recvbuffer[0] = 0x00; + recvlen = 6; + for(int i=1; ihandle_client_recv(boost::this_thread::get_id(), + recvbuffer, recvlen); + mem_cmp_result = memcmp(this->session_thread_data_map[boost::this_thread::get_id()]->data_buffer.c_array(), recvbuffer.c_array(), recvlen); + BOOST_CHECK_EQUAL(mem_cmp_result, 0); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_size, 6u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_begain_offset, 0u); + BOOST_CHECK_EQUAL(status, FINALIZE); + this->session_thread_data_map.clear(); + } + + cout << "[129]--------------------------------------------- " << endl; + // unit_test[129] 終了フラグがOFFで、 且つ データサイズが0で、 且つ 新SSLレコードで、 + // unit_test[129] 且つdata_begain_offset > 0で,且つcheck_ssl_record_sendable()の戻り値が-1 (異常)の場合、戻り値をFINALIZEに設定する。 + { + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->end_flag = END_FLAG_OFF; + up_thread_data->data_size = 0u; + up_thread_data->data_begain_offset = 10u; + up_thread_data->current_record_rest_size = 0u; + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + recvbuffer[0] = 0x00; + recvlen = 6; + for(int i=1; ihandle_client_recv(boost::this_thread::get_id(), + recvbuffer, recvlen); + mem_cmp_result = memcmp(this->session_thread_data_map[boost::this_thread::get_id()]->data_buffer.c_array(), recvbuffer.c_array(), recvlen); + BOOST_CHECK_EQUAL(mem_cmp_result, 0); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_size, 6u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_begain_offset, 0u); + BOOST_CHECK_EQUAL(status, FINALIZE); + this->session_thread_data_map.clear(); + } + + cout << "[130]--------------------------------------------- " << endl; + // unit_test[130] 終了フラグがOFFで、 且つ データサイズが0で、 且つ 新SSLレコードで、 + // unit_test[130] 且つdata_begain_offset = 0で,且つcheck_ssl_record_sendable()の戻り値が1(送信不可)の場合、戻り値をCLIENT_RECVに設定する。 + { + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->end_flag = END_FLAG_OFF; + up_thread_data->data_size = 0u; + up_thread_data->data_begain_offset = 0u; + up_thread_data->current_record_rest_size = 0u; + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + recvlen = 1; + recvbuffer[0] = 0x05; + status = this->handle_client_recv(boost::this_thread::get_id(), + recvbuffer, recvlen); + mem_cmp_result = memcmp(this->session_thread_data_map[boost::this_thread::get_id()]->data_buffer.c_array(), recvbuffer.c_array(), recvlen); + BOOST_CHECK_EQUAL(mem_cmp_result, 0); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_size, 1u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_begain_offset, 0u); + BOOST_CHECK_EQUAL(status, CLIENT_RECV); + this->session_thread_data_map.clear(); + } + + cout << "[131]--------------------------------------------- " << endl; + // unit_test[131] 終了フラグがOFFで、 且つ データサイズが0で、 且つ 新SSLレコードで、 + // unit_test[131] 且つdata_begain_offset > 0で、且つcheck_ssl_record_sendable()の戻り値が1(送信不可)の場合、戻り値をCLIENT_RECVに設定する。 + { + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->end_flag = END_FLAG_OFF; + up_thread_data->data_size = 0u; + up_thread_data->data_begain_offset = 10u; + up_thread_data->current_record_rest_size = 0u; + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + recvlen = 1; + recvbuffer[0] = 0x06; + status = this->handle_client_recv(boost::this_thread::get_id(), + recvbuffer, recvlen); + mem_cmp_result = memcmp(this->session_thread_data_map[boost::this_thread::get_id()]->data_buffer.c_array(), recvbuffer.c_array(), recvlen); + BOOST_CHECK_EQUAL(mem_cmp_result, 0); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_size, 1u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_begain_offset, 0u); + BOOST_CHECK_EQUAL(status, CLIENT_RECV); + this->session_thread_data_map.clear(); + } + + cout << "[132]--------------------------------------------- " << endl; + // unit_test[132] 終了フラグがOFFで、 且つ データサイズが0で、 且つ 新SSLレコードで、 + // unit_test[132] 且つdata_begain_offset = 0で,且つcheck_ssl_record_sendable()の戻り値が0(送信可能)の場合、戻り値をREALSERVER_SELECTに設定する。 + { + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->end_flag = END_FLAG_OFF; + up_thread_data->data_size = 0u; + up_thread_data->data_begain_offset = 0u; + up_thread_data->current_record_rest_size = 0u; + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + recvlen = 76; + recvbuffer[0] = 0x16; + recvbuffer[1] = 0x03; + recvbuffer[2] = 0x01; + recvbuffer[3] = 0x00; + recvbuffer[4] = 0x9e; + recvbuffer[5] = 0x01; + recvbuffer[6] = 0x07; + recvbuffer[7] = 0x07; + recvbuffer[8] = 0x07; + recvbuffer[9] = 0x03; + recvbuffer[10] = 0x01; + for(int i=11;ihandle_client_recv(boost::this_thread::get_id(), + recvbuffer, recvlen); + mem_cmp_result = memcmp(this->session_thread_data_map[boost::this_thread::get_id()]->data_buffer.c_array(), recvbuffer.c_array(), recvlen); + BOOST_CHECK_EQUAL(mem_cmp_result, 0); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_size, 76u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_begain_offset, 0u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_record_rest_size, 163u); + BOOST_CHECK(this->session_thread_data_map[boost::this_thread::get_id()]->hello_message_flag); + BOOST_CHECK_EQUAL(status, REALSERVER_SELECT); + this->session_thread_data_map.clear(); + } + + cout << "[133]--------------------------------------------- " << endl; + // unit_test[133] 終了フラグがOFFで、 且つ データサイズが0で、 且つ 新SSLレコードで、 + // unit_test[133] 且つ、data_begain_offset > 0で、且つcheck_ssl_record_sendable()の戻り値が0(送信可能)の場合、戻り値にREALSERVER_SELECTを設定する。 + { + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->end_flag = END_FLAG_OFF; + up_thread_data->data_size = 0u; + up_thread_data->data_begain_offset = 10u; + up_thread_data->current_record_rest_size = 0u; + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + recvlen = 76; + recvbuffer[0] = 0x16; + recvbuffer[1] = 0x03; + recvbuffer[2] = 0x01; + recvbuffer[3] = 0x00; + recvbuffer[4] = 0x9e; + recvbuffer[5] = 0x01; + recvbuffer[6] = 0x08; + recvbuffer[7] = 0x08; + recvbuffer[8] = 0x08; + recvbuffer[9] = 0x03; + recvbuffer[10] = 0x01; + for(int i=11; i< recvlen; i++) + { + recvbuffer[i] = 0x08; + } + status = this->handle_client_recv(boost::this_thread::get_id(), + recvbuffer, recvlen); + mem_cmp_result = memcmp(this->session_thread_data_map[boost::this_thread::get_id()]->data_buffer.c_array(), recvbuffer.c_array(), recvlen); + BOOST_CHECK_EQUAL(mem_cmp_result, 0); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_size, 76u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_begain_offset, 0u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_record_rest_size, 163u); + BOOST_CHECK(this->session_thread_data_map[boost::this_thread::get_id()]->hello_message_flag); + BOOST_CHECK_EQUAL(status, REALSERVER_SELECT); + this->session_thread_data_map.clear(); + } + + cout << "[134]--------------------------------------------- " << endl; + // unit_test[134] 終了フラグがOFFで、 且つ データサイズが0で、 且つ 新SSLレコードで、 + // unit_test[134] 且つ data_begain_offset = 0で、且つ且つcheck_ssl_record_sendable()の戻り値が0(送信可能)の場合、戻り値をREALSERVER_SELECTに設定する。 + { + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->end_flag = END_FLAG_OFF; + up_thread_data->data_size = 0u; + up_thread_data->data_begain_offset = 0u; + up_thread_data->current_record_rest_size = 0u; + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + recvlen = 6; + recvbuffer[0] = 0x17; + recvbuffer[1] = 0x03; + recvbuffer[2] = 0x01; + recvbuffer[3] = 0x00; + recvbuffer[4] = 0x9e; + recvbuffer[5] = 0x09; + status = this->handle_client_recv(boost::this_thread::get_id(), + recvbuffer, recvlen); + mem_cmp_result = memcmp(this->session_thread_data_map[boost::this_thread::get_id()]->data_buffer.c_array(), recvbuffer.c_array(), recvlen); + BOOST_CHECK_EQUAL(mem_cmp_result, 0); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_size, 6u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_begain_offset, 0u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_record_rest_size, 163u); + BOOST_CHECK(!this->session_thread_data_map[boost::this_thread::get_id()]->hello_message_flag); + BOOST_CHECK_EQUAL(status, REALSERVER_SELECT); + this->session_thread_data_map.clear(); + } + + cout << "[135]--------------------------------------------- " << endl; + // unit_test[135] 終了フラグがOFFで、 且つ データサイズが0で、 且つ 新SSLレコードで、 + // unit_test[135] 且つdata_begain_offset > 0で、且つcheck_ssl_record_sendable()の戻り値が0(送信可能)の場合、戻り値がREALSERVER_SELECTで設定する。 + { + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->end_flag = END_FLAG_OFF; + up_thread_data->data_size = 0u; + up_thread_data->data_begain_offset = 10u; + up_thread_data->current_record_rest_size = 0u; + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + recvlen = 6; + recvbuffer[0] = 0x17; + recvbuffer[1] = 0x03; + recvbuffer[2] = 0x01; + recvbuffer[3] = 0x00; + recvbuffer[4] = 0x9e; + recvbuffer[5] = 0x10; + status = this->handle_client_recv(boost::this_thread::get_id(), + recvbuffer, recvlen); + mem_cmp_result = memcmp(this->session_thread_data_map[boost::this_thread::get_id()]->data_buffer.c_array(), recvbuffer.c_array(), recvlen); + BOOST_CHECK_EQUAL(mem_cmp_result, 0); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_size, 6u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_begain_offset, 0u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_record_rest_size, 163u); + BOOST_CHECK(!this->session_thread_data_map[boost::this_thread::get_id()]->hello_message_flag); + BOOST_CHECK_EQUAL(status, REALSERVER_SELECT); + this->session_thread_data_map.clear(); + } + + cout << "[136]--------------------------------------------- " << endl; + // unit_test[136] 終了フラグがOFFで、 且つ データサイズ > 0、且つ新SSLレコードでなくて、且つdata_begain_offset > 0の場合 + // unit_test[136] 戻り値がREALSERVER_SELECTで設定する。 + { + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->end_flag = END_FLAG_OFF; + up_thread_data->data_size = 10u; + up_thread_data->data_begain_offset = 36u; + up_thread_data->current_record_rest_size = 15u; + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + recvlen = 5; + for(int i=0; idata_buffer.c_array() + up_thread_data->data_begain_offset, up_thread_data->data_size); + memcpy(mem_cmp_buffer + up_thread_data->data_size, recvbuffer.c_array(), recvlen); + mem_cmp_length = up_thread_data->data_size + recvlen; + status = this->handle_client_recv(boost::this_thread::get_id(), + recvbuffer, recvlen); + mem_cmp_result = memcmp(this->session_thread_data_map[boost::this_thread::get_id()]->data_buffer.c_array(), mem_cmp_buffer, mem_cmp_length); + BOOST_CHECK_EQUAL(mem_cmp_result, 0); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_size, 15u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_begain_offset, 0u); + BOOST_CHECK_EQUAL(status, REALSERVER_SELECT); + delete[] mem_cmp_buffer; + this->session_thread_data_map.clear(); + } + + cout << "[137]--------------------------------------------- " << endl; + // unit_test[137] 終了フラグがOFFで、且つ データサイズ > 0、且つ新SSLレコードでなくて、且つdata_begain_offset = 0の場合 + // unit_test[137] 戻り値がREALSERVER_SELECTで設定する。 + { + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->end_flag = END_FLAG_OFF; + up_thread_data->data_size = 10u; + up_thread_data->data_begain_offset = 0u; + up_thread_data->current_record_rest_size = 15u; + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + recvlen = 5; + for(int i=0; idata_buffer.c_array() + up_thread_data->data_begain_offset, up_thread_data->data_size); + memcpy(mem_cmp_buffer + up_thread_data->data_size, recvbuffer.c_array(), recvlen); + mem_cmp_length = up_thread_data->data_size + recvlen; + status = this->handle_client_recv(boost::this_thread::get_id(), + recvbuffer, recvlen); + mem_cmp_result = memcmp(this->session_thread_data_map[boost::this_thread::get_id()]->data_buffer.c_array(), mem_cmp_buffer, mem_cmp_length); + BOOST_CHECK_EQUAL(mem_cmp_result, 0); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_size, 15u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_begain_offset, 0u); + BOOST_CHECK_EQUAL(status, REALSERVER_SELECT); + delete[] mem_cmp_buffer; + this->session_thread_data_map.clear(); + } + + cout << "[138]--------------------------------------------- " << endl; + // unit_test[138] 終了フラグがOFFで、且つ データサイズ > 0、且つ新SSLレコードで,且つdata_begain_offset > 0 + // unit_test[138] 且つcheck_ssl_record_sendable()の戻り値が-1(異常)の場合 + // unit_test[138] 戻り値がFINALIZEで設定する。 + { + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->end_flag = END_FLAG_OFF; + up_thread_data->data_size = 10u; + up_thread_data->current_record_rest_size = 0u; + up_thread_data->data_begain_offset = 12u; + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + recvlen = 5; + recvbuffer[0] = 0x00; + for(int i=1; i< recvlen; i++) + { + recvbuffer[i] = 0x13; + } + mem_cmp_buffer = new char[MAX_SSLID_BUFFER_SIZE]; + memcpy(mem_cmp_buffer, up_thread_data->data_buffer.c_array() + up_thread_data->data_begain_offset, up_thread_data->data_size); + memcpy(mem_cmp_buffer + up_thread_data->data_size, recvbuffer.c_array(), recvlen); + mem_cmp_length = up_thread_data->data_size + recvlen; + status = this->handle_client_recv(boost::this_thread::get_id(), + recvbuffer, recvlen); + mem_cmp_result = memcmp(this->session_thread_data_map[boost::this_thread::get_id()]->data_buffer.c_array(), mem_cmp_buffer, mem_cmp_length); + BOOST_CHECK_EQUAL(mem_cmp_result, 0); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_size, 15u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_begain_offset, 0u); + BOOST_CHECK_EQUAL(status, FINALIZE); + delete[] mem_cmp_buffer; + this->session_thread_data_map.clear(); + } + + cout << "[139]--------------------------------------------- " << endl; + // unit_test[139] 終了フラグがOFFで、 且つ データサイズ > 0、且つ新SSLレコードで、且つdata_begain_offset = 0 + // unit_test[139] 且つcheck_ssl_record_sendable()の戻り値が-1 (異常)の場合 + // unit_test[139] 戻り値がFINALIZEで設定する。 + { + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->end_flag = END_FLAG_OFF; + up_thread_data->data_size = 10u; + up_thread_data->current_record_rest_size = 0u; + up_thread_data->data_begain_offset = 0u; + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + recvlen = 5; + recvbuffer[0] = 0x00; + for(int i=1; i< recvlen; i++) + { + recvbuffer[i] = 0x13; + } + mem_cmp_buffer = new char[MAX_SSLID_BUFFER_SIZE]; + memcpy(mem_cmp_buffer, up_thread_data->data_buffer.c_array() + up_thread_data->data_begain_offset, up_thread_data->data_size); + memcpy(mem_cmp_buffer + up_thread_data->data_size, recvbuffer.c_array(), recvlen); + mem_cmp_length = up_thread_data->data_size + recvlen; + status = this->handle_client_recv(boost::this_thread::get_id(), + recvbuffer, recvlen); + mem_cmp_result = memcmp(this->session_thread_data_map[boost::this_thread::get_id()]->data_buffer.c_array(), mem_cmp_buffer, mem_cmp_length); + BOOST_CHECK_EQUAL(mem_cmp_result, 0); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_size, 15u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_begain_offset, 0u); + BOOST_CHECK_EQUAL(status, FINALIZE); + delete[] mem_cmp_buffer; + this->session_thread_data_map.clear(); + } + + cout << "[140]--------------------------------------------- " << endl; + // unit_test[140] 終了フラグがOFFで、 且つ データサイズ > 0、且つ新SSLレコードで、且つdata_begain_offset > 0 + // unit_test[140] 且つcheck_ssl_record_sendable()の戻り値が1 (送信不可)の場合 + // unit_test[140] 戻り値が CLIENT_RECVで設定する。 + { + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->end_flag = END_FLAG_OFF; + up_thread_data->data_size = 1u; + up_thread_data->current_record_rest_size = 0u; + up_thread_data->data_begain_offset = 13u; + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + recvlen = 2; + for(int i=0; idata_buffer.c_array() + up_thread_data->data_begain_offset, up_thread_data->data_size); + memcpy(mem_cmp_buffer + up_thread_data->data_size, recvbuffer.c_array(), recvlen); + mem_cmp_length = up_thread_data->data_size + recvlen; + status = this->handle_client_recv(boost::this_thread::get_id(), + recvbuffer, recvlen); + mem_cmp_result = memcmp(this->session_thread_data_map[boost::this_thread::get_id()]->data_buffer.c_array(), mem_cmp_buffer, mem_cmp_length); + BOOST_CHECK_EQUAL(mem_cmp_result, 0); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_size, 3u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_begain_offset, 0u); + BOOST_CHECK_EQUAL(status, CLIENT_RECV); + delete[] mem_cmp_buffer; + this->session_thread_data_map.clear(); + } + + cout << "[141]--------------------------------------------- " << endl; + // unit_test[141] 終了フラグがOFFで、 且つ データサイズ > 0、且つ新SSLレコードで、且つdata_begain_offset = 0 + // unit_test[141] 且つcheck_ssl_record_sendable()の戻り値が1 (送信不可)の場合 + // unit_test[141] 戻り値が CLIENT_RECVで設定する。 + { + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->end_flag = END_FLAG_OFF; + up_thread_data->data_size = 1u; + up_thread_data->current_record_rest_size = 0u; + up_thread_data->data_begain_offset = 0u; + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + recvlen = 2; + for(int i=0; idata_buffer.c_array() + up_thread_data->data_begain_offset, up_thread_data->data_size); + memcpy(mem_cmp_buffer + up_thread_data->data_size, recvbuffer.c_array(), recvlen); + mem_cmp_length = up_thread_data->data_size + recvlen; + status = this->handle_client_recv(boost::this_thread::get_id(), + recvbuffer, recvlen); + mem_cmp_result = memcmp(this->session_thread_data_map[boost::this_thread::get_id()]->data_buffer.c_array(), mem_cmp_buffer, mem_cmp_length); + BOOST_CHECK_EQUAL(mem_cmp_result, 0); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_size, 3u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_begain_offset, 0u); + BOOST_CHECK_EQUAL(status, CLIENT_RECV); + delete[] mem_cmp_buffer; + this->session_thread_data_map.clear(); + } + + cout << "[142]--------------------------------------------- " << endl; + // unit_test[142] 終了フラグがOFFで、 且つ データサイズ > 0、且つ新SSLレコードで、且つdata_begain_offset > 0 + // unit_test[142] 且つcheck_ssl_record_sendable()の戻り値が0(送信可能)の場合 + // unit_test[142] 戻り値がREALSERVER_SELECTで設定する。 + { + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->end_flag = END_FLAG_OFF; + up_thread_data->data_size = 3u; + up_thread_data->data_begain_offset = 12u; + up_thread_data->current_record_rest_size = 0u; + up_thread_data->data_buffer[12] = 0x16; + up_thread_data->data_buffer[13] = 0x03; + up_thread_data->data_buffer[14] = 0x01; + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + recvlen = 76; + recvbuffer[0] = 0x00; + recvbuffer[1] = 0x9e; + recvbuffer[2] = 0x01; + recvbuffer[3] = 0x00; + recvbuffer[4] = 0x9e; + recvbuffer[5] = 0x00; + recvbuffer[6] = 0x03; + recvbuffer[7] = 0x01; + for(int i=8; idata_buffer.c_array() + up_thread_data->data_begain_offset, up_thread_data->data_size); + memcpy(mem_cmp_buffer + up_thread_data->data_size, recvbuffer.c_array(), recvlen); + mem_cmp_length = up_thread_data->data_size + recvlen; + status = this->handle_client_recv(boost::this_thread::get_id(), + recvbuffer, recvlen); + mem_cmp_result = memcmp(this->session_thread_data_map[boost::this_thread::get_id()]->data_buffer.c_array(), mem_cmp_buffer, mem_cmp_length); + BOOST_CHECK_EQUAL(mem_cmp_result, 0); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_size, 79u); + BOOST_CHECK(this->session_thread_data_map[boost::this_thread::get_id()]->hello_message_flag); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_begain_offset, 0u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_record_rest_size, 163u); + BOOST_CHECK_EQUAL(status, REALSERVER_SELECT); + delete[] mem_cmp_buffer; + this->session_thread_data_map.clear(); + } + + cout << "[143]--------------------------------------------- " << endl; + // unit_test[143] 終了フラグがOFFで、 且つ データサイズ > 0、且つ新SSLレコードで、且つdata_begain_offset = 12 + // unit_test[143] 且つheck_ssl_record_sendable()の戻り値が0(送信可能)の場合 + // unit_test[143] 戻り値がREALSERVER_SELECTで設定する。 + { + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->end_flag = END_FLAG_OFF; + up_thread_data->data_size = 3u; + up_thread_data->data_begain_offset = 12u; + up_thread_data->current_record_rest_size = 0u; + up_thread_data->data_buffer[12] = 0x16; + up_thread_data->data_buffer[13] = 0x03; + up_thread_data->data_buffer[14] = 0x01; + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + recvlen = 76; + recvbuffer[0] = 0x00; + recvbuffer[1] = 0x9e; + recvbuffer[2] = 0x01; + recvbuffer[3] = 0x00; + recvbuffer[4] = 0x9e; + recvbuffer[5] = 0x00; + recvbuffer[6] = 0x03; + recvbuffer[7] = 0x01; + for(int i=8; idata_buffer.c_array() + up_thread_data->data_begain_offset, up_thread_data->data_size); + memcpy(mem_cmp_buffer + up_thread_data->data_size, recvbuffer.c_array(), recvlen); + mem_cmp_length = up_thread_data->data_size + recvlen; + status = this->handle_client_recv(boost::this_thread::get_id(), + recvbuffer, recvlen); + mem_cmp_result = memcmp(this->session_thread_data_map[boost::this_thread::get_id()]->data_buffer.c_array(), mem_cmp_buffer, mem_cmp_length); + BOOST_CHECK_EQUAL(mem_cmp_result, 0); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_size, 79u); + BOOST_CHECK(this->session_thread_data_map[boost::this_thread::get_id()]->hello_message_flag); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_begain_offset, 0u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_record_rest_size, 163u); + BOOST_CHECK_EQUAL(status, REALSERVER_SELECT); + delete[] mem_cmp_buffer; + this->session_thread_data_map.clear(); + } + + cout << "[144]--------------------------------------------- " << endl; + // unit_test[144] 終了フラグがOFFで、且つ データサイズ > 0、且つ新SSLレコードで、且つdata_begain_offset > 0 + // unit_test[144] 且つheck_ssl_record_sendable()の戻り値が0(送信可能)の場合 + // unit_test[144] 戻り値がREALSERVER_SELECTで設定する。 + { + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->end_flag = END_FLAG_OFF; + up_thread_data->data_size = 3u; + up_thread_data->data_begain_offset = 12u; + up_thread_data->current_record_rest_size = 0u; + up_thread_data->data_buffer[12] = 0x17; + up_thread_data->data_buffer[13] = 0x03; + up_thread_data->data_buffer[14] = 0x01; + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + recvlen = 6; + recvbuffer[0] = 0x00; + recvbuffer[1] = 0x9e; + for(int i=2; idata_buffer.c_array() + up_thread_data->data_begain_offset, up_thread_data->data_size); + memcpy(mem_cmp_buffer + up_thread_data->data_size, recvbuffer.c_array(), recvlen); + mem_cmp_length = up_thread_data->data_size + recvlen; + status = this->handle_client_recv(boost::this_thread::get_id(), + recvbuffer, recvlen); + mem_cmp_result = memcmp(this->session_thread_data_map[boost::this_thread::get_id()]->data_buffer.c_array(), mem_cmp_buffer, mem_cmp_length); + BOOST_CHECK_EQUAL(mem_cmp_result, 0); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_size, 9u); + BOOST_CHECK(!this->session_thread_data_map[boost::this_thread::get_id()]->hello_message_flag); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_begain_offset, 0u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_record_rest_size, 163u); + BOOST_CHECK_EQUAL(status, REALSERVER_SELECT); + delete[] mem_cmp_buffer; + this->session_thread_data_map.clear(); + } + + cout << "[145]--------------------------------------------- " << endl; + // unit_test[145] 終了フラグがOFFで、且つ データサイズ > 0、且つ新SSLレコードで、且つdata_begain_offset = 0 + // unit_test[145] 且つcheck_ssl_record_sendable()の戻り値が0(送信可能)の場合 + // unit_test[145] 戻り値がREALSERVER_SELECTで設定する。 + { + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->end_flag = END_FLAG_OFF; + up_thread_data->data_size = 3u; + up_thread_data->data_begain_offset = 0u; + up_thread_data->current_record_rest_size = 0u; + up_thread_data->data_buffer[0] = 0x17; + up_thread_data->data_buffer[1] = 0x03; + up_thread_data->data_buffer[2] = 0x01; + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + recvlen = 6; + recvbuffer[0] = 0x00; + recvbuffer[1] = 0x9e; + for(int i=2; idata_buffer.c_array() + up_thread_data->data_begain_offset, up_thread_data->data_size); + memcpy(mem_cmp_buffer + up_thread_data->data_size, recvbuffer.c_array(), recvlen); + mem_cmp_length = up_thread_data->data_size + recvlen; + status = this->handle_client_recv(boost::this_thread::get_id(), + recvbuffer, recvlen); + mem_cmp_result = memcmp(this->session_thread_data_map[boost::this_thread::get_id()]->data_buffer.c_array(), mem_cmp_buffer, mem_cmp_length); + BOOST_CHECK_EQUAL(mem_cmp_result, 0); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_size, 9u); + BOOST_CHECK(!this->session_thread_data_map[boost::this_thread::get_id()]->hello_message_flag); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_begain_offset, 0u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_record_rest_size, 163u); + BOOST_CHECK_EQUAL(status, REALSERVER_SELECT); + delete[] mem_cmp_buffer; + this->session_thread_data_map.clear(); + } + + cout << "[146]--------------------------------------------- " << endl; + // unit_test[146] 受信データサイズ > 受信バッファサイズの場合 + // unit_test[146] 戻り値がFINALIZEで設定する。 + recvlen = recvbuffer.size() + 1; + status = this->handle_client_recv(boost::this_thread::get_id(), + recvbuffer, recvlen); + BOOST_CHECK_EQUAL(status, FINALIZE); + + cout << "[147]--------------------------------------------- " << endl; + // unit_test[147] スレッドIDがmapに存在しない場合 + // unit_test[147] 戻り値がFINALIZEで設定する。 + status = this->handle_client_recv(boost::this_thread::get_id(), + recvbuffer, recvlen); + BOOST_CHECK_EQUAL(status, FINALIZE); + + cout << "[148]--------------------------------------------- " << endl; + // unit_test[148] 終了フラグがOFFで,且つ data_size+recvlen > MAX_SSLID_BUFFER_SIZEの場合 + // unit_test[148] 戻り値がFINALIZEで設定する。 + { + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->end_flag = END_FLAG_OFF; + up_thread_data->data_size = static_cast(MAX_BUFFER_SIZE) + 76u; + up_thread_data->data_begain_offset = 0u; + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + recvlen = 10; + status = this->handle_client_recv(boost::this_thread::get_id(), + recvbuffer, recvlen); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->end_flag, END_FLAG_ON); + BOOST_CHECK_EQUAL(status, FINALIZE); + this->session_thread_data_map.clear(); + } + + + } + + //handle_client_recv + void handle_client_recv_test_thread() { + + boost::array recvbuffer; + int recvlen = 0; + EVENT_TAG status; + char* mem_cmp_buffer; + int mem_cmp_result; + int mem_cmp_length; + + cout << "[149]--------------------------------------------- " << endl; + // unit_test[149] 終了フラグがOFFで、且つ データサイズ > 0、且つ新SSLレコードで、且つdata_begain_offset > 0 + // unit_test[149] 且つheck_ssl_record_sendable()の戻り値が0(送信可能)の場合 + // unit_test[149] 戻り値がREALSERVER_SELECTで設定する。 + { + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->end_flag = END_FLAG_OFF; + up_thread_data->data_size = 3u; + up_thread_data->data_begain_offset = 12u; + up_thread_data->current_record_rest_size = 0u; + up_thread_data->data_buffer[12] = 0x17; + up_thread_data->data_buffer[13] = 0x03; + up_thread_data->data_buffer[14] = 0x01; + { + boost::mutex::scoped_lock sclock(this->session_thread_data_map_mutex); + this->session_thread_data_map[boost::this_thread::get_id()] = up_thread_data; + } + recvlen = 6; + recvbuffer[0] = 0x00; + recvbuffer[1] = 0x9e; + for(int i=2; idata_buffer.c_array() + up_thread_data->data_begain_offset, up_thread_data->data_size); + memcpy(mem_cmp_buffer + up_thread_data->data_size, recvbuffer.c_array(), recvlen); + mem_cmp_length = up_thread_data->data_size + recvlen; + status = this->handle_client_recv(boost::this_thread::get_id(), recvbuffer, recvlen); + mem_cmp_result = memcmp(this->session_thread_data_map[boost::this_thread::get_id()]->data_buffer.c_array(), mem_cmp_buffer, mem_cmp_length); + { + boost::mutex::scoped_lock sclock(check_mutex); + BOOST_CHECK_EQUAL(mem_cmp_result, 0); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_size, 9u); + BOOST_CHECK(!this->session_thread_data_map[boost::this_thread::get_id()]->hello_message_flag); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_begain_offset, 0u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_record_rest_size, 163u); + BOOST_CHECK_EQUAL(status, REALSERVER_SELECT); + } + delete[] mem_cmp_buffer; + } + } + + //handle_realserver_select(tcp) + void handle_realserver_select_tcp_test() { + + EVENT_TAG status; + boost::asio::ip::tcp::endpoint rs_endpoint; + boost::asio::ip::tcp::endpoint comp_endpoint; + boost::asio::ip::tcp::endpoint + ep1(boost::asio::ip::address::from_string("192.168.120.249"), + 12345); + boost::asio::ip::tcp::endpoint ep2; + int maxlist = 1; + char* sslid_replication_area_begain = new char[10]; + int sslid_replication_area_size = 0; + boost::asio::ip::tcp::endpoint virtual_service_endpoint; + std::string session_id; + boost::function ingetloglevel = stb_getloglevel; + boost::function inputLogFatal = stb_putLogFatal; + boost::function inputLogError = stb_putLogError; + boost::function inputLogWarn = stb_putLogWarn; + boost::function inputLogInfo = stb_putLogInfo; + boost::function inputLogDebug = stb_putLogDebug; + realserverlist_type rs_list; + + this->rs_list_begin = boost::bind(&rslist_begin_func, &rs_list); + this->rs_list_end = boost::bind(&rslist_end_func, &rs_list); + this->rs_list_next = boost::bind(&rslist_next_func, _1); + this->rs_list_lock = rslist_lock_func; + this->rs_list_unlock = rslist_unlock_func; + + + cout << "[150]--------------------------------------------- " << endl; + // unit_test[150] realserver接続回数が最大回数の場合、戻り値がCLIENT_DISCONNECTで設定する。 + { + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->realserver_connect_failed_count + = this->realserver_connect_failed_max_count; + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + status = this->handle_realserver_select(boost::this_thread::get_id(), + rs_endpoint); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->end_flag, END_FLAG_ON); + BOOST_CHECK_EQUAL(status, CLIENT_DISCONNECT); + this->session_thread_data_map.clear(); + } + + cout << "[151]--------------------------------------------- " << endl; + // unit_test[151] realserver接続回数が最大回数を越える場合、戻り値がCLIENT_DISCONNECTで設定する。 + { + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->realserver_connect_failed_count + = this->realserver_connect_failed_max_count + 1; + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + status = this->handle_realserver_select(boost::this_thread::get_id(), + rs_endpoint); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->end_flag, END_FLAG_ON); + BOOST_CHECK_EQUAL(status, CLIENT_DISCONNECT); + this->session_thread_data_map.clear(); + } + + cout << "[152]--------------------------------------------- " << endl; + // unit_test[152] realserver接続回数が最大回数に未満で, reschedule が 1(ON)、endpointが決定の場合 + // unit_test[152] 戻り値が REALSERVER_CONNECTで設定する。 + { + this->schedule_tcp = schedule_tcp_func1; + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->realserver_connect_failed_count + = this->realserver_connect_failed_max_count - 1; + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + this->reschedule = 1; + status = this->handle_realserver_select(boost::this_thread::get_id(), + rs_endpoint); + BOOST_CHECK(this->session_thread_data_map[boost::this_thread::get_id()]->selected_realserver != comp_endpoint); + BOOST_CHECK_EQUAL(status, REALSERVER_CONNECT); + this->session_thread_data_map.clear(); + } + + cout << "[153]--------------------------------------------- " << endl; + // unit_test[153] realserver接続回数が最大回数に未満で, reschedule が 1(ON)、endpointが未決定の場合 + // unit_test[153] 戻り値が CLIENT_DISCONNECTで設定する。 + { + this->schedule_tcp = schedule_tcp_func2; + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->realserver_connect_failed_count + = this->realserver_connect_failed_max_count - 1; + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + this->reschedule = 1; + status = this->handle_realserver_select(boost::this_thread::get_id(), + rs_endpoint); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->end_flag, END_FLAG_ON); + BOOST_CHECK_EQUAL(status, CLIENT_DISCONNECT); + this->session_thread_data_map.clear(); + } + + cout << "[154]--------------------------------------------- " << endl; + // unit_test[154] realserver接続回数が最大回数に未満で, 且つreschedule が 0 (OFF)の場合 + // unit_test[154] 戻り値が CLIENT_DISCONNECTで設定する。 + { + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->realserver_connect_failed_count + = this->realserver_connect_failed_max_count - 1; + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + this->reschedule = 0; + status = this->handle_realserver_select(boost::this_thread::get_id(), + rs_endpoint); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->end_flag, END_FLAG_ON); + BOOST_CHECK_EQUAL(status, CLIENT_DISCONNECT); + this->session_thread_data_map.clear(); + } + + cout << "[155]--------------------------------------------- " << endl; + // unit_test[155] realserverの接続失敗回数が0, 且つselected_realserver が NULLでない場合 + // unit_test[155] 戻り値がREALSERVER_CONNECTで設定する。 + { + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->realserver_connect_failed_count = 0; + up_thread_data->selected_realserver = ep1; + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + status = this->handle_realserver_select(boost::this_thread::get_id(), + rs_endpoint); + BOOST_CHECK_EQUAL(status, REALSERVER_CONNECT); + this->session_thread_data_map.clear(); + } + + cout << "[156]--------------------------------------------- " << endl; + // unit_test[156] realserverの接続失敗回数が0, 且つselected_realserver が NULLで、 且つhello_message_flagがfalseの場合 + // unit_test[156] 戻り値がFINALIZEで設定する。 + { + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->realserver_connect_failed_count = 0; + up_thread_data->selected_realserver = ep2; + up_thread_data->hello_message_flag = false; + up_thread_data->end_flag = END_FLAG_OFF; + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + status = this->handle_realserver_select(boost::this_thread::get_id(), + rs_endpoint); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->end_flag, END_FLAG_ON); + BOOST_CHECK_EQUAL(status, FINALIZE); + this->session_thread_data_map.clear(); + } + + cout << "[157]--------------------------------------------- " << endl; + // unit_test[157] realserverの接続失敗回数が0, 且つselected_realserver が NULLで、 且つhello_message_flagがtrueで + // unit_test[157] 且つendpointが決定の場合 + // unit_test[157] 戻り値がREALSERVER_CONNECTで設定する。 + { + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->realserver_connect_failed_count = 0; + up_thread_data->selected_realserver = ep2; + up_thread_data->hello_message_flag = true; + up_thread_data->data_buffer[43] = 0x00; + up_thread_data->data_size = 76u; + up_thread_data->data_begain_offset = 0u; + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + this->schedule_tcp = schedule_tcp_func1; + status = this->handle_realserver_select(boost::this_thread::get_id(), + rs_endpoint); + BOOST_CHECK(this->session_thread_data_map[boost::this_thread::get_id()]->selected_realserver != comp_endpoint); + BOOST_CHECK_EQUAL(status, REALSERVER_CONNECT); + this->session_thread_data_map.clear(); + } + + cout << "[158]--------------------------------------------- " << endl; + // unit_test[158] realserver接続失敗回数が0で, 且つselected_realserverがNULLで、且つhello_message_flagがtrueで + // unit_test[158] 且つセッションIDがなくで、且つendpointが未決定の場合 + // unit_test[158] 戻り値がCLIENT_DISCONNECTで設定する。 + { + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->realserver_connect_failed_count = 0; + up_thread_data->selected_realserver = ep2; + up_thread_data->hello_message_flag = true; + up_thread_data->data_buffer[43] = 0x00; + up_thread_data->data_size = 76u; + up_thread_data->end_flag = END_FLAG_OFF; + up_thread_data->data_begain_offset = 0u; + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + this->schedule_tcp = schedule_tcp_func2; + status = this->handle_realserver_select(boost::this_thread::get_id(), + rs_endpoint); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->end_flag, END_FLAG_ON); + BOOST_CHECK_EQUAL(status, CLIENT_DISCONNECT); + this->session_thread_data_map.clear(); + } + + cout << "[159]--------------------------------------------- " << endl; + // unit_test[159] realserver接続失敗回数が0で, 且つselected_realserverがNULLで、且つhello_message_flagがtrueで + // unit_test[159] 且つセッションIDがあるで, 且つendpointが決定の場合 + // unit_test[159] rsリストを検索し、realserver endpoint が存在する場合 + // unit_test[159] endpointでselected_realserverを設定する + // unit_test[159] 戻り値がREALSERVER_CONNECTで設定する。 + { + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->realserver_connect_failed_count = 0; + up_thread_data->selected_realserver = ep2; + up_thread_data->hello_message_flag = true; + up_thread_data->data_buffer[43] = 0x20; + up_thread_data->data_size = 76u; + up_thread_data->data_begain_offset = 0u; + for (int i = 0; i < 32; i++) { + up_thread_data->data_buffer[44 + i] = 0x01; + } + + this->schedule_tcp = boost::bind(&schedule_tcp_func3, _1, _2, _3, _4, _5, ep1); + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + char* temp_data_buffer = up_thread_data->data_buffer.c_array(); + session_id.assign(temp_data_buffer + 44, temp_data_buffer + 76); + this->replication_data_processor = new sslid_replication_data_processor(maxlist, sslid_replication_area_begain, + sslid_replication_area_size, virtual_service_endpoint, ingetloglevel, inputLogFatal, inputLogError, + inputLogWarn, inputLogInfo, inputLogDebug); + this->session_data_processor = new sslid_session_data_processor_stub( + 1024, 3600, this->replication_data_processor, ingetloglevel, + inputLogFatal, inputLogError, inputLogWarn, inputLogInfo, + inputLogDebug); + (dynamic_cast (session_data_processor))->get_session_endpoint_map()[session_id] + = ep1; + time_t last_time = time(0); + (dynamic_cast (session_data_processor))->get_session_lasttime_map()[session_id] + = last_time; + + rs_list.clear(); + realserver server; + server.tcp_endpoint = ep1; + rs_list.push_back(server); + + status = this->handle_realserver_select(boost::this_thread::get_id(), + rs_endpoint); + BOOST_CHECK_EQUAL(status, REALSERVER_CONNECT); + BOOST_CHECK_EQUAL(up_thread_data->selected_realserver, ep1); + delete this->session_data_processor; + this->session_thread_data_map.clear(); + } + cout << "[160]--------------------------------------------- " << endl; + // unit_test[160] realserver接続失敗回数が0で, 且つselected_realserverがNULLで、且つhello_message_flagがtrueで + // unit_test[160] 且つセッションIDがあるで, 且つendpointが決定の場合 + // unit_test[160] rsリストを検索し、realserver endpoint が存在しない場合 + // unit_test[160] rescheduleモード + // unit_test[160] endpoint = 決定 + // unit_test[160] endpointでselected_realserverを設定する + // unit_test[160] 戻り値がREALSERVER_CONNECTで設定する。 + { + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->realserver_connect_failed_count = 0; + up_thread_data->selected_realserver = ep2; + up_thread_data->hello_message_flag = true; + up_thread_data->data_buffer[43] = 0x20; + up_thread_data->data_size = 76u; + up_thread_data->data_begain_offset = 0u; + this->reschedule = 1; + for (int i = 0; i < 32; i++) { + up_thread_data->data_buffer[44 + i] = 0x01; + } + + this->schedule_tcp = boost::bind(&schedule_tcp_func3, _1, _2, _3, _4, _5, ep1); + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + char* temp_data_buffer = up_thread_data->data_buffer.c_array(); + session_id.assign(temp_data_buffer + 44, temp_data_buffer + 76); + this->replication_data_processor = new sslid_replication_data_processor(maxlist, sslid_replication_area_begain, + sslid_replication_area_size, virtual_service_endpoint, ingetloglevel, inputLogFatal, inputLogError, + inputLogWarn, inputLogInfo, inputLogDebug); + this->session_data_processor = new sslid_session_data_processor_stub( + 1024, 3600, this->replication_data_processor, ingetloglevel, + inputLogFatal, inputLogError, inputLogWarn, inputLogInfo, + inputLogDebug); + (dynamic_cast (session_data_processor))->get_session_endpoint_map()[session_id] + = ep1; + time_t last_time = time(0); + (dynamic_cast (session_data_processor))->get_session_lasttime_map()[session_id] + = last_time; + + rs_list.clear(); + + status = this->handle_realserver_select(boost::this_thread::get_id(), + rs_endpoint); + BOOST_CHECK_EQUAL(status, REALSERVER_CONNECT); + BOOST_CHECK_EQUAL(up_thread_data->selected_realserver, ep1); + delete this->session_data_processor; + this->session_thread_data_map.clear(); + } + cout << "[161]--------------------------------------------- " << endl; + // unit_test[161] realserver接続失敗回数が0で, 且つselected_realserverがNULLで、且つhello_message_flagがtrueで + // unit_test[161] 且つセッションIDがあるで, 且つendpointが決定の場合 + // unit_test[161] rsリストを検索し、realserver endpoint が存在しない場合 + // unit_test[161] rescheduleモード + // unit_test[161] endpoint = 未決定 + // unit_test[161] 終了フラグをONにする + // unit_test[161] 戻り値がCLIENT_DISCONNECTで設定する。 + { + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->realserver_connect_failed_count = 0; + up_thread_data->selected_realserver = ep2; + up_thread_data->hello_message_flag = true; + up_thread_data->data_buffer[43] = 0x20; + up_thread_data->data_size = 76u; + up_thread_data->data_begain_offset = 0u; + this->reschedule = 1; + up_thread_data->end_flag = END_FLAG_OFF; + for (int i = 0; i < 32; i++) { + up_thread_data->data_buffer[44 + i] = 0x01; + } + + this->schedule_tcp = schedule_tcp_func2; + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + char* temp_data_buffer = up_thread_data->data_buffer.c_array(); + session_id.assign(temp_data_buffer + 44, temp_data_buffer + 76); + this->replication_data_processor = new sslid_replication_data_processor(maxlist, sslid_replication_area_begain, + sslid_replication_area_size, virtual_service_endpoint, ingetloglevel, inputLogFatal, inputLogError, + inputLogWarn, inputLogInfo, inputLogDebug); + this->session_data_processor = new sslid_session_data_processor_stub( + 1024, 3600, this->replication_data_processor, ingetloglevel, + inputLogFatal, inputLogError, inputLogWarn, inputLogInfo, + inputLogDebug); + (dynamic_cast (session_data_processor))->get_session_endpoint_map()[session_id] + = ep1; + time_t last_time = time(0); + (dynamic_cast (session_data_processor))->get_session_lasttime_map()[session_id] + = last_time; + + rs_list.clear(); + + status = this->handle_realserver_select(boost::this_thread::get_id(), + rs_endpoint); + BOOST_CHECK_EQUAL(status, CLIENT_DISCONNECT); + BOOST_CHECK_EQUAL(up_thread_data->end_flag, END_FLAG_ON); + delete this->session_data_processor; + this->session_thread_data_map.clear(); + } + cout << "[162]--------------------------------------------- " << endl; + // unit_test[162] realserver接続失敗回数が0で, 且つselected_realserverがNULLで、且つhello_message_flagがtrueで + // unit_test[162] 且つセッションIDがあるで, 且つendpointが決定の場合 + // unit_test[162] rsリストを検索し、realserver endpoint が存在しない場合 + // unit_test[162] no rescheduleモード + // unit_test[162] 終了フラグをONにする + // unit_test[162] 戻り値がCLIENT_DISCONNECTで設定する。 + { + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->realserver_connect_failed_count = 0; + up_thread_data->selected_realserver = ep2; + up_thread_data->hello_message_flag = true; + up_thread_data->data_buffer[43] = 0x20; + up_thread_data->data_size = 76u; + up_thread_data->data_begain_offset = 0u; + this->reschedule = 0; + up_thread_data->end_flag = END_FLAG_OFF; + for (int i = 0; i < 32; i++) { + up_thread_data->data_buffer[44 + i] = 0x01; + } + + this->schedule_tcp = schedule_tcp_func2; + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + char* temp_data_buffer = up_thread_data->data_buffer.c_array(); + session_id.assign(temp_data_buffer + 44, temp_data_buffer + 76); + this->replication_data_processor = new sslid_replication_data_processor(maxlist, sslid_replication_area_begain, + sslid_replication_area_size, virtual_service_endpoint, ingetloglevel, inputLogFatal, inputLogError, + inputLogWarn, inputLogInfo, inputLogDebug); + this->session_data_processor = new sslid_session_data_processor_stub( + 1024, 3600, this->replication_data_processor, ingetloglevel, + inputLogFatal, inputLogError, inputLogWarn, inputLogInfo, + inputLogDebug); + (dynamic_cast (session_data_processor))->get_session_endpoint_map()[session_id] + = ep1; + time_t last_time = time(0); + (dynamic_cast (session_data_processor))->get_session_lasttime_map()[session_id] + = last_time; + + rs_list.clear(); + + status = this->handle_realserver_select(boost::this_thread::get_id(), + rs_endpoint); + BOOST_CHECK_EQUAL(status, CLIENT_DISCONNECT); + BOOST_CHECK_EQUAL(up_thread_data->end_flag, END_FLAG_ON); + delete this->session_data_processor; + this->session_thread_data_map.clear(); + } + cout << "[163]--------------------------------------------- " << endl; + // unit_test[163] realserver接続失敗回数が0で, 且つselected_realserverがNULLで、且つhello_message_flagがtrueで + // unit_test[163] 且つセッションIDがあり, endpointが未決定で、reschedule後、endpointが決定の場合 + // unit_test[163] 戻り値がREALSERVER_CONNECTで設定する。 + { + this->schedule_tcp = schedule_tcp_func1; + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->realserver_connect_failed_count = 0; + up_thread_data->selected_realserver = ep2; + up_thread_data->hello_message_flag = true; + up_thread_data->data_buffer[43] = 0x20; + up_thread_data->data_begain_offset = 0u; + for (int i = 0; i < 32; i++) { + up_thread_data->data_buffer[44 + i] = 0x01; + } + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + this->reschedule = 1; + this->replication_data_processor = new sslid_replication_data_processor(maxlist, sslid_replication_area_begain, + sslid_replication_area_size, virtual_service_endpoint, ingetloglevel, inputLogFatal, inputLogError, + inputLogWarn, inputLogInfo, inputLogDebug); + this->session_data_processor = new sslid_session_data_processor_stub( + 1024, 3600, this->replication_data_processor, ingetloglevel, + inputLogFatal, inputLogError, inputLogWarn, inputLogInfo, + inputLogDebug); + status = this->handle_realserver_select(boost::this_thread::get_id(), + rs_endpoint); + BOOST_CHECK_EQUAL(status, REALSERVER_CONNECT); + delete this->session_data_processor; + this->session_thread_data_map.clear(); + } + + cout << "[164]--------------------------------------------- " << endl; + // unit_test[164] realserver接続失敗回数が0で, 且つselected_realserverがNULLで、且つhello_message_flagがtrueで + // unit_test[164] 且つセッションIDがあり, endpointが未決定で、reschedule後、endpointも未決定の場合 + // unit_test[164] 戻り値がCLIENT_DISCONNECTで設定する。 + { + this->schedule_tcp = schedule_tcp_func2; + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->realserver_connect_failed_count = 0; + up_thread_data->selected_realserver = ep2; + up_thread_data->hello_message_flag = true; + up_thread_data->data_buffer[43] = 0x20; + up_thread_data->data_begain_offset = 0u; + for (int i = 0; i < 32; i++) { + up_thread_data->data_buffer[44 + i] = 0x01; + } + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + this->reschedule = 1; + this->replication_data_processor = new sslid_replication_data_processor(maxlist, sslid_replication_area_begain, + sslid_replication_area_size, virtual_service_endpoint, ingetloglevel, inputLogFatal, inputLogError, + inputLogWarn, inputLogInfo, inputLogDebug); + this->session_data_processor = new sslid_session_data_processor_stub( + 1024, 3600, this->replication_data_processor, ingetloglevel, + inputLogFatal, inputLogError, inputLogWarn, inputLogInfo, + inputLogDebug); + status = this->handle_realserver_select(boost::this_thread::get_id(), + rs_endpoint); + BOOST_CHECK_EQUAL(status, CLIENT_DISCONNECT); + delete this->session_data_processor; + this->session_thread_data_map.clear(); + } + + cout << "[165]--------------------------------------------- " << endl; + // unit_test[165] realserver接続失敗回数が0で, 且つselected_realserverがNULLで, 且つhello_message_flagがtrueで + // unit_test[165] 且つセッションIDがあり, endpointが未決定で、且つ no rescheduleの場合 + // unit_test[165] 戻り値がCLIENT_DISCONNECTで設定する。 + { + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->realserver_connect_failed_count = 0; + up_thread_data->selected_realserver = ep2; + up_thread_data->hello_message_flag = true; + up_thread_data->data_buffer[43] = 0x20; + up_thread_data->data_begain_offset = 0u; + for (int i = 0; i < 32; i++) { + up_thread_data->data_buffer[44 + i] = 0x01; + } + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + this->reschedule = 0; + this->replication_data_processor = new sslid_replication_data_processor(maxlist, sslid_replication_area_begain, + sslid_replication_area_size, virtual_service_endpoint, ingetloglevel, inputLogFatal, inputLogError, + inputLogWarn, inputLogInfo, inputLogDebug); + this->session_data_processor = new sslid_session_data_processor_stub( + 1024, 3600, this->replication_data_processor, ingetloglevel, + inputLogFatal, inputLogError, inputLogWarn, inputLogInfo, + inputLogDebug); + status = this->handle_realserver_select(boost::this_thread::get_id(), + rs_endpoint); + BOOST_CHECK_EQUAL(status, CLIENT_DISCONNECT); + this->session_thread_data_map.clear(); + } + + cout << "[166]--------------------------------------------- " << endl; + // unit_test[166] realserver接続失敗回数が0で, 且つselected_realserver が NULLないの場合 + // unit_test[166] 戻り値がREALSERVER_CONNECTで設定する。 + { + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->realserver_connect_failed_count = -1; + up_thread_data->selected_realserver = ep1; + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + status = this->handle_realserver_select(boost::this_thread::get_id(), + rs_endpoint); + BOOST_CHECK_EQUAL(status, REALSERVER_CONNECT); + this->session_thread_data_map.clear(); + } + + cout << "[167]--------------------------------------------- " << endl; + // unit_test[167] realserver接続失敗回数が0で, 且つselected_realserver が NULLで, 且つhello_message_flag が falseの場合 + // unit_test[167] 戻り値がFINALIZEで設定する。 + { + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->realserver_connect_failed_count = -1; + up_thread_data->selected_realserver = ep2; + up_thread_data->hello_message_flag = false; + up_thread_data->end_flag = END_FLAG_OFF; + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + status = this->handle_realserver_select(boost::this_thread::get_id(), + rs_endpoint); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->end_flag, END_FLAG_ON); + BOOST_CHECK_EQUAL(status, FINALIZE); + this->session_thread_data_map.clear(); + } + + cout << "[168]--------------------------------------------- " << endl; + // unit_test[168] realserver接続失敗回数 < 0で, 且つselected_realserver が NULLで, 且つhello_message_flag が trueで + // unit_test[168] 且つセッションIDがなくで、且つendpointが決定の場合 + // unit_test[168] 戻り値がREALSERVER_CONNECT設定する。 + { + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->realserver_connect_failed_count = -1; + up_thread_data->selected_realserver = ep2; + up_thread_data->hello_message_flag = true; + up_thread_data->data_buffer[43] = 0x00; + up_thread_data->data_size = 76u; + up_thread_data->data_begain_offset = 0u; + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + this->schedule_tcp = schedule_tcp_func1; + status = this->handle_realserver_select(boost::this_thread::get_id(), + rs_endpoint); + BOOST_CHECK(this->session_thread_data_map[boost::this_thread::get_id()]->selected_realserver != comp_endpoint); + BOOST_CHECK_EQUAL(status, REALSERVER_CONNECT); + this->session_thread_data_map.clear(); + } + + cout << "[169]--------------------------------------------- " << endl; + // unit_test[169] realserver接続失敗回数 < 0で, 且つselected_realserver が NULLで, 且つhello_message_flag が trueで + // unit_test[169] 且つセッションIDがなくで、且つendpointが未決定の場合 + // unit_test[169] 戻り値がCLIENT_DISCONNECTで設定する。 + { + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->realserver_connect_failed_count = -1; + up_thread_data->selected_realserver = ep2; + up_thread_data->hello_message_flag = true; + up_thread_data->data_buffer[43] = 0x00; + up_thread_data->data_size = 76u; + up_thread_data->data_begain_offset = 0u; + up_thread_data->end_flag = END_FLAG_OFF; + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + this->schedule_tcp = schedule_tcp_func2; + status = this->handle_realserver_select(boost::this_thread::get_id(), + rs_endpoint); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->end_flag, END_FLAG_ON); + BOOST_CHECK_EQUAL(status, CLIENT_DISCONNECT); + this->session_thread_data_map.clear(); + } + + cout << "[170]--------------------------------------------- " << endl; + // unit_test[170] realserver接続失敗回数< 0で, 且つselected_realserverがNULLで、且つhello_message_flagがtrueで + // unit_test[170] 且つセッションIDがあるで, 且つendpointが決定の場合 + // unit_test[170] rsリストを検索し、realserver endpoint が存在する場合 + // unit_test[170] endpointでselected_realserverを設定する + // unit_test[170] 戻り値がREALSERVER_CONNECTで設定する。 + { + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->realserver_connect_failed_count = -1; + up_thread_data->selected_realserver = ep2; + up_thread_data->hello_message_flag = true; + up_thread_data->data_buffer[43] = 0x20; + up_thread_data->data_size = 76u; + up_thread_data->data_begain_offset = 0u; + for (int i = 0; i < 32; i++) { + up_thread_data->data_buffer[44 + i] = 0x01; + } + + this->schedule_tcp = boost::bind(&schedule_tcp_func3, _1, _2, _3, _4, _5, ep1); + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + char* temp_data_buffer = up_thread_data->data_buffer.c_array(); + session_id.assign(temp_data_buffer + 44, temp_data_buffer + 76); + this->replication_data_processor = new sslid_replication_data_processor(maxlist, sslid_replication_area_begain, + sslid_replication_area_size, virtual_service_endpoint, ingetloglevel, inputLogFatal, inputLogError, + inputLogWarn, inputLogInfo, inputLogDebug); + this->session_data_processor = new sslid_session_data_processor_stub( + 1024, 3600, this->replication_data_processor, ingetloglevel, + inputLogFatal, inputLogError, inputLogWarn, inputLogInfo, + inputLogDebug); + (dynamic_cast (session_data_processor))->get_session_endpoint_map()[session_id] + = ep1; + time_t last_time = time(0); + (dynamic_cast (session_data_processor))->get_session_lasttime_map()[session_id] + = last_time; + + rs_list.clear(); + realserver server; + server.tcp_endpoint = ep1; + rs_list.push_back(server); + + status = this->handle_realserver_select(boost::this_thread::get_id(), + rs_endpoint); + BOOST_CHECK_EQUAL(status, REALSERVER_CONNECT); + BOOST_CHECK_EQUAL(up_thread_data->selected_realserver, ep1); + delete this->session_data_processor; + this->session_thread_data_map.clear(); + } + cout << "[171]--------------------------------------------- " << endl; + // unit_test[171] realserver接続失敗回数< 0で, 且つselected_realserverがNULLで、且つhello_message_flagがtrueで + // unit_test[171] 且つセッションIDがあるで, 且つendpointが決定の場合 + // unit_test[171] rsリストを検索し、realserver endpoint が存在しない場合 + // unit_test[171] rescheduleモード + // unit_test[171] endpoint = 決定 + // unit_test[171] endpointでselected_realserverを設定する + // unit_test[171] 戻り値がREALSERVER_CONNECTで設定する。 + { + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->realserver_connect_failed_count = -1; + up_thread_data->selected_realserver = ep2; + up_thread_data->hello_message_flag = true; + up_thread_data->data_buffer[43] = 0x20; + up_thread_data->data_size = 76u; + up_thread_data->data_begain_offset = 0u; + this->reschedule = 1; + for (int i = 0; i < 32; i++) { + up_thread_data->data_buffer[44 + i] = 0x01; + } + + this->schedule_tcp = boost::bind(&schedule_tcp_func3, _1, _2, _3, _4, _5, ep1); + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + char* temp_data_buffer = up_thread_data->data_buffer.c_array(); + session_id.assign(temp_data_buffer + 44, temp_data_buffer + 76); + this->replication_data_processor = new sslid_replication_data_processor(maxlist, sslid_replication_area_begain, + sslid_replication_area_size, virtual_service_endpoint, ingetloglevel, inputLogFatal, inputLogError, + inputLogWarn, inputLogInfo, inputLogDebug); + this->session_data_processor = new sslid_session_data_processor_stub( + 1024, 3600, this->replication_data_processor, ingetloglevel, + inputLogFatal, inputLogError, inputLogWarn, inputLogInfo, + inputLogDebug); + (dynamic_cast (session_data_processor))->get_session_endpoint_map()[session_id] + = ep1; + time_t last_time = time(0); + (dynamic_cast (session_data_processor))->get_session_lasttime_map()[session_id] + = last_time; + + rs_list.clear(); + + status = this->handle_realserver_select(boost::this_thread::get_id(), + rs_endpoint); + BOOST_CHECK_EQUAL(status, REALSERVER_CONNECT); + BOOST_CHECK_EQUAL(up_thread_data->selected_realserver, ep1); + delete this->session_data_processor; + this->session_thread_data_map.clear(); + } + cout << "[172]--------------------------------------------- " << endl; + // unit_test[172] realserver接続失敗回数< 0で, 且つselected_realserverがNULLで、且つhello_message_flagがtrueで + // unit_test[172] 且つセッションIDがあるで, 且つendpointが決定の場合 + // unit_test[172] rsリストを検索し、realserver endpoint が存在しない場合 + // unit_test[172] rescheduleモード + // unit_test[172] endpoint = 未決定 + // unit_test[172] 終了フラグをONにする + // unit_test[172] 戻り値がCLIENT_DISCONNECTで設定する。 + { + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->realserver_connect_failed_count = -1; + up_thread_data->selected_realserver = ep2; + up_thread_data->hello_message_flag = true; + up_thread_data->data_buffer[43] = 0x20; + up_thread_data->data_size = 76u; + up_thread_data->data_begain_offset = 0u; + this->reschedule = 1; + up_thread_data->end_flag = END_FLAG_OFF; + for (int i = 0; i < 32; i++) { + up_thread_data->data_buffer[44 + i] = 0x01; + } + + this->schedule_tcp = schedule_tcp_func2; + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + char* temp_data_buffer = up_thread_data->data_buffer.c_array(); + session_id.assign(temp_data_buffer + 44, temp_data_buffer + 76); + this->replication_data_processor = new sslid_replication_data_processor(maxlist, sslid_replication_area_begain, + sslid_replication_area_size, virtual_service_endpoint, ingetloglevel, inputLogFatal, inputLogError, + inputLogWarn, inputLogInfo, inputLogDebug); + this->session_data_processor = new sslid_session_data_processor_stub( + 1024, 3600, this->replication_data_processor, ingetloglevel, + inputLogFatal, inputLogError, inputLogWarn, inputLogInfo, + inputLogDebug); + (dynamic_cast (session_data_processor))->get_session_endpoint_map()[session_id] + = ep1; + time_t last_time = time(0); + (dynamic_cast (session_data_processor))->get_session_lasttime_map()[session_id] + = last_time; + + rs_list.clear(); + + status = this->handle_realserver_select(boost::this_thread::get_id(), + rs_endpoint); + BOOST_CHECK_EQUAL(status, CLIENT_DISCONNECT); + BOOST_CHECK_EQUAL(up_thread_data->end_flag, END_FLAG_ON); + delete this->session_data_processor; + this->session_thread_data_map.clear(); + } + cout << "[173]--------------------------------------------- " << endl; + // unit_test[173] realserver接続失敗回数< 0で, 且つselected_realserverがNULLで、且つhello_message_flagがtrueで + // unit_test[173] 且つセッションIDがあるで, 且つendpointが決定の場合 + // unit_test[173] rsリストを検索し、realserver endpoint が存在しない場合 + // unit_test[173] no rescheduleモード + // unit_test[173] 終了フラグをONにする + // unit_test[173] 戻り値がCLIENT_DISCONNECTで設定する。 + { + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->realserver_connect_failed_count = -1; + up_thread_data->selected_realserver = ep2; + up_thread_data->hello_message_flag = true; + up_thread_data->data_buffer[43] = 0x20; + up_thread_data->data_size = 76u; + up_thread_data->data_begain_offset = 0u; + this->reschedule = 0; + up_thread_data->end_flag = END_FLAG_OFF; + for (int i = 0; i < 32; i++) { + up_thread_data->data_buffer[44 + i] = 0x01; + } + + this->schedule_tcp = schedule_tcp_func2; + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + char* temp_data_buffer = up_thread_data->data_buffer.c_array(); + session_id.assign(temp_data_buffer + 44, temp_data_buffer + 76); + this->replication_data_processor = new sslid_replication_data_processor(maxlist, sslid_replication_area_begain, + sslid_replication_area_size, virtual_service_endpoint, ingetloglevel, inputLogFatal, inputLogError, + inputLogWarn, inputLogInfo, inputLogDebug); + this->session_data_processor = new sslid_session_data_processor_stub( + 1024, 3600, this->replication_data_processor, ingetloglevel, + inputLogFatal, inputLogError, inputLogWarn, inputLogInfo, + inputLogDebug); + (dynamic_cast (session_data_processor))->get_session_endpoint_map()[session_id] + = ep1; + time_t last_time = time(0); + (dynamic_cast (session_data_processor))->get_session_lasttime_map()[session_id] + = last_time; + + rs_list.clear(); + + status = this->handle_realserver_select(boost::this_thread::get_id(), + rs_endpoint); + BOOST_CHECK_EQUAL(status, CLIENT_DISCONNECT); + BOOST_CHECK_EQUAL(up_thread_data->end_flag, END_FLAG_ON); + delete this->session_data_processor; + this->session_thread_data_map.clear(); + } + + cout << "[174]--------------------------------------------- " << endl; + // unit_test[174] realserver接続失敗回数 < 0で, 且つselected_realserver が NULLで, 且つhello_message_flag が trueで + // unit_test[174] 且つセッションIDがあるで, endpointが未決定で、reschedule後、endpointが決定の場合 + // unit_test[174] 戻り値がREALSERVER_CONNECTで設定する。 + { + this->schedule_tcp = schedule_tcp_func1; + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->realserver_connect_failed_count = -1; + up_thread_data->selected_realserver = ep2; + up_thread_data->hello_message_flag = true; + up_thread_data->data_buffer[43] = 0x20; + up_thread_data->data_begain_offset = 0u; + for (int i = 0; i < 32; i++) { + up_thread_data->data_buffer[44 + i] = 0x01; + } + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + this->reschedule = 1; + this->replication_data_processor = new sslid_replication_data_processor(maxlist, sslid_replication_area_begain, + sslid_replication_area_size, virtual_service_endpoint, ingetloglevel, inputLogFatal, inputLogError, + inputLogWarn, inputLogInfo, inputLogDebug); + this->session_data_processor = new sslid_session_data_processor_stub( + 1024, 3600, this->replication_data_processor, ingetloglevel, + inputLogFatal, inputLogError, inputLogWarn, inputLogInfo, + inputLogDebug); + status = this->handle_realserver_select(boost::this_thread::get_id(), + rs_endpoint); + BOOST_CHECK_EQUAL(status, REALSERVER_CONNECT); + delete this->session_data_processor; + this->session_thread_data_map.clear(); + } + + cout << "[175]--------------------------------------------- " << endl; + // unit_test[175] realserver接続失敗回数 < 0で, 且つselected_realserver が NULLで, 且つhello_message_flag が trueで + // unit_test[175] 且つセッションIDがあるで, endpointが未決定で、reschedule後、endpointも未決定の場合 + // unit_test[175] 戻り値がCLIENT_DISCONNECTで設定する。 + { + this->schedule_tcp = schedule_tcp_func2; + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->realserver_connect_failed_count = -1; + up_thread_data->selected_realserver = ep2; + up_thread_data->hello_message_flag = true; + up_thread_data->data_buffer[43] = 0x20; + up_thread_data->data_begain_offset = 0u; + for (int i = 0; i < 32; i++) { + up_thread_data->data_buffer[44 + i] = 0x01; + } + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + this->reschedule = 1; + this->replication_data_processor = new sslid_replication_data_processor(maxlist, sslid_replication_area_begain, + sslid_replication_area_size, virtual_service_endpoint, ingetloglevel, inputLogFatal, inputLogError, + inputLogWarn, inputLogInfo, inputLogDebug); + this->session_data_processor = new sslid_session_data_processor_stub( + 1024, 3600, this->replication_data_processor, ingetloglevel, + inputLogFatal, inputLogError, inputLogWarn, inputLogInfo, + inputLogDebug); + status = this->handle_realserver_select(boost::this_thread::get_id(), + rs_endpoint); + BOOST_CHECK_EQUAL(status, CLIENT_DISCONNECT); + delete this->session_data_processor; + this->session_thread_data_map.clear(); + } + + cout << "[176]--------------------------------------------- " << endl; + // unit_test[176] realserver接続失敗回数 < 0で, 且つselected_realserver が NULLで, 且つhello_message_flag が trueで + // unit_test[176] セッションIDがあり、endpointが未決定でrescheduleしない場合 + // unit_test[176] 戻り値がCLIENT_DISCONNECTで設定する。 + { + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->realserver_connect_failed_count = -1; + up_thread_data->selected_realserver = ep2; + up_thread_data->hello_message_flag = true; + up_thread_data->data_buffer[43] = 0x20; + up_thread_data->data_begain_offset = 0u; + for (int i = 0; i < 32; i++) { + up_thread_data->data_buffer[44 + i] = 0x01; + } + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + this->reschedule = 0; + this->replication_data_processor = new sslid_replication_data_processor(maxlist, sslid_replication_area_begain, + sslid_replication_area_size, virtual_service_endpoint, ingetloglevel, inputLogFatal, inputLogError, + inputLogWarn, inputLogInfo, inputLogDebug); + this->session_data_processor = new sslid_session_data_processor_stub( + 1024, 3600, this->replication_data_processor, ingetloglevel, + inputLogFatal, inputLogError, inputLogWarn, inputLogInfo, + inputLogDebug); + status = this->handle_realserver_select(boost::this_thread::get_id(), + rs_endpoint); + BOOST_CHECK_EQUAL(status, CLIENT_DISCONNECT); + this->session_thread_data_map.clear(); + } + + } + + //handle_realserver_select(tcp) + void handle_realserver_select_tcp_test_thread() { + + EVENT_TAG status; + boost::asio::ip::tcp::endpoint rs_endpoint; + boost::asio::ip::tcp::endpoint comp_endpoint; + boost::asio::ip::tcp::endpoint + ep1(boost::asio::ip::address::from_string("192.168.120.249"), + 12345); + boost::asio::ip::tcp::endpoint ep2; + + cout << "[177]--------------------------------------------- " << endl; + // unit_test[177] realserver接続失敗回数 < 0で, 且つselected_realserver が NULLで, 且つhello_message_flag が trueで + // unit_test[177] 且つセッションIDがあるで, endpointが未決定で、reschedule後、endpointが決定の場合 + // unit_test[177] 戻り値がREALSERVER_CONNECTで設定する。 + { + //this->schedule_tcp = schedule_tcp_func1; + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->realserver_connect_failed_count = -1; + up_thread_data->selected_realserver = ep2; + up_thread_data->hello_message_flag = true; + up_thread_data->data_buffer[43] = 0x20; + up_thread_data->data_size = 76u; + up_thread_data->data_begain_offset = 0u; + for (int i = 0; i < 32; i++) { + up_thread_data->data_buffer[44 + i] = 0x01; + } + { + boost::mutex::scoped_lock sclock(this->session_thread_data_map_mutex); + this->session_thread_data_map[boost::this_thread::get_id()] = up_thread_data; + } + status = this->handle_realserver_select(boost::this_thread::get_id(), + rs_endpoint); + { + boost::mutex::scoped_lock sclock(check_mutex); + BOOST_CHECK_EQUAL(status, REALSERVER_CONNECT); + } + } + } + + //handle_realserver_select(udp) + void handle_realserver_select_udp_test(){ + cout << "[178]--------------------------------------------- " << endl; + // unit_test[178] 戻り値が STOPで設定する。 + EVENT_TAG status; + boost::array sendbuffer; + size_t datalen; + boost::asio::ip::udp::endpoint rs_endpoint_udp; + status = this->handle_realserver_select(boost::this_thread::get_id(), + rs_endpoint_udp, sendbuffer, datalen); + BOOST_CHECK_EQUAL(status, STOP); + } + + //handle_realserver_connect + void handle_realserver_connect_test() { + + boost::array sendbuffer; + size_t datalen = 0; + EVENT_TAG status; + char* mem_cmp_buffer; + int mem_cmp_length; + int mem_cmp_result; + + cout << "[179]--------------------------------------------- " << endl; + // unit_test[179] current_record_rest_size>data_sizeで、且つdata_size<送信バッファサイズの場合 + // unit_test[179] 戻り値がREALSERVER_SENDで設定する。 + { + datalen = 0; + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->current_record_rest_size = 20u; + up_thread_data->data_size = 10u; + up_thread_data->data_begain_offset = 5u; + for(size_t i=up_thread_data->data_begain_offset;idata_begain_offset+up_thread_data->data_size;i++) + { + up_thread_data->data_buffer[i] = 0x01; + } + mem_cmp_buffer = new char[MAX_SSLID_BUFFER_SIZE]; + memcpy(mem_cmp_buffer, up_thread_data->data_buffer.c_array()+up_thread_data->data_begain_offset, up_thread_data->data_size); + mem_cmp_length = up_thread_data->data_size; + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + status = this->handle_realserver_connect(boost::this_thread::get_id(), + sendbuffer, datalen); + mem_cmp_result = memcmp(sendbuffer.c_array(), mem_cmp_buffer, mem_cmp_length); + BOOST_CHECK_EQUAL(mem_cmp_result, 0); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_begain_offset, 0u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_record_rest_size, 10u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_size, 0u); + BOOST_CHECK_EQUAL(status, REALSERVER_SEND); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->realserver_connect_failed_count, 0); + BOOST_CHECK_EQUAL(datalen, 10u); + delete[] mem_cmp_buffer; + this->session_thread_data_map.clear(); + } + + cout << "[180]--------------------------------------------- " << endl; + // unit_test[180] current_record_rest_size>data_sizeで, 且つdata_sizeが送信バッファサイズの場合 + // unit_test[180] 戻り値がREALSERVER_SENDで設定する。 + { + datalen = 0; + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->current_record_rest_size = static_cast(MAX_BUFFER_SIZE) + 1u; + up_thread_data->data_size = static_cast(MAX_BUFFER_SIZE); + up_thread_data->data_begain_offset = 5u; + for(size_t i=up_thread_data->data_begain_offset;idata_begain_offset+up_thread_data->data_size;i++) + { + up_thread_data->data_buffer[i] = 0x02; + } + mem_cmp_buffer = new char[MAX_SSLID_BUFFER_SIZE]; + memcpy(mem_cmp_buffer, up_thread_data->data_buffer.c_array()+up_thread_data->data_begain_offset, up_thread_data->data_size); + mem_cmp_length = up_thread_data->data_size; + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + status = this->handle_realserver_connect(boost::this_thread::get_id(), + sendbuffer, datalen); + mem_cmp_result = memcmp(sendbuffer.c_array(), mem_cmp_buffer, mem_cmp_length); + BOOST_CHECK_EQUAL(mem_cmp_result, 0); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_begain_offset, 0u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_record_rest_size, 1u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_size, 0u); + BOOST_CHECK_EQUAL(status, REALSERVER_SEND); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->realserver_connect_failed_count, 0); + BOOST_CHECK_EQUAL(datalen, static_cast(MAX_BUFFER_SIZE)); + delete[] mem_cmp_buffer; + this->session_thread_data_map.clear(); + } + + cout << "[181]--------------------------------------------- " << endl; + // unit_test[181] current_record_rest_sizeがdata_sizeで, 且つdata_size<送信バッファサイズの場合 + // unit_test[181] 戻り値がREALSERVER_SENDで設定する。 + { + datalen = 0; + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->current_record_rest_size = 10u; + up_thread_data->data_size = 10u; + up_thread_data->data_begain_offset = 5u; + for(size_t i=up_thread_data->data_begain_offset;idata_begain_offset+up_thread_data->data_size;i++) + { + up_thread_data->data_buffer[i] = 0x03; + } + mem_cmp_buffer = new char[MAX_SSLID_BUFFER_SIZE]; + memcpy(mem_cmp_buffer, up_thread_data->data_buffer.c_array()+up_thread_data->data_begain_offset, up_thread_data->data_size); + mem_cmp_length = up_thread_data->data_size; + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + status = this->handle_realserver_connect(boost::this_thread::get_id(), + sendbuffer, datalen); + mem_cmp_result = memcmp(sendbuffer.c_array(), mem_cmp_buffer, mem_cmp_length); + BOOST_CHECK_EQUAL(mem_cmp_result, 0); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_begain_offset, 0u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_record_rest_size, 0u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_size, 0u); + BOOST_CHECK_EQUAL(status, REALSERVER_SEND); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->realserver_connect_failed_count, 0); + BOOST_CHECK_EQUAL(datalen, 10u); + delete[] mem_cmp_buffer; + this->session_thread_data_map.clear(); + } + + cout << "[182]--------------------------------------------- " << endl; + // unit_test[182] current_record_rest_sizeがdata_sizeで, 且つdata_sizeが送信バッファサイズの場合 + // unit_test[182] 戻り値がREALSERVER_SENDで設定する。 + { + datalen = 0; + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->current_record_rest_size = static_cast(MAX_BUFFER_SIZE); + up_thread_data->data_size = static_cast(MAX_BUFFER_SIZE); + up_thread_data->data_begain_offset = 5u; + for(size_t i=up_thread_data->data_begain_offset;idata_begain_offset+up_thread_data->data_size;i++) + { + up_thread_data->data_buffer[i] = 0x04; + } + mem_cmp_buffer = new char[MAX_SSLID_BUFFER_SIZE]; + memcpy(mem_cmp_buffer, up_thread_data->data_buffer.c_array()+up_thread_data->data_begain_offset, up_thread_data->data_size); + mem_cmp_length = up_thread_data->data_size; + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + status = this->handle_realserver_connect(boost::this_thread::get_id(), + sendbuffer, datalen); + mem_cmp_result = memcmp(sendbuffer.c_array(), mem_cmp_buffer, mem_cmp_length); + BOOST_CHECK_EQUAL(mem_cmp_result, 0); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_begain_offset, 0u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_record_rest_size, 0u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_size, 0u); + BOOST_CHECK_EQUAL(status, REALSERVER_SEND); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->realserver_connect_failed_count, 0); + BOOST_CHECK_EQUAL(datalen, static_cast(MAX_BUFFER_SIZE)); + delete[] mem_cmp_buffer; + this->session_thread_data_map.clear(); + } + + cout << "[183]--------------------------------------------- " << endl; + // unit_test[183] current_record_rest_size>data_sizeで,且つdata_size>送信バッファサイズの場合 + // unit_test[183] 戻り値がREALSERVER_SENDで設定する。 + { + datalen = 0; + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->current_record_rest_size = static_cast(MAX_BUFFER_SIZE) + 10u; + up_thread_data->data_size = static_cast(MAX_BUFFER_SIZE) + 5u; + up_thread_data->data_begain_offset = 10u; + for(size_t i=up_thread_data->data_begain_offset;idata_begain_offset+up_thread_data->data_size;i++) + { + up_thread_data->data_buffer[i] = 0x05; + } + mem_cmp_buffer = new char[MAX_SSLID_BUFFER_SIZE]; + memcpy(mem_cmp_buffer, up_thread_data->data_buffer.c_array()+up_thread_data->data_begain_offset, up_thread_data->data_size); + mem_cmp_length = MAX_BUFFER_SIZE; + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + status = this->handle_realserver_connect(boost::this_thread::get_id(), + sendbuffer, datalen); + mem_cmp_result = memcmp(sendbuffer.c_array(), mem_cmp_buffer, mem_cmp_length); + BOOST_CHECK_EQUAL(mem_cmp_result, 0); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_begain_offset, 10u+static_cast(MAX_BUFFER_SIZE)); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_record_rest_size, 10u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_size, 5u); + BOOST_CHECK_EQUAL(status, REALSERVER_SEND); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->realserver_connect_failed_count, 0); + BOOST_CHECK_EQUAL(datalen, static_cast(MAX_BUFFER_SIZE)); + delete[] mem_cmp_buffer; + this->session_thread_data_map.clear(); + } + + cout << "[184]--------------------------------------------- " << endl; + // unit_test[184] current_record_rest_sizeがdata_sizeで,且つdata_size>送信バッファサイズの場合 + // unit_test[184] 戻り値がREALSERVER_SENDで設定する。 + { + datalen = 0; + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->current_record_rest_size = static_cast(MAX_BUFFER_SIZE) + 10u; + up_thread_data->data_size = static_cast(MAX_BUFFER_SIZE) + 10u; + up_thread_data->data_begain_offset = 10u; + for(size_t i=up_thread_data->data_begain_offset;idata_begain_offset+up_thread_data->data_size;i++) + { + up_thread_data->data_buffer[i] = 0x06; + } + mem_cmp_buffer = new char[MAX_SSLID_BUFFER_SIZE]; + memcpy(mem_cmp_buffer, up_thread_data->data_buffer.c_array()+up_thread_data->data_begain_offset, up_thread_data->data_size); + mem_cmp_length = MAX_BUFFER_SIZE; + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + status = this->handle_realserver_connect(boost::this_thread::get_id(), + sendbuffer, datalen); + mem_cmp_result = memcmp(sendbuffer.c_array(), mem_cmp_buffer, mem_cmp_length); + BOOST_CHECK_EQUAL(mem_cmp_result, 0); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_begain_offset, 10u+static_cast(MAX_BUFFER_SIZE)); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_record_rest_size, 10u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_size, 10u); + BOOST_CHECK_EQUAL(status, REALSERVER_SEND); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->realserver_connect_failed_count, 0); + BOOST_CHECK_EQUAL(datalen, static_cast(MAX_BUFFER_SIZE)); + delete[] mem_cmp_buffer; + this->session_thread_data_map.clear(); + } + + cout << "[185]--------------------------------------------- " << endl; + // unit_test[185] current_record_rest_size<data_sizeで, 且つcurrent_record_rest_size<送信バッファサイズの場合 + // unit_test[185] 戻り値がREALSERVER_SENDで設定する。 + { + datalen = 0; + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->current_record_rest_size = 10u; + up_thread_data->data_size = 20u; + up_thread_data->data_begain_offset = 5u; + for(size_t i=up_thread_data->data_begain_offset;idata_begain_offset+up_thread_data->data_size;i++) + { + up_thread_data->data_buffer[i] = 0x07; + } + mem_cmp_buffer = new char[MAX_SSLID_BUFFER_SIZE]; + memcpy(mem_cmp_buffer, up_thread_data->data_buffer.c_array()+up_thread_data->data_begain_offset, up_thread_data->data_size); + mem_cmp_length = up_thread_data->current_record_rest_size; + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + status = this->handle_realserver_connect(boost::this_thread::get_id(), + sendbuffer, datalen); + mem_cmp_result = memcmp(sendbuffer.c_array(), mem_cmp_buffer, mem_cmp_length); + BOOST_CHECK_EQUAL(mem_cmp_result, 0); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_begain_offset, 15u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_record_rest_size, 0u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_size, 10u); + BOOST_CHECK_EQUAL(status, REALSERVER_SEND); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->realserver_connect_failed_count, 0); + BOOST_CHECK_EQUAL(datalen, 10u); + delete[] mem_cmp_buffer; + this->session_thread_data_map.clear(); + } + + cout << "[186]--------------------------------------------- " << endl; + // unit_test[186] current_record_rest_sizecurrent_record_rest_size = static_cast(MAX_BUFFER_SIZE); + up_thread_data->data_size = static_cast(MAX_BUFFER_SIZE) + 10u; + up_thread_data->data_begain_offset = 5u; + for(size_t i=up_thread_data->data_begain_offset;idata_begain_offset+up_thread_data->data_size;i++) + { + up_thread_data->data_buffer[i] = 0x08; + } + mem_cmp_buffer = new char[MAX_SSLID_BUFFER_SIZE]; + memcpy(mem_cmp_buffer, up_thread_data->data_buffer.c_array()+up_thread_data->data_begain_offset, up_thread_data->data_size); + mem_cmp_length = up_thread_data->current_record_rest_size; + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + status = this->handle_realserver_connect(boost::this_thread::get_id(), + sendbuffer, datalen); + mem_cmp_result = memcmp(sendbuffer.c_array(), mem_cmp_buffer, mem_cmp_length); + BOOST_CHECK_EQUAL(mem_cmp_result, 0); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_begain_offset, 5u+static_cast(MAX_BUFFER_SIZE)); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_record_rest_size, 0u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_size, 10u); + BOOST_CHECK_EQUAL(status, REALSERVER_SEND); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->realserver_connect_failed_count, 0); + BOOST_CHECK_EQUAL(datalen, static_cast(MAX_BUFFER_SIZE)); + delete[] mem_cmp_buffer; + this->session_thread_data_map.clear(); + } + + cout << "[187]--------------------------------------------- " << endl; + // unit_test[187] current_record_rest_size<data_sizeで,且つcurrent_record_rest_size>送信バッファサイズの場合 + // unit_test[187] 戻り値がREALSERVER_SENDで設定する。 + { + datalen = 0; + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->current_record_rest_size = static_cast(MAX_BUFFER_SIZE) + 10u; + up_thread_data->data_size =static_cast(MAX_BUFFER_SIZE) + 20u; + up_thread_data->data_begain_offset = 5u; + for(size_t i=up_thread_data->data_begain_offset;idata_begain_offset+up_thread_data->data_size;i++) + { + up_thread_data->data_buffer[i] = 0x09; + } + mem_cmp_buffer = new char[MAX_SSLID_BUFFER_SIZE]; + memcpy(mem_cmp_buffer, up_thread_data->data_buffer.c_array()+up_thread_data->data_begain_offset, up_thread_data->data_size); + mem_cmp_length = MAX_BUFFER_SIZE; + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + status = this->handle_realserver_connect(boost::this_thread::get_id(), + sendbuffer, datalen); + mem_cmp_result = memcmp(sendbuffer.c_array(), mem_cmp_buffer, mem_cmp_length); + BOOST_CHECK_EQUAL(mem_cmp_result, 0); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_begain_offset, 5u+static_cast(MAX_BUFFER_SIZE)); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_record_rest_size, 10u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_size, 20u); + BOOST_CHECK_EQUAL(status, REALSERVER_SEND); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->realserver_connect_failed_count, 0); + BOOST_CHECK_EQUAL(datalen, static_cast(MAX_BUFFER_SIZE)); + delete[] mem_cmp_buffer; + this->session_thread_data_map.clear(); + } + + } + + //handle_realserver_connect + void handle_realserver_connect_test_thread() { + + boost::array sendbuffer; + size_t datalen = 0; + EVENT_TAG status; + char* mem_cmp_buffer; + int mem_cmp_length; + int mem_cmp_result; + + cout << "[188]--------------------------------------------- " << endl; + // unit_test[188] current_record_rest_sizecurrent_record_rest_size = static_cast(MAX_BUFFER_SIZE); + up_thread_data->data_size = static_cast(MAX_BUFFER_SIZE) + 10u; + up_thread_data->data_begain_offset = 5u; + for(size_t i=up_thread_data->data_begain_offset;idata_begain_offset+up_thread_data->data_size;i++) + { + up_thread_data->data_buffer[i] = 0x08; + } + mem_cmp_buffer = new char[MAX_SSLID_BUFFER_SIZE]; + memcpy(mem_cmp_buffer, up_thread_data->data_buffer.c_array()+up_thread_data->data_begain_offset, up_thread_data->data_size); + mem_cmp_length = up_thread_data->current_record_rest_size; + { + boost::mutex::scoped_lock sclock(this->session_thread_data_map_mutex); + this->session_thread_data_map[boost::this_thread::get_id()] = up_thread_data; + } + status = this->handle_realserver_connect(boost::this_thread::get_id(), + sendbuffer, datalen); + mem_cmp_result = memcmp(sendbuffer.c_array(), mem_cmp_buffer, mem_cmp_length); + { + boost::mutex::scoped_lock sclock(check_mutex); + BOOST_CHECK_EQUAL(mem_cmp_result, 0); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_begain_offset, 5u+static_cast(MAX_BUFFER_SIZE)); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_record_rest_size, 0u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_size, 10u); + BOOST_CHECK_EQUAL(status, REALSERVER_SEND); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->realserver_connect_failed_count, 0); + BOOST_CHECK_EQUAL(datalen, static_cast(MAX_BUFFER_SIZE)); + } + } + } + + //handle_realserver_connection_fail + void handle_realserver_connection_fail_test(){ + boost::asio::ip::tcp::endpoint ep; + session_thread_data_sslid* thread_up_data_value = new session_thread_data_sslid; + thread_up_data_value->thread_division=THREAD_DIVISION_UP_STREAM; + thread_up_data_value->realserver_connect_failed_count=0; + thread_up_data_value->data_begain_offset=0; + thread_up_data_value->data_size=0; + thread_up_data_value->current_record_rest_size=0; + thread_up_data_value->hello_message_flag=false; + thread_data_ptr thread_data(thread_up_data_value); + this->session_thread_data_map[boost::this_thread::get_id()]=thread_data; + std::map::iterator iter; + iter=this->session_thread_data_map.find(boost::this_thread::get_id()); + thread_data_ptr data=iter->second; + + cout << "[189]--------------------------------------------- " << endl; + //unit_test[189] 終了フラグをON,遷移先ステータスを設定する,status = CLIENT_DISCONNECT + //unit_test[189] test data:no rescheduleモード、初めて失敗するの場合 + this->reschedule=0; + EVENT_TAG schedule=this->handle_realserver_connection_fail(boost::this_thread::get_id(), ep); + BOOST_CHECK_EQUAL(data->end_flag,END_FLAG_ON); + BOOST_CHECK_EQUAL(schedule, protocol_module_base::CLIENT_DISCONNECT); + + cout << "[190]--------------------------------------------- " << endl; + //unit_test[190] realserver_connect_failed_count で1を加算する,遷移先ステータスを設定する,status = REALSERVER_SELECT + //unit_test[190] test data:rescheduleモード、初めて失敗するの場合 + this->reschedule=1; + schedule=this->handle_realserver_connection_fail(boost::this_thread::get_id(), ep); + BOOST_CHECK_EQUAL(data->realserver_connect_failed_count,1); + BOOST_CHECK_EQUAL(schedule, protocol_module_base::REALSERVER_SELECT); + + cout << "[191]--------------------------------------------- " << endl; + //unit_test[191] realserver_connect_failed_count で1を加算する,遷移先ステータスにREALSERVER_SELECTを設定する + //unit_test[191] test data:rescheduleモード、3目失敗するの場合 + this->reschedule=1; + schedule=this->handle_realserver_connection_fail(boost::this_thread::get_id(), ep); + schedule=this->handle_realserver_connection_fail(boost::this_thread::get_id(), ep); + BOOST_CHECK_EQUAL(data->realserver_connect_failed_count,3); + BOOST_CHECK_EQUAL(schedule, protocol_module_base::REALSERVER_SELECT); + + cout << "[192]--------------------------------------------- " << endl; + //unit_test[192] 終了フラグをON,遷移先ステータスにCLIENT_DISCONNECTを設定する + //unit_test[192] test data:no rescheduleモード、4目失敗するの場合 + this->reschedule=0; + schedule=this->handle_realserver_connection_fail(boost::this_thread::get_id(), ep); + BOOST_CHECK_EQUAL(data->end_flag,END_FLAG_ON); + BOOST_CHECK_EQUAL(schedule, protocol_module_base::CLIENT_DISCONNECT); + + this->session_thread_data_map.clear(); + } + + void handle_realserver_connection_fail_test_thread_reschedule(){ + boost::asio::ip::tcp::endpoint ep; + session_thread_data_sslid* thread_up_data_value = new session_thread_data_sslid; + thread_up_data_value->thread_division=THREAD_DIVISION_UP_STREAM; + thread_up_data_value->realserver_connect_failed_count=0; + thread_up_data_value->data_begain_offset=0; + thread_up_data_value->data_size=0; + thread_up_data_value->current_record_rest_size=0; + thread_up_data_value->hello_message_flag=false; + thread_data_ptr thread_data(thread_up_data_value); + thread_data_ptr data; + { + boost::mutex::scoped_lock sclock(this->session_thread_data_map_mutex); + this->session_thread_data_map[boost::this_thread::get_id()]=thread_data; + std::map::iterator iter; + iter=this->session_thread_data_map.find(boost::this_thread::get_id()); + data=iter->second; + this->reschedule=1; + } + + cout << "[193]--------------------------------------------- " << endl; + //unit_test[193] realserver_connect_failed_count で3を加算する,遷移先ステータスにREALSERVER_SELECTを設定する + //unit_test[193] test data:rescheduleモード、3目失敗する、マルチスレッドの場合 + EVENT_TAG schedule=this->handle_realserver_connection_fail(boost::this_thread::get_id(), ep); + schedule=this->handle_realserver_connection_fail(boost::this_thread::get_id(), ep); + schedule=this->handle_realserver_connection_fail(boost::this_thread::get_id(), ep); + { + boost::mutex::scoped_lock sclock(check_mutex); + BOOST_CHECK_EQUAL(data->realserver_connect_failed_count,3); + BOOST_CHECK_EQUAL(schedule, protocol_module_base::REALSERVER_SELECT); + } + } + + void handle_realserver_connection_fail_test_thread_noreschedule(){ + boost::asio::ip::tcp::endpoint ep; + session_thread_data_sslid* thread_up_data_value = new session_thread_data_sslid; + thread_up_data_value->thread_division=THREAD_DIVISION_UP_STREAM; + thread_up_data_value->realserver_connect_failed_count=0; + thread_up_data_value->data_begain_offset=0; + thread_up_data_value->data_size=0; + thread_up_data_value->current_record_rest_size=0; + thread_up_data_value->hello_message_flag=false; + thread_data_ptr thread_data(thread_up_data_value); + thread_data_ptr data; + { + boost::mutex::scoped_lock sclock(this->session_thread_data_map_mutex); + this->session_thread_data_map[boost::this_thread::get_id()]=thread_data; + std::map::iterator iter; + iter=this->session_thread_data_map.find(boost::this_thread::get_id()); + data=iter->second; + this->reschedule=0; + } + + cout << "[194]--------------------------------------------- " << endl; + //unit_test[194] 終了フラグをON,遷移先ステータスを設定する,status = CLIENT_DISCONNECT + //unit_test[194] test data:no rescheduleモード、マルチスレッドの場合 + EVENT_TAG schedule=this->handle_realserver_connection_fail(boost::this_thread::get_id(), ep); + { + boost::mutex::scoped_lock sclock(check_mutex); + BOOST_CHECK_EQUAL(data->end_flag,END_FLAG_ON); + BOOST_CHECK_EQUAL(schedule, protocol_module_base::CLIENT_DISCONNECT); + } + } + + //handle_realserver_send + void handle_realserver_send_test() { + + EVENT_TAG status; + + cout << "[195]--------------------------------------------- " << endl; + // unit_test[195] データサイズが0で、且つdata_begain_offsetが0の場合 + // unit_test[195] 戻り値がCLIENT_RECVで設定する。 + { + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->data_size = 0u; + up_thread_data->data_begain_offset = 0u; + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + status = this->handle_realserver_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(status, CLIENT_RECV); + this->session_thread_data_map.clear(); + } + + cout << "[196]--------------------------------------------- " << endl; + // unit_test[196] データサイズが0で,且つdata_begain_offset >0の場合 + // unit_test[196] 戻り値がCLIENT_RECVで設定する。 + { + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->data_size = 0u; + up_thread_data->data_begain_offset = 10u; + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + status = this->handle_realserver_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(status, CLIENT_RECV); + this->session_thread_data_map.clear(); + } + + cout << "[197]--------------------------------------------- " << endl; + // unit_test[197] データサイズ > 0で, 且つcurrent_record_rest_size > 0で,且つdata_begain_offset=0の場合 + // unit_test[197] 戻り値がREALSERVER_CONNECTで設定する。 + { + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->data_size = 10u; + up_thread_data->current_record_rest_size = 10u; + up_thread_data->data_begain_offset = 0u; + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + status = this->handle_realserver_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(status, REALSERVER_CONNECT); + this->session_thread_data_map.clear(); + } + + cout << "[198]--------------------------------------------- " << endl; + // unit_test[198] データサイズ > 0で, 且つcurrent_record_rest_size > 0で,且つdata_begain_offset>0の場合 + // unit_test[198] 戻り値がREALSERVER_CONNECTで設定する。 + { + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->data_size = 10u; + up_thread_data->current_record_rest_size = 10u; + up_thread_data->data_begain_offset = 10u; + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + status = this->handle_realserver_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(status, REALSERVER_CONNECT); + this->session_thread_data_map.clear(); + } + + cout << "[199]--------------------------------------------- " << endl; + // unit_test[199] データサイズ > 0で, 且つcurrent_record_rest_size が 0で, 且つcheck_ssl_record_sendable()の戻り値が-1(異常)で,且つdata_begain_offsetが0の場合 + // unit_test[199] 戻り値がFINALIZEで設定する。 + { + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->data_size = 10u; + up_thread_data->data_begain_offset = 0u; + up_thread_data->current_record_rest_size = 0u; + up_thread_data->data_buffer[0] = 0x00; + up_thread_data->data_begain_offset = 0u; + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + status = this->handle_realserver_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->end_flag, END_FLAG_ON); + BOOST_CHECK_EQUAL(status, FINALIZE); + this->session_thread_data_map.clear(); + } + + cout << "[200]--------------------------------------------- " << endl; + // unit_test[200] データサイズ > 0で, 且つcurrent_record_rest_size が 0で, 且つcheck_ssl_record_sendable()の戻り値が-1(異常)で,且つdata_begain_offset>0の場合 + // unit_test[200] 戻り値がFINALIZEで設定する。 + { + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->data_size = 10u; + up_thread_data->data_begain_offset = 0u; + up_thread_data->current_record_rest_size = 0u; + up_thread_data->data_buffer[0] = 0x00; + up_thread_data->data_begain_offset =10u; + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + status = this->handle_realserver_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->end_flag, END_FLAG_ON); + BOOST_CHECK_EQUAL(status, FINALIZE); + this->session_thread_data_map.clear(); + } + + cout << "[201]--------------------------------------------- " << endl; + // unit_test[201] データサイズ > 0で, 且つcurrent_record_rest_size が 0で, 且つcheck_ssl_record_sendable()の戻り値が1(送信不可)で,且つdata_begain_offsetが0の場合 + // unit_test[201] 戻り値がCLIENT_RECVで設定する。 + { + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->data_size = 1u; + up_thread_data->current_record_rest_size = 0u; + up_thread_data->data_begain_offset = 0u; + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + status = this->handle_realserver_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(status, CLIENT_RECV); + this->session_thread_data_map.clear(); + } + + cout << "[202]--------------------------------------------- " << endl; + // unit_test[202] データサイズ > 0で, 且つcurrent_record_rest_size が 0で, 且つcheck_ssl_record_sendable()の戻り値が1(送信不可)で,且つdata_begain_offset>0の場合 + // unit_test[202] 戻り値がCLIENT_RECVで設定する。 + { + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->data_size = 1u; + up_thread_data->current_record_rest_size = 0u; + up_thread_data->data_begain_offset = 10u; + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + status = this->handle_realserver_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(status, CLIENT_RECV); + this->session_thread_data_map.clear(); + } + + cout << "[203]--------------------------------------------- " << endl; + // unit_test[203] データサイズ > 0で, 且つcurrent_record_rest_size が 0で, 且つcheck_ssl_record_send()の戻り値が0(送信可能)で,且つdata_begain_offset が0の場合 + // unit_test[203] 戻り値がREALSERVER_CONNECTで設定する。 + { + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->data_size = 76u; + up_thread_data->current_record_rest_size = 0u; + up_thread_data->data_buffer[0] = 0x16; + up_thread_data->data_buffer[1] = 0x03; + up_thread_data->data_buffer[2] = 0x01; + up_thread_data->data_buffer[3] = 0x00; + up_thread_data->data_buffer[4] = 0x9e; + up_thread_data->data_buffer[5] = 0x01; + up_thread_data->data_buffer[9] = 0x03; + up_thread_data->data_buffer[10] = 0x01; + up_thread_data->data_begain_offset = 0u; + up_thread_data->hello_message_flag = false; + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + status = this->handle_realserver_send(boost::this_thread::get_id()); + BOOST_CHECK(this->session_thread_data_map[boost::this_thread::get_id()]->hello_message_flag); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_record_rest_size, 163u); + BOOST_CHECK_EQUAL(status, REALSERVER_CONNECT); + this->session_thread_data_map.clear(); + } + + cout << "[204]--------------------------------------------- " << endl; + // unit_test[204] データサイズ > 0で, 且つcurrent_record_rest_size が 0で, 且つcheck_ssl_record_send()の戻り値が0(送信可能)で,且つdata_begain_offset > 0の場合 + // unit_test[204] 戻り値がREALSERVER_CONNECTで設定する。 + { + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->data_size = 76u; + up_thread_data->current_record_rest_size = 0u; + up_thread_data->data_buffer[10] = 0x16; + up_thread_data->data_buffer[11] = 0x03; + up_thread_data->data_buffer[12] = 0x01; + up_thread_data->data_buffer[13] = 0x00; + up_thread_data->data_buffer[14] = 0x9e; + up_thread_data->data_buffer[15] = 0x01; + up_thread_data->data_buffer[19] = 0x03; + up_thread_data->data_buffer[20] = 0x01; + up_thread_data->data_begain_offset = 10u; + up_thread_data->hello_message_flag = false; + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + status = this->handle_realserver_send(boost::this_thread::get_id()); + BOOST_CHECK(this->session_thread_data_map[boost::this_thread::get_id()]->hello_message_flag); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_record_rest_size, 163u); + BOOST_CHECK_EQUAL(status, REALSERVER_CONNECT); + this->session_thread_data_map.clear(); + } + + cout << "[205]--------------------------------------------- " << endl; + // unit_test[205] データサイズ > 0で, 且つcurrent_record_rest_size が 0で, 且つcheck_ssl_record_send()の戻り値が0(送信可能)で,且つdata_begain_offset が0の場合 + // unit_test[205] 戻り値がREALSERVER_CONNECTで設定する。 + { + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->data_size = 10u; + up_thread_data->current_record_rest_size = 0u; + up_thread_data->data_buffer[0] = 0x17; + up_thread_data->data_buffer[1] = 0x03; + up_thread_data->data_buffer[2] = 0x01; + up_thread_data->data_buffer[3] = 0x00; + up_thread_data->data_buffer[4] = 0x9e; + up_thread_data->data_begain_offset = 0u; + up_thread_data->hello_message_flag = true; + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + status = this->handle_realserver_send(boost::this_thread::get_id()); + BOOST_CHECK(!this->session_thread_data_map[boost::this_thread::get_id()]->hello_message_flag); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_record_rest_size, 163u); + BOOST_CHECK_EQUAL(status, REALSERVER_CONNECT); + this->session_thread_data_map.clear(); + } + + cout << "[206]--------------------------------------------- " << endl; + // unit_test[206] データサイズ > 0で, 且つcurrent_record_rest_size が 0で, 且つcheck_ssl_record_send()の戻り値が0(送信可能)で,且つdata_begain_offset > 0の場合 + // unit_test[206] 戻り値がREALSERVER_CONNECTで設定する。 + { + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->data_size = 10u; + up_thread_data->current_record_rest_size = 0u; + up_thread_data->data_buffer[10] = 0x17; + up_thread_data->data_buffer[11] = 0x03; + up_thread_data->data_buffer[12] = 0x01; + up_thread_data->data_buffer[13] = 0x00; + up_thread_data->data_buffer[14] = 0x9e; + up_thread_data->data_begain_offset = 10u; + up_thread_data->hello_message_flag = true; + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + status = this->handle_realserver_send(boost::this_thread::get_id()); + BOOST_CHECK(!this->session_thread_data_map[boost::this_thread::get_id()]->hello_message_flag); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_record_rest_size, 163u); + BOOST_CHECK_EQUAL(status, REALSERVER_CONNECT); + this->session_thread_data_map.clear(); + } + + } + + //handle_realserver_send + void handle_realserver_send_test_thread() { + + EVENT_TAG status; + + cout << "[207]--------------------------------------------- " << endl; + // unit_test[207] データサイズ > 0で, 且つcurrent_record_rest_size が 0で, 且つcheck_ssl_record_send()の戻り値が0(送信可能)で,且つdata_begain_offset > 0の場合 + // unit_test[207] 戻り値がREALSERVER_CONNECTで設定する。 + { + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->data_size = 76u; + up_thread_data->current_record_rest_size = 0u; + up_thread_data->data_buffer[10] = 0x16; + up_thread_data->data_buffer[11] = 0x03; + up_thread_data->data_buffer[12] = 0x01; + up_thread_data->data_buffer[13] = 0x00; + up_thread_data->data_buffer[14] = 0x9e; + up_thread_data->data_buffer[15] = 0x01; + up_thread_data->data_buffer[19] = 0x03; + up_thread_data->data_buffer[20] = 0x01; + up_thread_data->data_begain_offset = 10u; + up_thread_data->hello_message_flag = false; + { + boost::mutex::scoped_lock sclock(this->session_thread_data_map_mutex); + this->session_thread_data_map[boost::this_thread::get_id()] = up_thread_data; + } + status = this->handle_realserver_send(boost::this_thread::get_id()); + { + boost::mutex::scoped_lock sclock(check_mutex); + BOOST_CHECK(this->session_thread_data_map[boost::this_thread::get_id()]->hello_message_flag); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_record_rest_size, 163u); + BOOST_CHECK_EQUAL(status, REALSERVER_CONNECT); + } + } + } + + //handle_realserver_recv(tcp) + void handle_realserver_recv_tcp_test() { + + EVENT_TAG status; + boost::asio::ip::tcp::endpoint rs_endpoint; + boost::array recvbuffer; + int recvlen; + int mem_cmp_result; + int mem_cmp_length; + char* mem_cmp_buffer; + + cout << "[208]--------------------------------------------- " << endl; + // unit_test[208] データサイズ が 0で, 且つcurrent_record_rest_size > 0の場合 + // unit_test[208] 戻り値がCLIENT_CONNECTION_CHECK設定する。 + { + thread_data_ptr down_thread_data(new session_thread_data_sslid); + down_thread_data->data_size = 0u; + down_thread_data->current_record_rest_size = 10u; + recvlen = 0; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + status = this->handle_realserver_recv(boost::this_thread::get_id(), + rs_endpoint, recvbuffer, recvlen); + BOOST_CHECK_EQUAL(status, CLIENT_CONNECTION_CHECK); + this->session_thread_data_map.clear(); + } + + cout << "[209]--------------------------------------------- " << endl; + // unit_test[209] データサイズ が 0で, 且つcurrent_record_rest_size が 0で, 且つcheck_ssl_record_sendable()の戻り値が-1(異常)の場合 + // unit_test[209] 戻り値がFINALIZEで設定する。 + { + thread_data_ptr down_thread_data(new session_thread_data_sslid); + down_thread_data->data_size = 0u; + down_thread_data->current_record_rest_size = 0u; + down_thread_data->data_begain_offset = 0u; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + recvbuffer[0] = 0x00; + recvlen = 6; + for(int i=1; idata_buffer.c_array()+down_thread_data->data_begain_offset, down_thread_data->data_size); + memcpy(mem_cmp_buffer+down_thread_data->data_size, recvbuffer.c_array(), recvlen); + mem_cmp_length = down_thread_data->data_size + recvlen; + status = this->handle_realserver_recv(boost::this_thread::get_id(), + rs_endpoint, recvbuffer, recvlen); + mem_cmp_result = memcmp(mem_cmp_buffer, this->session_thread_data_map[boost::this_thread::get_id()]->data_buffer.c_array(), mem_cmp_length); + BOOST_CHECK_EQUAL(mem_cmp_result, 0); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->end_flag, END_FLAG_ON); + BOOST_CHECK_EQUAL(status, FINALIZE); + delete[] mem_cmp_buffer; + this->session_thread_data_map.clear(); + } + + cout << "[210]--------------------------------------------- " << endl; + // unit_test[210] データサイズ が 0で, 且つcurrent_record_rest_size が 0で, 且つcheck_ssl_record_sendable()の戻り値が1(送信不可)の場合 + // unit_test[210] 戻り値がREALSERVER_RECVで設定する。 + { + thread_data_ptr down_thread_data(new session_thread_data_sslid); + down_thread_data->data_size = 0u; + down_thread_data->data_begain_offset = 0u; + down_thread_data->current_record_rest_size = 0u; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + recvlen = 3; + for(int i=0; idata_buffer.c_array()+down_thread_data->data_begain_offset, down_thread_data->data_size); + memcpy(mem_cmp_buffer+down_thread_data->data_size, recvbuffer.c_array(), recvlen); + mem_cmp_length = down_thread_data->data_size + recvlen; + status = this->handle_realserver_recv(boost::this_thread::get_id(), + rs_endpoint, recvbuffer, recvlen); + mem_cmp_result = memcmp(mem_cmp_buffer, this->session_thread_data_map[boost::this_thread::get_id()]->data_buffer.c_array(), mem_cmp_length); + BOOST_CHECK_EQUAL(mem_cmp_result, 0); + BOOST_CHECK_EQUAL(status, REALSERVER_RECV); + delete[] mem_cmp_buffer; + this->session_thread_data_map.clear(); + } + + cout << "[211]--------------------------------------------- " << endl; + // unit_test[211] データサイズ が 0で, 且つcurrent_record_rest_size が 0で, 且つcheck_ssl_record_sendable()の戻り値が0(送信可能)の場合 + // unit_test[211] 戻り値がCLIENT_CONNECTION_CHECKで設定する。 + { + thread_data_ptr down_thread_data(new session_thread_data_sslid); + down_thread_data->data_size = 0u; + down_thread_data->data_begain_offset = 0u; + down_thread_data->current_record_rest_size = 0u; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + recvbuffer[0] = 0x16; + recvbuffer[1] = 0x03; + recvbuffer[2] = 0x01; + recvbuffer[3] = 0x00; + recvbuffer[4] = 0x9e; + recvbuffer[5] = 0x02; + recvbuffer[6] = 0x03; + recvbuffer[7] = 0x03; + recvbuffer[8] = 0x03; + recvbuffer[9] = 0x03; + recvbuffer[10] = 0x01; + recvlen = 76; + for(int i=11; idata_buffer.c_array()+down_thread_data->data_begain_offset, down_thread_data->data_size); + memcpy(mem_cmp_buffer+down_thread_data->data_size, recvbuffer.c_array(), recvlen); + mem_cmp_length = down_thread_data->data_size + recvlen; + status = this->handle_realserver_recv(boost::this_thread::get_id(), + rs_endpoint, recvbuffer, recvlen); + mem_cmp_result = memcmp(mem_cmp_buffer, this->session_thread_data_map[boost::this_thread::get_id()]->data_buffer.c_array(), mem_cmp_length); + BOOST_CHECK_EQUAL(mem_cmp_result, 0); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_record_rest_size, 163u); + BOOST_CHECK(this->session_thread_data_map[boost::this_thread::get_id()]->hello_message_flag); + BOOST_CHECK_EQUAL(status, CLIENT_CONNECTION_CHECK); + delete[] mem_cmp_buffer; + this->session_thread_data_map.clear(); + } + + cout << "[212]--------------------------------------------- " << endl; + // unit_test[212] データサイズ が 0で, 且つcurrent_record_rest_size が 0で, 且つcheck_ssl_record_sendable()の戻り値0(送信可能)の場合 + // unit_test[212] 戻り値がCLIENT_CONNECTION_CHECKで設定する。 + { + thread_data_ptr down_thread_data(new session_thread_data_sslid); + down_thread_data->data_size = 0u; + down_thread_data->data_begain_offset = 0u; + down_thread_data->current_record_rest_size = 0u; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + recvbuffer[0] = 0x17; + recvbuffer[1] = 0x03; + recvbuffer[2] = 0x01; + recvbuffer[3] = 0x00; + recvbuffer[4] = 0x9e; + recvlen = 10; + for(int i=5; idata_buffer.c_array()+down_thread_data->data_begain_offset, down_thread_data->data_size); + memcpy(mem_cmp_buffer+down_thread_data->data_size, recvbuffer.c_array(), recvlen); + mem_cmp_length = down_thread_data->data_size + recvlen; + status = this->handle_realserver_recv(boost::this_thread::get_id(), + rs_endpoint, recvbuffer, recvlen); + mem_cmp_result = memcmp(mem_cmp_buffer, this->session_thread_data_map[boost::this_thread::get_id()]->data_buffer.c_array(), mem_cmp_length); + BOOST_CHECK_EQUAL(mem_cmp_result, 0); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_record_rest_size, 163u); + BOOST_CHECK(!this->session_thread_data_map[boost::this_thread::get_id()]->hello_message_flag); + BOOST_CHECK_EQUAL(status, CLIENT_CONNECTION_CHECK); + delete[] mem_cmp_buffer; + this->session_thread_data_map.clear(); + } + + cout << "[213]--------------------------------------------- " << endl; + // unit_test[213] データサイズ > 0で, 且つcurrent_record_rest_size > 0で, 且つdata_begain_offset>0の場合 + // unit_test[213] 戻り値がCLIENT_CONNECTION_CHECKで設定する。 + { + thread_data_ptr down_thread_data(new session_thread_data_sslid); + down_thread_data->data_size = 10u; + down_thread_data->data_begain_offset = 5u; + down_thread_data->current_record_rest_size = 10u; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + recvlen = 15; + for(int i=5; idata_buffer.c_array()+down_thread_data->data_begain_offset, down_thread_data->data_size); + memcpy(mem_cmp_buffer+down_thread_data->data_size, recvbuffer.c_array(), recvlen); + mem_cmp_length = down_thread_data->data_size + recvlen; + status = this->handle_realserver_recv(boost::this_thread::get_id(), + rs_endpoint, recvbuffer, recvlen); + mem_cmp_result = memcmp(mem_cmp_buffer, this->session_thread_data_map[boost::this_thread::get_id()]->data_buffer.c_array(), mem_cmp_length); + BOOST_CHECK_EQUAL(mem_cmp_result, 0); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_size, 25u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_begain_offset, 0u); + BOOST_CHECK_EQUAL(status, CLIENT_CONNECTION_CHECK); + delete[] mem_cmp_buffer; + this->session_thread_data_map.clear(); + } + + cout << "[214]--------------------------------------------- " << endl; + // unit_test[214] データサイズ + 受信データサイズ > MAX_SSLID_BUFFER_SIZEの場合 + // unit_test[214] 戻り値がFINALIZEで設定する。 + { + thread_data_ptr down_thread_data(new session_thread_data_sslid); + down_thread_data->data_size = 76u + 1u; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + recvlen = MAX_BUFFER_SIZE; + status = this->handle_realserver_recv(boost::this_thread::get_id(), + rs_endpoint, recvbuffer, recvlen); + BOOST_CHECK_EQUAL(status, FINALIZE); + this->session_thread_data_map.clear(); + } + + } + + //handle_realserver_recv(tcp) + void handle_realserver_recv_tcp_test_thread() { + + EVENT_TAG status; + boost::asio::ip::tcp::endpoint rs_endpoint; + boost::array recvbuffer; + int recvlen; + int mem_cmp_result; + int mem_cmp_length; + char* mem_cmp_buffer; + + cout << "[215]--------------------------------------------- " << endl; + // unit_test[215] データサイズ が 0で, 且つcurrent_record_rest_size が 0で, 且つcheck_ssl_record_sendable()の戻り値が0(送信可能)の場合 + // unit_test[215] 戻り値がCLIENT_CONNECTION_CHECKで設定する。 + { + thread_data_ptr down_thread_data(new session_thread_data_sslid); + down_thread_data->data_size = 0u; + down_thread_data->data_begain_offset = 0u; + down_thread_data->current_record_rest_size = 0u; + { + boost::mutex::scoped_lock sclock(this->session_thread_data_map_mutex); + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + } + recvbuffer[0] = 0x16; + recvbuffer[1] = 0x03; + recvbuffer[2] = 0x01; + recvbuffer[3] = 0x00; + recvbuffer[4] = 0x9e; + recvbuffer[5] = 0x02; + recvbuffer[6] = 0x03; + recvbuffer[7] = 0x03; + recvbuffer[8] = 0x03; + recvbuffer[9] = 0x03; + recvbuffer[10] = 0x01; + recvlen = 76; + for(int i=11; idata_buffer.c_array()+down_thread_data->data_begain_offset, down_thread_data->data_size); + memcpy(mem_cmp_buffer+down_thread_data->data_size, recvbuffer.c_array(), recvlen); + mem_cmp_length = down_thread_data->data_size + recvlen; + status = this->handle_realserver_recv(boost::this_thread::get_id(), + rs_endpoint, recvbuffer, recvlen); + mem_cmp_result = memcmp(mem_cmp_buffer, this->session_thread_data_map[boost::this_thread::get_id()]->data_buffer.c_array(), mem_cmp_length); + { + boost::mutex::scoped_lock sclock(check_mutex); + BOOST_CHECK_EQUAL(mem_cmp_result, 0); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_record_rest_size, 163u); + BOOST_CHECK(this->session_thread_data_map[boost::this_thread::get_id()]->hello_message_flag); + BOOST_CHECK_EQUAL(status, CLIENT_CONNECTION_CHECK); + } + } + } + + //handle_realserver_recv(udp) + void handle_realserver_recv_udp_test(){ + cout << "[216]--------------------------------------------- " << endl; + // unit_test[216] 戻り値が STOPで設定する。 + boost::array recvbuffer; + size_t recvlen; + boost::asio::ip::udp::endpoint rs_endpoint_udp; + EVENT_TAG status = this->handle_realserver_recv(boost::this_thread::get_id(), + rs_endpoint_udp, recvbuffer, recvlen); + BOOST_CHECK_EQUAL(status, STOP); + } + + //handle_client_connection_check + void handle_client_connection_check_test() { + + boost::array sendbuffer; + size_t datalen = 0; + EVENT_TAG status; + int maxlist = 0; + int timeout = 0; + char* sslid_replication_area_begain; + int sslid_replication_area_size = 0; + std::string session_id; + boost::asio::ip::tcp::endpoint virtual_service_endpoint; + sslid_replication_data_processor * replication_data_processor = NULL; + getloglevel_func_type ingetloglevel = stb_getloglevel; + logger_func_type inputLogFatal = stb_putLogFatal; + logger_func_type inputLogError = stb_putLogError; + logger_func_type inputLogWarn = stb_putLogWarn; + logger_func_type inputLogInfo = stb_putLogInfo; + logger_func_type inputLogDebug = stb_putLogDebug; + boost::asio::ip::tcp::endpoint rs_endpoint(boost::asio::ip::address::from_string("192.168.120.249"), 12345); + + cout << "[217]--------------------------------------------- " << endl; + // unit_test[217] mapに下りスレッドIDが存在しない場合 + // unit_test[217] 戻り値がFINALIZEで設定する。 + status = this->handle_client_connection_check(boost::this_thread::get_id(), + sendbuffer, datalen); + BOOST_CHECK_EQUAL(status, FINALIZE); + + cout << "[218]--------------------------------------------- " << endl; + // unit_test[218] hello_message_flagがtrueで,current_record_rest_size>0で,且つdata_begain_offset が 0の場合 + // unit_test[218] 戻り値がCLIENT_SENDで設定する。 + { + thread_data_ptr down_thread_data(new session_thread_data_sslid); + down_thread_data->current_record_rest_size = 10u; + down_thread_data->hello_message_flag = true; + down_thread_data->data_size = 76u; + down_thread_data->data_buffer[43] = 0x00; + down_thread_data->data_begain_offset = 0u; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + status = this->handle_client_connection_check(boost::this_thread::get_id(), + sendbuffer, datalen); + BOOST_CHECK_EQUAL(status, CLIENT_SEND); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_size, 66u); + BOOST_CHECK(!this->session_thread_data_map[boost::this_thread::get_id()]->hello_message_flag); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_begain_offset, 10u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_record_rest_size, 0u); + this->session_thread_data_map.clear(); + } + + cout << "[219]--------------------------------------------- " << endl; + // unit_test[219] hello_message_flagがtrueで,current_record_rest_size>0で,且つdata_begain_offset >0の場合 + // unit_test[219] 戻り値がCLIENT_SENDで設定する。 + { + thread_data_ptr down_thread_data(new session_thread_data_sslid); + down_thread_data->current_record_rest_size = 10u; + down_thread_data->hello_message_flag = true; + down_thread_data->data_size = 76u; + down_thread_data->data_begain_offset = 10u; + down_thread_data->data_buffer[53] = 0x00; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + status = this->handle_client_connection_check(boost::this_thread::get_id(), + sendbuffer, datalen); + BOOST_CHECK_EQUAL(status, CLIENT_SEND); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_size, 66u); + BOOST_CHECK(!this->session_thread_data_map[boost::this_thread::get_id()]->hello_message_flag); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_begain_offset, 20u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_record_rest_size, 0u); + this->session_thread_data_map.clear(); + } + + + cout << "[220]--------------------------------------------- " << endl; + // unit_test[220] current_record_rest_sizeが0で、且つhello_message_flagがtrueで、且つdata_size ≧ 76で、且つdata_begain_offsetが0で + // unit_test[220] 且つget_ssl_session_id() の戻り値が 0 の場合 + // unit_test[220] 戻り値がCLIENT_SENDで設定する。 + { + thread_data_ptr down_thread_data(new session_thread_data_sslid); + down_thread_data->current_record_rest_size = 0u; + down_thread_data->hello_message_flag = true; + down_thread_data->data_buffer[43] = 0x20; + down_thread_data->data_size = 76u; + down_thread_data->data_begain_offset = 0u; + for(size_t i=44; idata_size; i++) + { + down_thread_data->data_buffer[i] = 0x01; + } + session_id.assign(down_thread_data->data_buffer.c_array()+44,down_thread_data->data_buffer.c_array()+76); + down_thread_data->selected_realserver = rs_endpoint; + maxlist = 3; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + this->replication_data_processor = new sslid_replication_data_processor(maxlist, sslid_replication_area_begain, + sslid_replication_area_size, virtual_service_endpoint, ingetloglevel, inputLogFatal, inputLogError, + inputLogWarn, inputLogInfo, inputLogDebug); + this->session_data_processor = new sslid_session_data_processor_stub( + maxlist, timeout, this->replication_data_processor, stb_getloglevel, + stb_putLogFatal, stb_putLogError, stb_putLogWarn, + stb_putLogInfo, stb_putLogDebug); + status = this->handle_client_connection_check(boost::this_thread::get_id(), + sendbuffer, datalen); + BOOST_CHECK_EQUAL((dynamic_cast(this->session_data_processor))->get_session_endpoint_map()[session_id], rs_endpoint); + BOOST_CHECK_EQUAL(status, CLIENT_SEND); + BOOST_CHECK(!this->session_thread_data_map[boost::this_thread::get_id()]->hello_message_flag); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_size, 76u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_begain_offset, 0u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_record_rest_size, 0u); + delete replication_data_processor; + this->session_thread_data_map.clear(); + } + + cout << "[221]--------------------------------------------- " << endl; + // unit_test[221] current_record_rest_sizeが0で,且つhello_message_flagがtrueで,且つdata_size ≧ 76で,且つdata_begain_offset>0で + // unit_test[221] 且つget_ssl_session_id()の戻り値が0の場合 + // unit_test[221] 戻り値がCLIENT_SENDで設定する。 + { + thread_data_ptr down_thread_data(new session_thread_data_sslid); + down_thread_data->current_record_rest_size = 0u; + down_thread_data->hello_message_flag = true; + down_thread_data->data_buffer[53] = 0x20; + down_thread_data->data_size = 76u; + down_thread_data->data_begain_offset = 10u; + for(size_t i=54; idata_size; i++) + { + down_thread_data->data_buffer[i] = 0x01; + } + session_id.assign(down_thread_data->data_buffer.c_array()+54,down_thread_data->data_buffer.c_array()+86); + down_thread_data->selected_realserver = rs_endpoint; + maxlist = 3; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + this->replication_data_processor = new sslid_replication_data_processor(maxlist, sslid_replication_area_begain, + sslid_replication_area_size, virtual_service_endpoint, ingetloglevel, inputLogFatal, inputLogError, + inputLogWarn, inputLogInfo, inputLogDebug); + this->session_data_processor = new sslid_session_data_processor_stub( + maxlist, timeout, this->replication_data_processor, stb_getloglevel, + stb_putLogFatal, stb_putLogError, stb_putLogWarn, + stb_putLogInfo, stb_putLogDebug); + status = this->handle_client_connection_check(boost::this_thread::get_id(), + sendbuffer, datalen); + BOOST_CHECK_EQUAL((dynamic_cast(this->session_data_processor))->get_session_endpoint_map()[session_id], rs_endpoint); + BOOST_CHECK_EQUAL(status, CLIENT_SEND); + BOOST_CHECK(!this->session_thread_data_map[boost::this_thread::get_id()]->hello_message_flag); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_size, 76u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_begain_offset, 10u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_record_rest_size, 0u); + delete replication_data_processor; + this->session_thread_data_map.clear(); + } + + + cout << "[222]--------------------------------------------- " << endl; + // unit_test[222] current_record_rest_sizeが0で,且つhello_message_flagがtrueで,且つdata_begain_offsetが0で + // unit_test[222] 且つget_ssl_session_id()の戻り値が1の場合 + // unit_test[222] 戻り値がCLIENT_SENDで設定する。 + { + thread_data_ptr down_thread_data(new session_thread_data_sslid); + down_thread_data->current_record_rest_size = 0u; + down_thread_data->hello_message_flag = true; + down_thread_data->data_buffer[43] = 0x00; + down_thread_data->data_size = 76u; + down_thread_data->data_begain_offset = 0u; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + status = this->handle_client_connection_check(boost::this_thread::get_id(), + sendbuffer, datalen); + BOOST_CHECK_EQUAL(status, CLIENT_SEND); + BOOST_CHECK(!this->session_thread_data_map[boost::this_thread::get_id()]->hello_message_flag); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_size, 76u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_begain_offset, 0u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_record_rest_size, 0u); + this->session_thread_data_map.clear(); + } + + cout << "[223]--------------------------------------------- " << endl; + // unit_test[223] current_record_rest_sizeが0で,且つhello_message_flagがtrueで,且つdata_begain_offset>0で + // unit_test[223] 且つget_ssl_session_id()の戻り値が1の場合 + // unit_test[223] 戻り値がCLIENT_SENDで設定する。 + { + thread_data_ptr down_thread_data(new session_thread_data_sslid); + down_thread_data->current_record_rest_size = 0u; + down_thread_data->hello_message_flag = true; + down_thread_data->data_buffer[53] = 0x00; + down_thread_data->data_size = 76u; + down_thread_data->data_begain_offset = 10u; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + status = this->handle_client_connection_check(boost::this_thread::get_id(), + sendbuffer, datalen); + BOOST_CHECK_EQUAL(status, CLIENT_SEND); + BOOST_CHECK(!this->session_thread_data_map[boost::this_thread::get_id()]->hello_message_flag); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_size, 76u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_begain_offset, 10u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_record_rest_size, 0u); + this->session_thread_data_map.clear(); + } + + cout << "[224]--------------------------------------------- " << endl; + // unit_test[224] current_record_rest_sizeが0で,且つhello_message_flagがfalseで,且つdata_begain_offsetが0の場合 + // unit_test[224] 戻り値がCLIENT_SENDで設定する。 + { + thread_data_ptr down_thread_data(new session_thread_data_sslid); + down_thread_data->current_record_rest_size = 0u; + down_thread_data->hello_message_flag = false; + down_thread_data->data_size = 76u; + down_thread_data->data_begain_offset = 0u; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + status = this->handle_client_connection_check(boost::this_thread::get_id(), + sendbuffer, datalen); + BOOST_CHECK_EQUAL(status, CLIENT_SEND); + BOOST_CHECK(!this->session_thread_data_map[boost::this_thread::get_id()]->hello_message_flag); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_size, 76u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_begain_offset, 0u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_record_rest_size, 0u); + this->session_thread_data_map.clear(); + } + + cout << "[225]--------------------------------------------- " << endl; + // unit_test[225] current_record_rest_sizeが0で,且つhello_message_flagがfalseで,且つdata_begain_offset>0の場合 + // unit_test[225] 戻り値がCLIENT_SENDで設定する。 + { + thread_data_ptr down_thread_data(new session_thread_data_sslid); + down_thread_data->current_record_rest_size = 0u; + down_thread_data->hello_message_flag = false; + down_thread_data->data_size = 76u; + down_thread_data->data_begain_offset = 10u; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + status = this->handle_client_connection_check(boost::this_thread::get_id(), + sendbuffer, datalen); + BOOST_CHECK_EQUAL(status, CLIENT_SEND); + BOOST_CHECK(!this->session_thread_data_map[boost::this_thread::get_id()]->hello_message_flag); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_size, 76u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_begain_offset, 10u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_record_rest_size, 0u); + this->session_thread_data_map.clear(); + } + + } + + //handle_client_connection_check + void handle_client_connection_check_test_thread() { + + boost::array sendbuffer; + size_t datalen = 0; + EVENT_TAG status; + std::string session_id; + boost::asio::ip::tcp::endpoint virtual_service_endpoint; + getloglevel_func_type ingetloglevel = stb_getloglevel; + logger_func_type inputLogFatal = stb_putLogFatal; + logger_func_type inputLogError = stb_putLogError; + logger_func_type inputLogWarn = stb_putLogWarn; + logger_func_type inputLogInfo = stb_putLogInfo; + logger_func_type inputLogDebug = stb_putLogDebug; + boost::asio::ip::tcp::endpoint rs_endpoint(boost::asio::ip::address::from_string("192.168.120.249"), 12345); + + cout << "[226]--------------------------------------------- " << endl; + // unit_test[226] current_record_rest_sizeが0で,且つhello_message_flagがfalseで,且つdata_begain_offsetが0の場合 + // unit_test[226] 戻り値がCLIENT_SENDで設定する。 + { + thread_data_ptr down_thread_data(new session_thread_data_sslid); + down_thread_data->current_record_rest_size = 0u; + down_thread_data->hello_message_flag = false; + down_thread_data->data_size = 76u; + down_thread_data->data_begain_offset = 0u; + { + boost::mutex::scoped_lock sclock(this->session_thread_data_map_mutex); + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + } + status = this->handle_client_connection_check(boost::this_thread::get_id(), + sendbuffer, datalen); + { + boost::mutex::scoped_lock sclock(check_mutex); + BOOST_CHECK_EQUAL(status, CLIENT_SEND); + BOOST_CHECK(!this->session_thread_data_map[boost::this_thread::get_id()]->hello_message_flag); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_size, 76u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_begain_offset, 0u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_record_rest_size, 0u); + } + } + } + + //handle_client_select + void handle_client_select_test(){ + cout << "[227]--------------------------------------------- " << endl; + // unit_test[227] 戻り値がSTOPで設定する。 + boost::asio::ip::udp::endpoint cl_endpoint; + boost::array sendbuffer; + size_t datalen; + EVENT_TAG status; + status = this->handle_client_select(boost::this_thread::get_id(), cl_endpoint, sendbuffer, datalen); + BOOST_CHECK_EQUAL(status, STOP); + } + + //handle_client_send + void handle_client_send_test() { + + EVENT_TAG status; + + cout << "[228]--------------------------------------------- " << endl; + // unit_test[228] 下りスレッドIDがmapに存在しない場合 + // unit_test[228] 戻り値がFINALIZEで設定する。 + this->session_thread_data_map.clear(); + status = this->handle_client_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(status, FINALIZE); + + cout << "[229]--------------------------------------------- " << endl; + // unit_test[229] データサイズが0で,且つ終了フラグがONで,且つdata_begain_offsetが0の場合 + // unit_test[229] 戻り値がCLIENT_DISCONNECTで設定する。 + { + thread_data_ptr down_thread_data(new session_thread_data_sslid); + down_thread_data->data_size = 0u; + down_thread_data->end_flag = END_FLAG_ON; + down_thread_data->data_begain_offset = 0u; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + status = this->handle_client_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(status, CLIENT_DISCONNECT); + this->session_thread_data_map.clear(); + } + + cout << "[230]--------------------------------------------- " << endl; + // unit_test[230] データサイズが0で,且つ終了フラグがONで,且つdata_begain_offset>0の場合 + // unit_test[230] 戻り値がCLIENT_DISCONNECTで設定する。 + { + thread_data_ptr down_thread_data(new session_thread_data_sslid); + down_thread_data->data_size = 0u; + down_thread_data->end_flag = END_FLAG_ON; + down_thread_data->data_begain_offset = 10u; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + status = this->handle_client_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(status, CLIENT_DISCONNECT); + this->session_thread_data_map.clear(); + } + + cout << "[231]--------------------------------------------- " << endl; + // unit_test[231] データサイズが0で,且つ終了フラグがOFFで,且つdata_begain_offset が 0の場合 + // unit_test[231] 戻り値がREALSERVER_RECVで設定する。 + { + thread_data_ptr down_thread_data(new session_thread_data_sslid); + down_thread_data->data_size = 0u; + down_thread_data->end_flag = END_FLAG_OFF; + down_thread_data->data_begain_offset = 0u; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + status = this->handle_client_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(status, REALSERVER_RECV); + this->session_thread_data_map.clear(); + } + + cout << "[232]--------------------------------------------- " << endl; + // unit_test[232] データサイズが0で,且つ終了フラグがOFFで,且つdata_begain_offset > 0の場合 + // unit_test[232] 戻り値がREALSERVER_RECVで設定する。 + { + thread_data_ptr down_thread_data(new session_thread_data_sslid); + down_thread_data->data_size = 0u; + down_thread_data->end_flag = END_FLAG_OFF; + down_thread_data->data_begain_offset = 10u; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + status = this->handle_client_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(status, REALSERVER_RECV); + this->session_thread_data_map.clear(); + } + + cout << "[233]--------------------------------------------- " << endl; + // unit_test[233] データサイズ>0で,且つcurrent_record_rest_size>0で,且つdata_begain_offsetが0の場合 + // unit_test[233] 戻り値がCLIENT_CONNECTION_CHECKで設定する。 + { + thread_data_ptr down_thread_data(new session_thread_data_sslid); + down_thread_data->data_size = 10u; + down_thread_data->current_record_rest_size = 8u; + down_thread_data->data_begain_offset = 0u; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + status = this->handle_client_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(status, CLIENT_CONNECTION_CHECK); + this->session_thread_data_map.clear(); + } + + cout << "[234]--------------------------------------------- " << endl; + // unit_test[234] データサイズ>0で,且つcurrent_record_rest_size>0で,且つdata_begain_offsetが0で,且つdata_begain_offset>0の場合 + // unit_test[234] 戻り値がCLIENT_CONNECTION_CHECKで設定する。 + { + thread_data_ptr down_thread_data(new session_thread_data_sslid); + down_thread_data->data_size = 10u; + down_thread_data->current_record_rest_size = 8u; + down_thread_data->data_begain_offset = 10u; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + status = this->handle_client_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(status, CLIENT_CONNECTION_CHECK); + this->session_thread_data_map.clear(); + } + + cout << "[235]--------------------------------------------- " << endl; + // unit_test[235] データサイズ>0で,且つcurrent_record_rest_sizeが0で,且つcheck_ssl_record_sendable()の戻り値が-1(異常)で,且つdata_begain_offsetが0の場合 + // unit_test[235] 戻り値がFINALIZEで設定する。 + { + thread_data_ptr down_thread_data(new session_thread_data_sslid); + down_thread_data->data_size = 10u; + down_thread_data->current_record_rest_size = 0u; + down_thread_data->data_buffer[0] = 0x00; + down_thread_data->data_begain_offset = 0u; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + status = this->handle_client_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->end_flag, END_FLAG_ON); + BOOST_CHECK_EQUAL(status, FINALIZE); + this->session_thread_data_map.clear(); + } + + cout << "[236]--------------------------------------------- " << endl; + // unit_test[236] データサイズ>0で,且つcurrent_record_rest_sizeが0で,且つcheck_ssl_record_sendable()の戻り値が-1(異常)で,且つdata_begain_offset>0の場合 + // unit_test[236] 戻り値がFINALIZEで設定する。 + { + thread_data_ptr down_thread_data(new session_thread_data_sslid); + down_thread_data->data_size = 10u; + down_thread_data->current_record_rest_size = 0u; + down_thread_data->data_buffer[10] = 0x00; + down_thread_data->data_begain_offset = 10u; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + status = this->handle_client_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->end_flag, END_FLAG_ON); + BOOST_CHECK_EQUAL(status, FINALIZE); + this->session_thread_data_map.clear(); + } + + cout << "[237]--------------------------------------------- " << endl; + // unit_test[237] データサイズ>0で,且つcurrent_record_rest_sizeが0で,且つcheck_ssl_record_sendable()の戻り値が1(送信不可)で,且つdata_begain_offsetが0で + // unit_test[237] 且つ終了フラグがONの場合 + // unit_test[237] 戻る値がCLIENT_DISCONNECTで設定する。 + { + thread_data_ptr down_thread_data(new session_thread_data_sslid); + down_thread_data->data_size = 3u; + down_thread_data->current_record_rest_size = 0u; + down_thread_data->end_flag = END_FLAG_ON; + down_thread_data->data_begain_offset = 0u; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + status = this->handle_client_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(status, CLIENT_DISCONNECT); + this->session_thread_data_map.clear(); + } + + cout << "[238]--------------------------------------------- " << endl; + // unit_test[238] データサイズ>0で,且つcurrent_record_rest_sizeが0で,且つcheck_ssl_record_sendable()の戻り値が1(送信不可)で,且つdata_begain_offset>0で + // unit_test[238] 且つ終了フラグがONの場合 + // unit_test[238] 戻り値がCLIENT_DISCONNECTで設定する。 + { + thread_data_ptr down_thread_data(new session_thread_data_sslid); + down_thread_data->data_size = 3u; + down_thread_data->current_record_rest_size = 0u; + down_thread_data->end_flag = END_FLAG_ON; + down_thread_data->data_begain_offset = 10u; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + status = this->handle_client_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(status, CLIENT_DISCONNECT); + this->session_thread_data_map.clear(); + } + + cout << "[239]--------------------------------------------- " << endl; + // unit_test[239] データサイズ>0で,且つcurrent_record_rest_sizeが0で,且つcheck_ssl_record_sendable()の戻り値が1(送信不可)で,且つdata_begain_offsetが0で + // unit_test[239] 且つ終了フラグがOFFの場合 + // unit_test[239] 戻り値がREALSERVER_RECVで設定する。 + { + thread_data_ptr down_thread_data(new session_thread_data_sslid); + down_thread_data->data_size = 3u; + down_thread_data->current_record_rest_size = 0u; + down_thread_data->end_flag = END_FLAG_OFF; + down_thread_data->data_begain_offset = 0u; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + status = this->handle_client_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(status, REALSERVER_RECV); + this->session_thread_data_map.clear(); + } + + cout << "[240]--------------------------------------------- " << endl; + // unit_test[240] データサイズ>0で,且つcurrent_record_rest_sizeが0で,且つcheck_ssl_record_sendable()の戻り値が1(送信不可)で,且つdata_begain_offset>0で + // unit_test[240] 且つ終了フラグがOFFの場合 + // unit_test[240] 戻り値がREALSERVER_RECVで設定する。 + { + thread_data_ptr down_thread_data(new session_thread_data_sslid); + down_thread_data->data_size = 3u; + down_thread_data->current_record_rest_size = 0u; + down_thread_data->end_flag = END_FLAG_OFF; + down_thread_data->data_begain_offset = 10u; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + status = this->handle_client_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(status, REALSERVER_RECV); + this->session_thread_data_map.clear(); + } + + cout << "[241]--------------------------------------------- " << endl; + // unit_test[241] データサイズ>=76で,且つcurrent_record_rest_sizeが0で,且つcheck_ssl_record_sendable()の戻り値が0(送信可能)で,且つdata_begain_offsetが0の場合 + // unit_test[241] 戻り値がCLIENT_CONNECTION_CHECKで設定する。 + { + thread_data_ptr down_thread_data(new session_thread_data_sslid); + down_thread_data->data_size = 76; + down_thread_data->current_record_rest_size = 0; + down_thread_data->data_buffer[0] = 0x16; + down_thread_data->data_buffer[1] = 0x03; + down_thread_data->data_buffer[2] = 0x01; + down_thread_data->data_buffer[3] = 0x00; + down_thread_data->data_buffer[4] = 0x9e; + down_thread_data->data_buffer[5] = 0x02; + down_thread_data->data_buffer[9] = 0x03; + down_thread_data->data_buffer[10] = 0x01; + down_thread_data->data_begain_offset = 0u; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + status = this->handle_client_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_record_rest_size, 163u); + BOOST_CHECK(this->session_thread_data_map[boost::this_thread::get_id()]->hello_message_flag); + BOOST_CHECK_EQUAL(status, CLIENT_CONNECTION_CHECK); + this->session_thread_data_map.clear(); + } + + cout << "[242]--------------------------------------------- " << endl; + // unit_test[242] データサイズ>=76で,且つcurrent_record_rest_sizeが0で,且つcheck_ssl_record_sendable()の戻り値が0(送信可能)で,且つdata_begain_offset>0が0の場合 + // unit_test[242] 戻り値がCLIENT_CONNECTION_CHECKで設定する。 + { + thread_data_ptr down_thread_data(new session_thread_data_sslid); + down_thread_data->data_size = 86; + down_thread_data->current_record_rest_size = 0; + down_thread_data->data_buffer[10] = 0x16; + down_thread_data->data_buffer[11] = 0x03; + down_thread_data->data_buffer[12] = 0x01; + down_thread_data->data_buffer[13] = 0x00; + down_thread_data->data_buffer[14] = 0x9e; + down_thread_data->data_buffer[15] = 0x02; + down_thread_data->data_buffer[19] = 0x03; + down_thread_data->data_buffer[20] = 0x01; + down_thread_data->data_begain_offset = 10u; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + status = this->handle_client_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_record_rest_size, 163u); + BOOST_CHECK(this->session_thread_data_map[boost::this_thread::get_id()]->hello_message_flag); + BOOST_CHECK_EQUAL(status, CLIENT_CONNECTION_CHECK); + this->session_thread_data_map.clear(); + } + + cout << "[243]--------------------------------------------- " << endl; + // unit_test[243] データサイズ>=6で,且つcurrent_record_rest_sizeが0で,且つcheck_ssl_record_sendable()の戻り値が0(送信可能)で,且つdata_begain_offsetが0の場合 + // unit_test[243] 戻り値がCLIENT_CONNECTION_CHECKで設定する。 + { + thread_data_ptr down_thread_data(new session_thread_data_sslid); + down_thread_data->data_size = 10; + down_thread_data->current_record_rest_size = 0; + down_thread_data->data_buffer[0] = 0x17; + down_thread_data->data_buffer[1] = 0x03; + down_thread_data->data_buffer[2] = 0x01; + down_thread_data->data_buffer[3] = 0x00; + down_thread_data->data_buffer[4] = 0x9e; + down_thread_data->data_begain_offset = 0u; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + status = this->handle_client_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_record_rest_size, 163u); + BOOST_CHECK(!this->session_thread_data_map[boost::this_thread::get_id()]->hello_message_flag); + BOOST_CHECK_EQUAL(status, CLIENT_CONNECTION_CHECK); + this->session_thread_data_map.clear(); + } + + cout << "[244]--------------------------------------------- " << endl; + // unit_test[244] データサイズ>=6で,且つcurrent_record_rest_sizeが0で,且つcheck_ssl_record_sendable()の戻り値が0(送信可能)で,且つdata_begain_offset>0の場合 + // unit_test[244] 戻り値がCLIENT_CONNECTION_CHECKで設定する。 + { + thread_data_ptr down_thread_data(new session_thread_data_sslid); + down_thread_data->data_size = 10; + down_thread_data->current_record_rest_size = 0; + down_thread_data->data_buffer[10] = 0x17; + down_thread_data->data_buffer[11] = 0x03; + down_thread_data->data_buffer[12] = 0x01; + down_thread_data->data_buffer[13] = 0x00; + down_thread_data->data_buffer[14] = 0x9e; + down_thread_data->data_begain_offset = 10u; + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + status = this->handle_client_send(boost::this_thread::get_id()); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_record_rest_size, 163u); + BOOST_CHECK(!this->session_thread_data_map[boost::this_thread::get_id()]->hello_message_flag); + BOOST_CHECK_EQUAL(status, CLIENT_CONNECTION_CHECK); + this->session_thread_data_map.clear(); + } + } + + //handle_client_send + void handle_client_send_test_thread() { + + EVENT_TAG status; + + cout << "[245]--------------------------------------------- " << endl; + // unit_test[245] データサイズ>=76で,且つcurrent_record_rest_sizeが0で,且つcheck_ssl_record_sendable()の戻り値が0(送信可能)で,且つdata_begain_offset>0が0の場合 + // unit_test[245] 戻り値がCLIENT_CONNECTION_CHECKで設定する。 + { + thread_data_ptr down_thread_data(new session_thread_data_sslid); + down_thread_data->data_size = 86; + down_thread_data->current_record_rest_size = 0; + down_thread_data->data_buffer[10] = 0x16; + down_thread_data->data_buffer[11] = 0x03; + down_thread_data->data_buffer[12] = 0x01; + down_thread_data->data_buffer[13] = 0x00; + down_thread_data->data_buffer[14] = 0x9e; + down_thread_data->data_buffer[15] = 0x02; + down_thread_data->data_buffer[19] = 0x03; + down_thread_data->data_buffer[20] = 0x01; + down_thread_data->data_begain_offset = 10u; + { + boost::mutex::scoped_lock sclock(this->session_thread_data_map_mutex); + this->session_thread_data_map[boost::this_thread::get_id()] = down_thread_data; + } + status = this->handle_client_send(boost::this_thread::get_id()); + { + boost::mutex::scoped_lock sclock(check_mutex); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_record_rest_size, 163u); + BOOST_CHECK(this->session_thread_data_map[boost::this_thread::get_id()]->hello_message_flag); + BOOST_CHECK_EQUAL(status, CLIENT_CONNECTION_CHECK); + } + } + } + + //handle_client_disconnect + void handle_client_disconnect_test(){ + cout << "[246]--------------------------------------------- " << endl; + //unit_test[246] handle_client_disconnect()メソッドのテスト,上りスレッドと下りスレッドの場合,正常系で必ずFINALIZEを返す + boost::thread tdown_for_get_id(down_thread_func); + boost::thread_group threads; + threads.create_thread(bind(&protocol_module_sslid_test_class::handle_client_disconnect_test_thread_func, + this, + boost::this_thread::get_id())); + threads.create_thread(bind(&protocol_module_sslid_test_class::handle_client_disconnect_test_thread_func, + this, + tdown_for_get_id.get_id())); + threads.join_all(); + + cout << "[247]--------------------------------------------- " << endl; + //unit_test[247] 上りスレッドの場合,正常系で必ずFINALIZEを返す + BOOST_CHECK_EQUAL(this->handle_client_disconnect(boost::this_thread::get_id()),FINALIZE); + } + void handle_client_disconnect_test_thread_func(const boost::thread::id thread_id){ + EVENT_TAG ret = this->handle_client_disconnect(thread_id); + { + boost::mutex::scoped_lock sclock(check_mutex); + BOOST_CHECK_EQUAL(ret, FINALIZE); + } + } + + //handle_realserver_disconnect + void handle_realserver_disconnect_test(){ + cout << "[248]--------------------------------------------- " << endl; + //unit_test[248] 正常系で必ずSTOPを返す + boost::asio::ip::tcp::endpoint ep; + BOOST_CHECK_EQUAL(this->handle_realserver_disconnect(boost::this_thread::get_id(),ep), STOP); + } + + //handle_sorryserver_select + void handle_sorryserver_select_test(){ + cout << "[249]--------------------------------------------- " << endl; + //unit_test[249] 正常系で必ずSTOPを返す + boost::asio::ip::tcp::endpoint ep; + BOOST_CHECK_EQUAL(this->handle_sorryserver_select(boost::this_thread::get_id(),ep), STOP); + } + + //handle_sorryserver_connect + void handle_sorryserver_connect_test(){ + cout << "[250]--------------------------------------------- " << endl; + //unit_test[250] 正常系で必ずSTOPを返す + boost::asio::ip::tcp::endpoint ep; + boost::array buffer; + size_t datalen; + BOOST_CHECK_EQUAL(this->handle_sorryserver_connect(boost::this_thread::get_id(),buffer,datalen), STOP); + } + + //handle_sorryserver_connection_fail + void handle_sorryserver_connection_fail_test(){ + cout << "[251]--------------------------------------------- " << endl; + //unit_test[251] 正常系で必ずSTOPを返す + boost::asio::ip::tcp::endpoint ep; + BOOST_CHECK_EQUAL(this->handle_sorryserver_connection_fail(boost::this_thread::get_id(),ep), STOP); + } + + //handle_sorryserver_send + void handle_sorryserver_send_test(){ + cout << "[252]--------------------------------------------- " << endl; + //unit_test[252] 正常系で必ずSTOPを返す + BOOST_CHECK_EQUAL(this->handle_sorryserver_send(boost::this_thread::get_id()), STOP); + } + + //handle_sorryserver_recv + void handle_sorryserver_recv_test(){ + cout << "[253]--------------------------------------------- " << endl; + //unit_test[253] 正常系で必ずSTOPを返す + boost::asio::ip::tcp::endpoint ep; + boost::array buffer; + size_t datalen; + BOOST_CHECK_EQUAL(this->handle_sorryserver_recv(boost::this_thread::get_id(),ep,buffer,datalen), STOP); + } + + //handle_response_send_inform + void handle_response_send_inform_test(){ + cout << "[254]--------------------------------------------- " << endl; + //unit_test[254] 正常系で必ずSTOPを返す + boost::asio::ip::tcp::endpoint ep; + BOOST_CHECK_EQUAL(this->handle_response_send_inform(boost::this_thread::get_id()), STOP); + } + + //handle_sorry_enable + void handle_sorry_enable_test(){ + cout << "[255]--------------------------------------------- " << endl; + //unit_test[255] 全部の場合,遷移先ステータスを設定する,status = STOP + //unit_test[255] test data:NULL + boost::asio::ip::tcp::endpoint ep; + BOOST_CHECK_EQUAL(this->handle_sorry_enable(boost::this_thread::get_id()), STOP); + } + + //handle_sorry_disable + void handle_sorry_disable_test(){ + cout << "[256]--------------------------------------------- " << endl; + //unit_test[256] 正常系で必ずSTOPを返す + boost::asio::ip::tcp::endpoint ep; + BOOST_CHECK_EQUAL(this->handle_sorry_disable(boost::this_thread::get_id()), STOP); + } + + //handle_sorryserver_disconnect + void handle_sorryserver_disconnect_test(){ + cout << "[257]--------------------------------------------- " << endl; + //unit_test[257] 正常系で必ずSTOPを返す + boost::asio::ip::tcp::endpoint ep; + BOOST_CHECK_EQUAL(this->handle_sorryserver_disconnect(boost::this_thread::get_id(),ep), STOP); + } + + //replication_interrupt + void replication_interrupt_test(){ + install_stb_replication_func(); + unsigned int data_size = 0; + void* data_addr = NULL; + const boost::asio::ip::tcp::endpoint ep; + data_addr = replication_pay_memory( get_name(), &data_size ); + this->replication_data_processor = new sslid_replication_data_processor_stub( + 1024, (char*)data_addr, data_size, ep, stb_getloglevel, + stb_putLogFatal, stb_putLogError, stb_putLogWarn, stb_putLogInfo, + stb_putLogDebug); + + cout << "[258]--------------------------------------------- " << endl; + //unit_test[258] op_codeが「A」の場合、replication_dataをreplication_areaに追加する。 + time_t last_time_A = time(0); + boost::asio::ip::tcp::endpoint real_ep_A; + struct sslid_replication_temp_data replication_temp_data_add; + replication_temp_data_add.op_code='A'; + replication_temp_data_add.session_id="11111111111111111111111111111111"; + replication_temp_data_add.last_time=last_time_A; + replication_temp_data_add.realserver_addr=real_ep_A; + sslid_replication_data_processor_stub* pstub; + try + { + pstub = dynamic_cast (replication_data_processor); + } + catch(std::bad_cast& ) + { + std::cout<<"bad_cast:::"<get_replication_area()=new sslid_replication_data; + pstub->register_replication_area_lock(replication_area_lock_stb); + pstub->register_replication_area_unlock(replication_area_unlock_stb); + pstub->get_temp_list().push_back(replication_temp_data_add); + pstub->get_replication_area()->valid=0; + + boost::thread test_thread1(boost::bind(&protocol_module_sslid_test_class::replication_interrupt,this)); + sleep(5); + BOOST_CHECK_EQUAL(pstub->get_replication_area()->valid,1); + BOOST_CHECK_EQUAL(pstub->get_replication_area()->last_time,last_time_A); + BOOST_CHECK_EQUAL(memcmp(pstub->get_replication_area()->session_id,"11111111111111111111111111111111",SSLID_LENGTH),0); + BOOST_CHECK_EQUAL(pstub->get_replication_area()->realserver_ip,real_ep_A.address().to_string().c_str()); + BOOST_CHECK_EQUAL(pstub->get_replication_area()->realserver_port,real_ep_A.port()); + test_thread1.interrupt(); + + cout << "[259]--------------------------------------------- " << endl; + //unit_test[259] op_codeが「U」、validが1且つセッションIDが一致の場合、replication_area中の該当データを更新する。 + time_t last_time_U = time(0); + boost::asio::ip::tcp::endpoint real_ep_U; + struct sslid_replication_temp_data replication_temp_data_update; + replication_temp_data_update.op_code='U'; + replication_temp_data_update.session_id="11111111111111111111111111111111"; + replication_temp_data_update.last_time=last_time_U; + replication_temp_data_update.realserver_addr=real_ep_U; + pstub->get_temp_list().push_back(replication_temp_data_update); + pstub->get_replication_area()->valid=1; + strcpy(pstub->get_replication_area()->session_id,"11111111111111111111111111111111"); + boost::thread test_thread2(boost::bind(&protocol_module_sslid_test_class::replication_interrupt,this)); + sleep(5); + BOOST_CHECK_EQUAL(pstub->get_replication_area()->valid,1); + BOOST_CHECK_EQUAL(pstub->get_replication_area()->last_time,last_time_U); + BOOST_CHECK_EQUAL(pstub->get_replication_area()->realserver_ip,real_ep_U.address().to_string().c_str()); + BOOST_CHECK_EQUAL(pstub->get_replication_area()->realserver_port,real_ep_U.port()); + test_thread2.interrupt(); + + cout << "[260]--------------------------------------------- " << endl; + //unit_test[260] op_codeが「D」、validが1且つセッションIDが存在する場合、replication_areaから該当データを削除する。 + time_t last_time_D = time(0); + boost::asio::ip::tcp::endpoint real_ep_D; + struct sslid_replication_temp_data replication_temp_data_delete; + replication_temp_data_delete.op_code='D'; + replication_temp_data_delete.session_id="11111111111111111111111111111111"; + replication_temp_data_delete.last_time=last_time_D; + replication_temp_data_delete.realserver_addr=real_ep_D; + pstub->get_temp_list().push_back(replication_temp_data_delete); + pstub->get_replication_area()->valid=1; + strcpy(pstub->get_replication_area()->session_id,"11111111111111111111111111111111"); + boost::thread test_thread3(boost::bind(&protocol_module_sslid_test_class::replication_interrupt,this)); + sleep(5); + BOOST_CHECK_EQUAL(pstub->get_replication_area()->valid,0); + test_thread3.interrupt(); + sleep(5); + delete this->replication_data_processor; + } + + //put_data_to_sendbuffer + void put_data_to_sendbuffer_test(){ + boost::array sendbuffer; + size_t datalen = 0u; + int ret = 0; + int mem_cmp_result; + int mem_cmp_length; + char* mem_cmp_buffer; + + cout << "[261]--------------------------------------------- " << endl; + // unit_test[261] スレッドIDがmapに存在していない場合 + // unit_test[261] 戻り値が -1で設定する。 + ret = this->put_data_to_sendbuffer(boost::this_thread::get_id(), sendbuffer, datalen); + BOOST_CHECK_EQUAL(ret, -1); + + cout << "[262]--------------------------------------------- " << endl; + // unit_test[262] current_record_rest_size>data_sizeで, 且つdata_size<送信バッファサイズの場合 + // unit_test[262] 戻り値が0で設定する。 + { + datalen = 0; + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->current_record_rest_size = 20u; + up_thread_data->data_size = 10u; + up_thread_data->data_begain_offset = 5u; + for(size_t i=up_thread_data->data_begain_offset; idata_begain_offset+up_thread_data->data_size; i++) + { + up_thread_data->data_buffer[i] = 0x01; + } + mem_cmp_buffer = new char[MAX_SSLID_BUFFER_SIZE]; + memcpy(mem_cmp_buffer, up_thread_data->data_buffer.c_array()+up_thread_data->data_begain_offset, up_thread_data->data_size); + mem_cmp_length = up_thread_data->data_size; + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + ret = this->put_data_to_sendbuffer(boost::this_thread::get_id(), + sendbuffer, datalen); + mem_cmp_result = memcmp(mem_cmp_buffer, sendbuffer.c_array(), mem_cmp_length); + BOOST_CHECK_EQUAL(mem_cmp_result, 0); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_begain_offset, 0u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_record_rest_size, 10u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_size, 0u); + BOOST_CHECK_EQUAL(ret, 0); + BOOST_CHECK_EQUAL(datalen, 10u); + delete[] mem_cmp_buffer; + this->session_thread_data_map.clear(); + } + + cout << "[263]--------------------------------------------- " << endl; + // unit_test[263] current_record_rest_size>data_sizeで, 且つdata_size=送信バッファサイズの場合 + // unit_test[263] 戻り値が0で設定する。 + { + datalen = 0; + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->current_record_rest_size = static_cast(MAX_BUFFER_SIZE) + 1u; + up_thread_data->data_size = static_cast(MAX_BUFFER_SIZE); + up_thread_data->data_begain_offset = 5u; + for(size_t i=up_thread_data->data_begain_offset; idata_begain_offset+up_thread_data->data_size; i++) + { + up_thread_data->data_buffer[i] = 0x02; + } + mem_cmp_buffer = new char[MAX_SSLID_BUFFER_SIZE]; + memcpy(mem_cmp_buffer, up_thread_data->data_buffer.c_array()+up_thread_data->data_begain_offset, up_thread_data->data_size); + mem_cmp_length = up_thread_data->data_size; + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + ret = this->put_data_to_sendbuffer(boost::this_thread::get_id(), + sendbuffer, datalen); + mem_cmp_result = memcmp(mem_cmp_buffer, sendbuffer.c_array(), mem_cmp_length); + BOOST_CHECK_EQUAL(mem_cmp_result, 0); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_begain_offset, 0u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_record_rest_size, 1u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_size, 0u); + BOOST_CHECK_EQUAL(ret, 0); + BOOST_CHECK_EQUAL(datalen, static_cast(MAX_BUFFER_SIZE)); + delete[] mem_cmp_buffer; + this->session_thread_data_map.clear(); + } + + cout << "[264]--------------------------------------------- " << endl; + // unit_test[264] current_record_rest_sizeがdata_sizeで, 且つdata_size<送信バッファサイズの場合 + // unit_test[264] 戻り値が0設定する。 + { + datalen = 0; + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->current_record_rest_size = 10u; + up_thread_data->data_size = 10u; + up_thread_data->data_begain_offset = 5u; + for(size_t i=up_thread_data->data_begain_offset; idata_begain_offset+up_thread_data->data_size; i++) + { + up_thread_data->data_buffer[i] = 0x03; + } + mem_cmp_buffer = new char[MAX_SSLID_BUFFER_SIZE]; + memcpy(mem_cmp_buffer, up_thread_data->data_buffer.c_array()+up_thread_data->data_begain_offset, up_thread_data->data_size); + mem_cmp_length = up_thread_data->data_size; + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + ret = this->put_data_to_sendbuffer(boost::this_thread::get_id(), + sendbuffer, datalen); + mem_cmp_result = memcmp(mem_cmp_buffer, sendbuffer.c_array(), mem_cmp_length); + BOOST_CHECK_EQUAL(mem_cmp_result, 0); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_begain_offset, 0u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_record_rest_size, 0u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_size, 0u); + BOOST_CHECK_EQUAL(ret, 0); + BOOST_CHECK_EQUAL(datalen, 10u); + delete[] mem_cmp_buffer; + this->session_thread_data_map.clear(); + } + + cout << "[265]--------------------------------------------- " << endl; + // unit_test[265] current_record_rest_sizeがdata_sizeで, 且つdata_sizeが送信バッファサイズの場合 + // unit_test[265] 戻り値が0で設定する + { + datalen = 0; + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->current_record_rest_size = static_cast(MAX_BUFFER_SIZE); + up_thread_data->data_size = static_cast(MAX_BUFFER_SIZE); + up_thread_data->data_begain_offset = 5u; + for(size_t i=up_thread_data->data_begain_offset; idata_begain_offset+up_thread_data->data_size; i++) + { + up_thread_data->data_buffer[i] = 0x04; + } + mem_cmp_buffer = new char[MAX_SSLID_BUFFER_SIZE]; + memcpy(mem_cmp_buffer, up_thread_data->data_buffer.c_array()+up_thread_data->data_begain_offset, up_thread_data->data_size); + mem_cmp_length = up_thread_data->data_size; + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + ret = this->put_data_to_sendbuffer(boost::this_thread::get_id(), + sendbuffer, datalen); + mem_cmp_result = memcmp(mem_cmp_buffer, sendbuffer.c_array(), mem_cmp_length); + BOOST_CHECK_EQUAL(mem_cmp_result, 0); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_begain_offset, 0u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_record_rest_size, 0u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_size, 0u); + BOOST_CHECK_EQUAL(ret, 0); + BOOST_CHECK_EQUAL(datalen, static_cast(MAX_BUFFER_SIZE)); + delete[] mem_cmp_buffer; + this->session_thread_data_map.clear(); + } + + cout << "[266]--------------------------------------------- " << endl; + // unit_test[266] current_record_rest_size>data_sizeで,且つdata_size>送信バッファサイズの場合 + // unit_test[266] 戻り値が0で設定する。 + { + datalen = 0; + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->current_record_rest_size = static_cast(MAX_BUFFER_SIZE) + 10u; + up_thread_data->data_size = static_cast(MAX_BUFFER_SIZE) + 5u; + up_thread_data->data_begain_offset = 10u; + for(size_t i=up_thread_data->data_begain_offset; idata_begain_offset+up_thread_data->data_size; i++) + { + up_thread_data->data_buffer[i] = 0x05; + } + mem_cmp_buffer = new char[MAX_SSLID_BUFFER_SIZE]; + memcpy(mem_cmp_buffer, up_thread_data->data_buffer.c_array()+up_thread_data->data_begain_offset, up_thread_data->data_size); + mem_cmp_length = MAX_BUFFER_SIZE; + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + ret = this->put_data_to_sendbuffer(boost::this_thread::get_id(), + sendbuffer, datalen); + mem_cmp_result = memcmp(mem_cmp_buffer, sendbuffer.c_array(), mem_cmp_length); + BOOST_CHECK_EQUAL(mem_cmp_result, 0); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_begain_offset, 10u+static_cast(MAX_BUFFER_SIZE)); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_record_rest_size, 10u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_size, 5u); + BOOST_CHECK_EQUAL(ret, 0); + BOOST_CHECK_EQUAL(datalen, static_cast(MAX_BUFFER_SIZE)); + delete[] mem_cmp_buffer; + this->session_thread_data_map.clear(); + } + + cout << "[267]--------------------------------------------- " << endl; + // unit_test[267] current_record_rest_sizeがdata_sizeで,且つdata_size>送信バッファサイズの場合 + // unit_test[267] 戻り値が0で設定する。 + { + datalen = 0; + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->current_record_rest_size = static_cast(MAX_BUFFER_SIZE) + 10u; + up_thread_data->data_size = static_cast(MAX_BUFFER_SIZE) + 10u; + up_thread_data->data_begain_offset = 10u; + for(size_t i=up_thread_data->data_begain_offset; idata_begain_offset+up_thread_data->data_size; i++) + { + up_thread_data->data_buffer[i] = 0x06; + } + mem_cmp_buffer = new char[MAX_SSLID_BUFFER_SIZE]; + memcpy(mem_cmp_buffer, up_thread_data->data_buffer.c_array()+up_thread_data->data_begain_offset, up_thread_data->data_size); + mem_cmp_length = MAX_BUFFER_SIZE; + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + ret = this->put_data_to_sendbuffer(boost::this_thread::get_id(), + sendbuffer, datalen); + mem_cmp_result = memcmp(mem_cmp_buffer, sendbuffer.c_array(), mem_cmp_length); + BOOST_CHECK_EQUAL(mem_cmp_result, 0); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_begain_offset, 10u+static_cast(MAX_BUFFER_SIZE)); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_record_rest_size, 10u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_size, 10u); + BOOST_CHECK_EQUAL(ret, 0); + BOOST_CHECK_EQUAL(datalen, static_cast(MAX_BUFFER_SIZE)); + delete[] mem_cmp_buffer; + this->session_thread_data_map.clear(); + } + + cout << "[268]--------------------------------------------- " << endl; + // unit_test[268] current_record_rest_size<data_sizeで, 且つcurrent_record_rest_size<送信バッファサイズの場合 + // unit_test[268] 戻り値が0で設定する。 + { + datalen = 0; + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->current_record_rest_size = 10u; + up_thread_data->data_size = 20u; + up_thread_data->data_begain_offset = 5u; + for(size_t i=up_thread_data->data_begain_offset; idata_begain_offset+up_thread_data->data_size; i++) + { + up_thread_data->data_buffer[i] = 0x07; + } + mem_cmp_buffer = new char[MAX_SSLID_BUFFER_SIZE]; + memcpy(mem_cmp_buffer, up_thread_data->data_buffer.c_array()+up_thread_data->data_begain_offset, up_thread_data->data_size); + mem_cmp_length = up_thread_data->current_record_rest_size; + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + ret = this->put_data_to_sendbuffer(boost::this_thread::get_id(), + sendbuffer, datalen); + mem_cmp_result = memcmp(mem_cmp_buffer, sendbuffer.c_array(), mem_cmp_length); + BOOST_CHECK_EQUAL(mem_cmp_result, 0); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_begain_offset, 15u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_record_rest_size, 0u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_size, 10u); + BOOST_CHECK_EQUAL(ret, 0); + BOOST_CHECK_EQUAL(datalen, 10u); + delete[] mem_cmp_buffer; + this->session_thread_data_map.clear(); + } + + cout << "[269]--------------------------------------------- " << endl; + // unit_test[269] current_record_rest_sizecurrent_record_rest_size = static_cast(MAX_BUFFER_SIZE); + up_thread_data->data_size = static_cast(MAX_BUFFER_SIZE) + 10u; + up_thread_data->data_begain_offset = 5u; + for(size_t i=up_thread_data->data_begain_offset; idata_begain_offset+up_thread_data->data_size; i++) + { + up_thread_data->data_buffer[i] = 0x08; + } + mem_cmp_buffer = new char[MAX_SSLID_BUFFER_SIZE]; + memcpy(mem_cmp_buffer, up_thread_data->data_buffer.c_array()+up_thread_data->data_begain_offset, up_thread_data->data_size); + mem_cmp_length = up_thread_data->current_record_rest_size; + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + ret = this->put_data_to_sendbuffer(boost::this_thread::get_id(), + sendbuffer, datalen); + mem_cmp_result = memcmp(mem_cmp_buffer, sendbuffer.c_array(), mem_cmp_length); + BOOST_CHECK_EQUAL(mem_cmp_result, 0); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_begain_offset, 5u+static_cast(MAX_BUFFER_SIZE)); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_record_rest_size, 0u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_size, 10u); + BOOST_CHECK_EQUAL(ret, 0); + BOOST_CHECK_EQUAL(datalen, static_cast(MAX_BUFFER_SIZE)); + delete[] mem_cmp_buffer; + this->session_thread_data_map.clear(); + } + + cout << "[270]--------------------------------------------- " << endl; + // unit_test[270] current_record_rest_size<data_sizeで,且つcurrent_record_rest_size>送信バッファサイズの場合 + // unit_test[270] 戻り値が0で設定する。 + { + datalen = 0; + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->current_record_rest_size = static_cast(MAX_BUFFER_SIZE) + 10u; + up_thread_data->data_size = static_cast(MAX_BUFFER_SIZE) + 20u; + up_thread_data->data_begain_offset = 5u; + for(size_t i=up_thread_data->data_begain_offset; idata_begain_offset+up_thread_data->data_size; i++) + { + up_thread_data->data_buffer[i] = 0x08; + } + mem_cmp_buffer = new char[MAX_SSLID_BUFFER_SIZE]; + memcpy(mem_cmp_buffer, up_thread_data->data_buffer.c_array()+up_thread_data->data_begain_offset, up_thread_data->data_size); + mem_cmp_length = MAX_BUFFER_SIZE; + this->session_thread_data_map[boost::this_thread::get_id()] + = up_thread_data; + ret = this->put_data_to_sendbuffer(boost::this_thread::get_id(), + sendbuffer, datalen); + mem_cmp_result = memcmp(mem_cmp_buffer, sendbuffer.c_array(), mem_cmp_length); + BOOST_CHECK_EQUAL(mem_cmp_result, 0); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_begain_offset, 5u+static_cast(MAX_BUFFER_SIZE)); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_record_rest_size, 10u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_size, 20u); + BOOST_CHECK_EQUAL(ret, 0); + BOOST_CHECK_EQUAL(datalen, static_cast(MAX_BUFFER_SIZE)); + delete[] mem_cmp_buffer; + this->session_thread_data_map.clear(); + } + + } + + //put_data_to_sendbuffer + void put_data_to_sendbuffer_test_thread(){ + boost::array sendbuffer; + size_t datalen = 0u; + int ret = 0; + int mem_cmp_result; + int mem_cmp_length; + char* mem_cmp_buffer; + + cout << "[271]--------------------------------------------- " << endl; + // unit_test[271] current_record_rest_sizeがdata_sizeで,且つdata_size>送信バッファサイズの場合 + // unit_test[271] 戻り値が0で設定する。 + { + datalen = 0; + thread_data_ptr up_thread_data(new session_thread_data_sslid); + up_thread_data->current_record_rest_size = static_cast(MAX_BUFFER_SIZE) + 10u; + up_thread_data->data_size = static_cast(MAX_BUFFER_SIZE) + 10u; + up_thread_data->data_begain_offset = 10u; + for(size_t i=up_thread_data->data_begain_offset; idata_begain_offset+up_thread_data->data_size; i++) + { + up_thread_data->data_buffer[i] = 0x06; + } + mem_cmp_buffer = new char[MAX_SSLID_BUFFER_SIZE]; + memcpy(mem_cmp_buffer, up_thread_data->data_buffer.c_array()+up_thread_data->data_begain_offset, up_thread_data->data_size); + mem_cmp_length = MAX_BUFFER_SIZE; + { + boost::mutex::scoped_lock sclock(this->session_thread_data_map_mutex); + this->session_thread_data_map[boost::this_thread::get_id()] = up_thread_data; + } + ret = this->put_data_to_sendbuffer(boost::this_thread::get_id(), + sendbuffer, datalen); + mem_cmp_result = memcmp(mem_cmp_buffer, sendbuffer.c_array(), mem_cmp_length); + { + boost::mutex::scoped_lock sclock(check_mutex); + BOOST_CHECK_EQUAL(mem_cmp_result, 0); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_begain_offset, 10u+static_cast(MAX_BUFFER_SIZE)); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->current_record_rest_size, 10u); + BOOST_CHECK_EQUAL(this->session_thread_data_map[boost::this_thread::get_id()]->data_size, 10u); + BOOST_CHECK_EQUAL(ret, 0); + BOOST_CHECK_EQUAL(datalen, static_cast(MAX_BUFFER_SIZE)); + } + } + } + + //realserver_selected + void realserver_selected_test(){ + cout << "[272]--------------------------------------------- " << endl; + //unit_test[272] 正常系で必ずFALSEを返す + boost::asio::ip::tcp::endpoint ep; + BOOST_CHECK_EQUAL(this->realserver_selected(ep), false); + } + + +}; + + +/*********************************************************************************** + *以下はBOOST_TEST_SUITEに入れる関数 + ***********************************************************************************/ + +void protocol_module_sslid_test(){ + protocol_module_sslid_test_class obj; + obj.protocol_module_sslid_test(); +} +void is_tcp_test(){ + protocol_module_sslid_test_class obj; + obj.is_tcp_test(); +} +void is_udp_test(){ + protocol_module_sslid_test_class obj; + obj.is_udp_test(); +} +void get_name_test(){ + protocol_module_sslid_test_class obj; + obj.get_name_test(); +} +void initialize_test(){ + protocol_module_sslid_test_class obj; + obj.initialize_test(); +} +void finalize_test(){ + protocol_module_sslid_test_class obj; + obj.finalize_test(); +} +void is_use_sorry_test(){ + protocol_module_sslid_test_class obj; + obj.is_use_sorry_test(); +} +void check_parameter_test(){ + protocol_module_sslid_test_class obj; + obj.check_parameter_test(); +} +void set_parameter_test(){ + protocol_module_sslid_test_class obj; + obj.set_parameter_test(); +} +void add_parameter_test(){ + protocol_module_sslid_test_class obj; + obj.add_parameter_test(); +} +//handle_rslist_update_test +void register_schedule_tcp_test(){ + protocol_module_sslid_test_class obj; + obj.register_schedule_tcp_test(); +} +//register_schedule_udp_test +void handle_session_initialize_test(){ + protocol_module_sslid_test_class obj; + obj.handle_session_initialize_test(); +} +void handle_session_initialize_test_thread(){ + protocol_module_sslid_test_class obj; + boost::thread_group threads; + for (int i=0; i ingetloglevel = stb_getloglevel; + boost::function inputLogFatal = stb_putLogFatal; + boost::function inputLogError = stb_putLogError; + boost::function inputLogWarn = stb_putLogWarn; + boost::function inputLogInfo = stb_putLogInfo; + boost::function inputLogDebug = stb_putLogDebug; + obj.set_reschedule(1); + obj.set_schedule_tcp(schedule_tcp_func1); + obj.init_logger_functions(ingetloglevel, inputLogFatal, inputLogError, + inputLogWarn, inputLogInfo, inputLogDebug); + std::vector args; + obj.install_stb_replication_func(); + obj.set_replication_data_processor(new sslid_replication_data_processor(maxlist, sslid_replication_area_begain, + sslid_replication_area_size, virtual_service_endpoint, ingetloglevel, inputLogFatal, inputLogError, + inputLogWarn, inputLogInfo, inputLogDebug)); + obj.set_session_data_processor(new sslid_session_data_processor( + 1024, 3600, obj.get_replication_data_processor(), ingetloglevel, + inputLogFatal, inputLogError, inputLogWarn, inputLogInfo, + inputLogDebug)); + boost::thread_group threads; + for (int i=0; iadd(BOOST_TEST_CASE( &protocol_module_sslid_test )); + ts->add(BOOST_TEST_CASE( &is_tcp_test )); + ts->add(BOOST_TEST_CASE( &is_udp_test )); + ts->add(BOOST_TEST_CASE( &get_name_test )); + ts->add(BOOST_TEST_CASE( &initialize_test )); + ts->add(BOOST_TEST_CASE( &finalize_test )); + ts->add(BOOST_TEST_CASE( &is_use_sorry_test )); + ts->add(BOOST_TEST_CASE( &check_parameter_test )); + ts->add(BOOST_TEST_CASE( &set_parameter_test )); + ts->add(BOOST_TEST_CASE( &add_parameter_test )); + // ts->add(BOOST_TEST_CASE( &handle_rslist_update_test )); + ts->add(BOOST_TEST_CASE( ®ister_schedule_tcp_test )); + // ts->add(BOOST_TEST_CASE( ®ister_schedule_udp_test )); + ts->add(BOOST_TEST_CASE( &handle_session_initialize_test )); + ts->add(BOOST_TEST_CASE( &handle_session_initialize_test_thread )); + ts->add(BOOST_TEST_CASE( &handle_session_finalize_test )); + ts->add(BOOST_TEST_CASE( &handle_session_finalize_test_thread )); + ts->add(BOOST_TEST_CASE( &handle_accept_test )); + ts->add(BOOST_TEST_CASE( &handle_accept_test_thread )); + ts->add(BOOST_TEST_CASE( &handle_client_recv_test )); + ts->add(BOOST_TEST_CASE( &handle_client_recv_test_thread )); + ts->add(BOOST_TEST_CASE( &handle_realserver_select_tcp_test )); + ts->add(BOOST_TEST_CASE( &handle_realserver_select_tcp_test_thread )); + ts->add(BOOST_TEST_CASE( &handle_realserver_select_udp_test )); + ts->add(BOOST_TEST_CASE( &handle_realserver_connect_test )); + ts->add(BOOST_TEST_CASE( &handle_realserver_connect_test_thread )); + ts->add(BOOST_TEST_CASE( &handle_realserver_connection_fail_test )); + ts->add(BOOST_TEST_CASE( &handle_realserver_connection_fail_test_thread_reschedule )); + ts->add(BOOST_TEST_CASE( &handle_realserver_connection_fail_test_thread_noreschedule )); + ts->add(BOOST_TEST_CASE( &handle_realserver_send_test )); + ts->add(BOOST_TEST_CASE( &handle_realserver_send_test_thread )); + ts->add(BOOST_TEST_CASE( &handle_realserver_recv_tcp_test )); + ts->add(BOOST_TEST_CASE( &handle_realserver_recv_tcp_test_thread )); + ts->add(BOOST_TEST_CASE( &handle_realserver_recv_udp_test )); + ts->add(BOOST_TEST_CASE( &handle_client_connection_check_test )); + ts->add(BOOST_TEST_CASE( &handle_client_connection_check_test_thread )); + ts->add(BOOST_TEST_CASE( &handle_client_select_test )); + ts->add(BOOST_TEST_CASE( &handle_client_send_test )); + ts->add(BOOST_TEST_CASE( &handle_client_send_test_thread )); + ts->add(BOOST_TEST_CASE( &handle_client_disconnect_test )); + ts->add(BOOST_TEST_CASE( &handle_realserver_disconnect_test )); + ts->add(BOOST_TEST_CASE( &handle_sorryserver_select_test )); + ts->add(BOOST_TEST_CASE( &handle_sorryserver_connect_test )); + ts->add(BOOST_TEST_CASE( &handle_sorryserver_connection_fail_test )); + ts->add(BOOST_TEST_CASE( &handle_sorryserver_send_test )); + ts->add(BOOST_TEST_CASE( &handle_sorryserver_recv_test )); + ts->add(BOOST_TEST_CASE( &handle_response_send_inform_test )); + ts->add(BOOST_TEST_CASE( &handle_sorry_enable_test )); + ts->add(BOOST_TEST_CASE( &handle_sorry_disable_test )); + ts->add(BOOST_TEST_CASE( &handle_sorryserver_disconnect_test )); + ts->add(BOOST_TEST_CASE( &replication_interrupt_test )); + ts->add(BOOST_TEST_CASE( &put_data_to_sendbuffer_test )); + ts->add(BOOST_TEST_CASE( &put_data_to_sendbuffer_test_thread )); + ts->add(BOOST_TEST_CASE( &realserver_selected_test )); + framework::master_test_suite().add(ts); +} + diff --git a/unit_tests/module_test/protocol_module_sslid_test/sslid_replication_data_processor_test.cpp b/unit_tests/module_test/protocol_module_sslid_test/sslid_replication_data_processor_test.cpp new file mode 100644 index 00000000..2795fe87 --- /dev/null +++ b/unit_tests/module_test/protocol_module_sslid_test/sslid_replication_data_processor_test.cpp @@ -0,0 +1,1623 @@ +/* + * @file sslid_replication_data_processor_test.cpp + * @brief sslid replication data processor test file. + * + * L7VSD: Linux Virtual Server for Layer7 Load Balancing + * Copyright (C) 2009 NTT COMWARE Corporation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + **********************************************************************/ + +#include "sslid_to_be_test_file.h" + +using namespace boost::unit_test; +using namespace l7vs; + +#define SECTION_NUMBER 200 +#define STRUCT_NUMBER 256 + +bool is_lock_function_called = false; +bool is_unlock_function_called = false; +bool is_put_into_temp_list_test_thread4_waiting = false; +bool is_put_into_temp_list_test_thread6_waiting = false; +bool is_put_into_temp_list_test_thread8_waiting = false; +bool is_put_into_temp_list_test_thread9_waiting = false; +bool is_put_into_temp_list_test_thread10_waiting = false; + +// function for testing register_replication_area_lock +void lock_function(){ + is_lock_function_called = true; +} + +// function for testing register_replication_area_unlock +void unlock_function(){ + is_unlock_function_called = true; +} + +LOG_LEVEL_TAG replication_getloglevel(){ + return LOG_LV_NONE; +} + +void replication_putLogFatal(const unsigned int id, const std::string& message, const char* file_name, int line_number){ +} + +void replication_putLogError(const unsigned int id, const std::string& message, const char* file_name, int line_number){ +} + +void replication_putLogWarn(const unsigned int id, const std::string& message, const char* file_name, int line_number){ +} + +void replication_putLogInfo(const unsigned int id, const std::string& message, const char* file_name, int line_number){ +} + +void replication_putLogDebug(const unsigned int id, const std::string& message, const char* file_name, int line_number){ +} +l7vs::sslid_replication_data_processor::getloglevel_func_type replication_ingetloglevel = replication_getloglevel; +l7vs::sslid_replication_data_processor::logger_func_type replication_inputLogFatal = replication_putLogFatal; +l7vs::sslid_replication_data_processor::logger_func_type replication_inputLogError = replication_putLogError; +l7vs::sslid_replication_data_processor::logger_func_type replication_inputLogWarn = replication_putLogWarn; +l7vs::sslid_replication_data_processor::logger_func_type replication_inputLogInfo = replication_putLogInfo; +l7vs::sslid_replication_data_processor::logger_func_type replication_inputLogDebug = replication_putLogDebug; + +// test class +class sslid_replication_data_processor_test_class : public l7vs::sslid_replication_data_processor { +public: + boost::mutex check_mutex; + // sslid_replication_data_processor_test_class + sslid_replication_data_processor_test_class(int maxlist, + char* sslid_replication_area_begain, + int sslid_replication_area_size, + const boost::asio::ip::tcp::endpoint& virtual_service_endpoint, + getloglevel_func_type ingetloglevel, + logger_func_type inputLogFatal, + logger_func_type inputLogError, + logger_func_type inputLogWarn, + logger_func_type inputLogInfo, + logger_func_type inputLogDebug ) : + sslid_replication_data_processor(maxlist, + sslid_replication_area_begain, + sslid_replication_area_size, + virtual_service_endpoint, + ingetloglevel, + inputLogFatal, + inputLogError, + inputLogWarn, + inputLogInfo, + inputLogDebug ) { + } + + // put_into_temp_list test thread + void put_into_temp_list_test_thread1(std::string& session, + boost::asio::ip::tcp::endpoint& endpoint, time_t time) { + + l7vs::sslid_replication_temp_data test_data1; + + test_data1.session_id = session; + test_data1.last_time = time; + test_data1.op_code = 'A'; + test_data1.realserver_addr = endpoint; + this->put_into_temp_list(test_data1); + } + + // put_into_temp_list test thread + void put_into_temp_list_test_thread2(std::string& session, + boost::asio::ip::tcp::endpoint& endpoint, time_t time){ + + l7vs::sslid_replication_temp_data test_data1; + + test_data1.session_id = session; + test_data1.last_time = time; + test_data1.op_code = 'U'; + test_data1.realserver_addr = endpoint; + this->put_into_temp_list(test_data1); + } + + // put_into_temp_list test thread + void put_into_temp_list_test_thread3(std::string& session, + boost::asio::ip::tcp::endpoint& endpoint, time_t time){ + + l7vs::sslid_replication_temp_data test_data1; + + test_data1.session_id = session; + test_data1.last_time = time; + test_data1.op_code = 'D'; + test_data1.realserver_addr = endpoint; + this->put_into_temp_list(test_data1); + } + + // put_into_temp_list test thread + void put_into_temp_list_test_thread4(std::string& session, + boost::asio::ip::tcp::endpoint& endpoint, time_t time){ + + l7vs::sslid_replication_temp_data test_data1; + + test_data1.session_id = session; + test_data1.last_time = time; + test_data1.op_code = 'A'; + test_data1.realserver_addr = endpoint; + + this->put_into_temp_list(test_data1); + this->put_into_temp_list(test_data1); + this->put_into_temp_list(test_data1); + this->put_into_temp_list(test_data1); + this->put_into_temp_list(test_data1); + this->put_into_temp_list(test_data1); + is_put_into_temp_list_test_thread4_waiting = true; + } + + // put_into_temp_list test thread + void put_into_temp_list_test_thread5(){ + + l7vs::sslid_replication_temp_data temp_data; + this->get_from_temp_list(temp_data); + } + + // put_into_temp_list test thread + void put_into_temp_list_test_thread6(std::string& session, + boost::asio::ip::tcp::endpoint& endpoint, time_t time){ + + l7vs::sslid_replication_temp_data test_data1; + + test_data1.session_id = session; + test_data1.last_time = time; + test_data1.op_code = 'A'; + test_data1.realserver_addr = endpoint; + + this->put_into_temp_list(test_data1); + this->put_into_temp_list(test_data1); + this->put_into_temp_list(test_data1); + this->put_into_temp_list(test_data1); + this->put_into_temp_list(test_data1); + this->put_into_temp_list(test_data1); + is_put_into_temp_list_test_thread6_waiting = true; + this->put_into_temp_list(test_data1); + this->put_into_temp_list(test_data1); + } + + // put_into_temp_list test thread + void put_into_temp_list_test_thread7(){ + + l7vs::sslid_replication_temp_data temp_data; + + for(int i = 0; i < 4; i++){ + this->get_from_temp_list(temp_data); + } + } + + // put_into_temp_list test thread + void put_into_temp_list_test_thread8(std::string& session, + boost::asio::ip::tcp::endpoint& endpoint, time_t time){ + + l7vs::sslid_replication_temp_data test_data1; + + test_data1.session_id = session; + test_data1.last_time = time; + test_data1.op_code = 'A'; + test_data1.realserver_addr = endpoint; + + this->put_into_temp_list(test_data1); + this->put_into_temp_list(test_data1); + this->put_into_temp_list(test_data1); + this->put_into_temp_list(test_data1); + this->put_into_temp_list(test_data1); + this->put_into_temp_list(test_data1); + is_put_into_temp_list_test_thread8_waiting = true; + this->put_into_temp_list(test_data1); + is_put_into_temp_list_test_thread8_waiting = false; + } + + // put_into_temp_list test thread + void put_into_temp_list_test_thread9(std::string& session, + boost::asio::ip::tcp::endpoint& endpoint, time_t time){ + + l7vs::sslid_replication_temp_data test_data1; + + test_data1.session_id = session; + test_data1.last_time = time; + test_data1.op_code = 'A'; + test_data1.realserver_addr = endpoint; + + is_put_into_temp_list_test_thread9_waiting = true; + this->put_into_temp_list(test_data1); + is_put_into_temp_list_test_thread9_waiting = false; + } + + // put_into_temp_list test thread + void put_into_temp_list_test_thread10(std::string& session, + boost::asio::ip::tcp::endpoint& endpoint, time_t time){ + + l7vs::sslid_replication_temp_data test_data1; + + test_data1.session_id = session; + test_data1.last_time = time; + test_data1.op_code = 'A'; + test_data1.realserver_addr = endpoint; + + is_put_into_temp_list_test_thread10_waiting = true; + this->put_into_temp_list(test_data1); + is_put_into_temp_list_test_thread10_waiting = false; + } + + // get_from_temp_list test thread + void get_from_temp_list_thread1() { + boost::asio::ip::tcp::endpoint endpoint; + l7vs::sslid_replication_temp_data get_data; + this->get_from_temp_list(get_data); + { + boost::mutex::scoped_lock sclock(check_mutex); + BOOST_CHECK_EQUAL(get_data.session_id, "test_id123456789abcdefghijklmnop"); + BOOST_CHECK_EQUAL(get_data.op_code, 'A'); + BOOST_CHECK_EQUAL(get_data.realserver_addr, endpoint); + BOOST_CHECK_EQUAL(get_data.last_time, 1000); + } + } + + // sslid_replication_data_processor + void sslid_replication_data_processor_test(int expecting_maxlist, + l7vs::sslid_replication_data* expecting_replication_area, + boost::asio::ip::tcp::endpoint expecting_virtual_service_endpoint, + char* replication_data_area, int data_area_size, char* header_start_address, + char* real_data_start_address) { + + int maxlist_test = 5; + boost::asio::ip::tcp::endpoint test_virtual_service_endpoint; + test_virtual_service_endpoint.port(999); + l7vs::sslid_replication_data_header* first_header = reinterpret_cast(header_start_address); + + cout << "[1]------------------------------------------" << endl; + // unit_test[1] メンバー変数が初期化されるチェックする。 + BOOST_CHECK_EQUAL(this->maxlist, expecting_maxlist); + BOOST_CHECK_EQUAL(this->max_temp_list, expecting_maxlist * 2); + BOOST_CHECK_EQUAL(this->temp_list.size(), 0u); + BOOST_CHECK_EQUAL(this->replication_area, expecting_replication_area); + BOOST_CHECK_EQUAL(this->virtual_service_endpoint, expecting_virtual_service_endpoint); + BOOST_CHECK_EQUAL(this->getloglevel, replication_getloglevel); + BOOST_CHECK_EQUAL(this->putLogFatal, replication_putLogFatal); + BOOST_CHECK_EQUAL(this->putLogError, replication_putLogError); + BOOST_CHECK_EQUAL(this->putLogWarn, replication_putLogWarn); + BOOST_CHECK_EQUAL(this->putLogInfo, replication_putLogInfo); + BOOST_CHECK_EQUAL(this->putLogDebug, replication_putLogDebug); + + + cout << "[2]------------------------------------------" << endl; + // unit_test[2] replication_data_area が NULLの場合, 例外が発生しない。 + try { + sslid_replication_data_processor test_object1(maxlist_test, + NULL, SECTION_NUMBER, test_virtual_service_endpoint, replication_ingetloglevel, + replication_inputLogFatal, replication_inputLogError, + replication_inputLogWarn, replication_inputLogInfo, + replication_inputLogDebug); + } catch (...) { + BOOST_ERROR("exception: sslid_replication_data_processor"); + } + + cout << "[3]------------------------------------------" << endl; + // unit_test[3] maxlist < 0の場合, 例外が発生する。 + bool exception_occured = false; + try { + sslid_replication_data_processor test_object(-1, + replication_data_area, SECTION_NUMBER, test_virtual_service_endpoint, replication_ingetloglevel, + replication_inputLogFatal, replication_inputLogError, + replication_inputLogWarn, replication_inputLogInfo, + replication_inputLogDebug); + } catch (...) { + exception_occured = true; + } + BOOST_CHECK(exception_occured); + + cout << "[4]------------------------------------------" << endl; + // unit_test[4] maxlist = 0の場合, 例外が発生しない。 + try { + sslid_replication_data_processor test_object(0, + replication_data_area, SECTION_NUMBER, test_virtual_service_endpoint, replication_ingetloglevel, + replication_inputLogFatal, replication_inputLogError, + replication_inputLogWarn, replication_inputLogInfo, + replication_inputLogDebug); + } catch (...) { + BOOST_ERROR("exception: sslid_replication_data_processor"); + } + + cout << "[5]------------------------------------------" << endl; + // unit_test[5] maxlist が 1 の場合, 例外が発生しない。 + try { + sslid_replication_data_processor test_object(1, + replication_data_area, SECTION_NUMBER, test_virtual_service_endpoint, replication_ingetloglevel, + replication_inputLogFatal, replication_inputLogError, + replication_inputLogWarn, replication_inputLogInfo, + replication_inputLogDebug); + } catch (...) { + BOOST_ERROR("exception: sslid_replication_data_processor"); + } + + cout << "[6]------------------------------------------" << endl; + // unit_test[6] sslid_replication_area_size < 0, 例外が発生する。 + exception_occured = false; + try { + memset(replication_data_area, 0, 128*sizeof(l7vs::sslid_replication_data_header)); + for(int i = 0; i < 128; i++){ + l7vs::sslid_replication_data_header* temp= reinterpret_cast(replication_data_area) + i; + temp->size = static_cast(2 * sizeof(l7vs::sslid_replication_data)); + } + l7vs::sslid_replication_data_processor test_object2(2, + replication_data_area, -1, test_virtual_service_endpoint, + replication_ingetloglevel, replication_inputLogFatal, + replication_inputLogError, replication_inputLogWarn, + replication_inputLogInfo, replication_inputLogDebug); + } catch (...) { + exception_occured = true; + } + BOOST_CHECK(exception_occured); + + cout << "[7]------------------------------------------" << endl; + // unit_test[7] sslid_replication_area_sizeが0の場合, 例外が発生しない。 + try { + memset(replication_data_area, 0, 128*sizeof(l7vs::sslid_replication_data_header)); + for(int i = 0; i < 128; i++){ + l7vs::sslid_replication_data_header* temp= reinterpret_cast(replication_data_area) + i; + temp->size = static_cast(2 * sizeof(l7vs::sslid_replication_data)); + } + l7vs::sslid_replication_data_processor test_object2(2, + replication_data_area, 0, test_virtual_service_endpoint, + replication_ingetloglevel, replication_inputLogFatal, + replication_inputLogError, replication_inputLogWarn, + replication_inputLogInfo, replication_inputLogDebug); + } catch (...) { + BOOST_ERROR("exception: sslid_replication_data_processor"); + } + + cout << "[8]------------------------------------------" << endl; + // unit_test[8] virtual service が存在して、且つvirtual serviceのデータエリアが実際サイズより小さい場合、 + // unit_test[8] virtual service対応のreplicationデータヘッダーの情報を再設定する。 + int max_list_size = 3; + std::string virtual_service_ip = "192.168.120.102"; + memset(replication_data_area, 0, data_area_size); + test_virtual_service_endpoint.address(boost::asio::ip::address::from_string(virtual_service_ip)); + test_virtual_service_endpoint.port(80); + memcpy(first_header->virtualserver_ip, virtual_service_ip.c_str(), virtual_service_ip.length()); + first_header->virtualserver_port = 80; + first_header->size = static_cast((max_list_size - 1) * sizeof(l7vs::sslid_replication_data)); + first_header->offset = static_cast(real_data_start_address - header_start_address); + l7vs::sslid_replication_data_processor test_object3( + max_list_size, replication_data_area, + SECTION_NUMBER, test_virtual_service_endpoint, + replication_ingetloglevel, replication_inputLogFatal, + replication_inputLogError, replication_inputLogWarn, + replication_inputLogInfo, replication_inputLogDebug); + // the virtual service's size is resetted, check it + size_t expecting_size = static_cast(max_list_size * sizeof(l7vs::sslid_replication_data)); + size_t expecting_offset = static_cast(real_data_start_address - header_start_address + first_header->size); + sslid_replication_data* expecting_replication_data_area = reinterpret_cast(header_start_address + first_header->offset); + BOOST_CHECK_EQUAL((first_header+1)->size, expecting_size); + BOOST_CHECK_EQUAL((first_header+1)->offset, expecting_offset); + BOOST_CHECK_EQUAL(this->replication_area, expecting_replication_data_area); + + cout << "[9]------------------------------------------" << endl; + // unit_test[9] virtual service が存在して、且つvirtual serviceのデータエリアが実際サイズより小さい、 + // unit_test[9] 且つsslid replicationエリアが足りないの場合、処理を行わない。 + virtual_service_ip = "192.168.120.102"; + memset(replication_data_area, 0, data_area_size); + test_virtual_service_endpoint.address(boost::asio::ip::address::from_string(virtual_service_ip)); + test_virtual_service_endpoint.port(80); + memcpy(first_header->virtualserver_ip, virtual_service_ip.c_str(),virtual_service_ip.length()); + first_header->virtualserver_port = 80; + first_header->size = static_cast ((max_list_size - 1) * sizeof(l7vs::sslid_replication_data)); + first_header->offset = static_cast (real_data_start_address - header_start_address); + unsigned old_port = first_header->virtualserver_port; + std::string old_virtual_service_ip(first_header->virtualserver_ip); + size_t old_size = first_header->size; + size_t old_offset = first_header->offset; + sslid_replication_data_header temp_old_data; + memcpy(&temp_old_data, first_header + 1, sizeof(sslid_replication_data_header)); + l7vs::sslid_replication_data_processor temp_test_object(10000, + replication_data_area, 20, + test_virtual_service_endpoint, replication_ingetloglevel, + replication_inputLogFatal, replication_inputLogError, + replication_inputLogWarn, replication_inputLogInfo, + replication_inputLogDebug); + // first_header not changed check + std::string new_virtual_service_ip(first_header->virtualserver_ip); + BOOST_CHECK_EQUAL(new_virtual_service_ip, old_virtual_service_ip); + BOOST_CHECK_EQUAL(first_header->virtualserver_port, old_port); + BOOST_CHECK_EQUAL(first_header->size, old_size); + BOOST_CHECK_EQUAL(first_header->offset, old_offset); + int compare_result = memcmp(first_header + 1, &temp_old_data, sizeof(sslid_replication_data_header)); + BOOST_CHECK_EQUAL(compare_result, 0); + + cout << "[10]------------------------------------------" << endl; + // unit_test[10] virtual service対応のreplicationデータヘッダーの情報を再設定して、ヘッダーエリアがfullの場合,処理を行わない。 + try { + memset(replication_data_area, 0, 128*sizeof(l7vs::sslid_replication_data_header)); + for(int i = 0; i < 128; i++){ + l7vs::sslid_replication_data_header* temp= reinterpret_cast(replication_data_area) + i; + temp->size = sizeof(l7vs::sslid_replication_data); + } + memcpy(first_header->virtualserver_ip, virtual_service_ip.c_str(), virtual_service_ip.length()); + first_header->virtualserver_port = 80; + first_header->size = static_cast((max_list_size - 1) * sizeof(l7vs::sslid_replication_data)); + first_header->offset = static_cast(real_data_start_address - header_start_address); + l7vs::sslid_replication_data_processor test_object4( + max_list_size, replication_data_area, + SECTION_NUMBER, test_virtual_service_endpoint, + replication_ingetloglevel, replication_inputLogFatal, + replication_inputLogError, replication_inputLogWarn, + replication_inputLogInfo, replication_inputLogDebug); + } catch (...) { + BOOST_ERROR("exception: sslid_replication_data_processor"); + } + + cout << "[11]------------------------------------------" << endl; + // unit_test[11] virtual service対応のreplicationデータヘッダーの情報を再設定する時, ヘッダーエリアがfullでない場合 + // unit_test[11] replicationデータヘッダーの情報を変更する。 + memset(replication_data_area, 0, data_area_size); + memcpy(first_header->virtualserver_ip, virtual_service_ip.c_str(), virtual_service_ip.length()); + first_header->virtualserver_port = 80; + first_header->size = static_cast((max_list_size - 1) * sizeof(l7vs::sslid_replication_data)); + first_header->offset = static_cast(real_data_start_address - header_start_address); + l7vs::sslid_replication_data_processor test_object5( + max_list_size, replication_data_area, + SECTION_NUMBER, test_virtual_service_endpoint, + replication_ingetloglevel, replication_inputLogFatal, + replication_inputLogError, replication_inputLogWarn, + replication_inputLogInfo, replication_inputLogDebug); + // the virtual service information's size is resized, get it + expecting_size = static_cast(max_list_size * sizeof(l7vs::sslid_replication_data)); + // the virtual service information's offset is resized, get it + expecting_offset = static_cast(real_data_start_address - header_start_address + first_header->size); + expecting_replication_data_area = reinterpret_cast(header_start_address + first_header->offset); + // size check + BOOST_CHECK_EQUAL((first_header+1)->size, expecting_size); + // offset check + BOOST_CHECK_EQUAL((first_header+1)->offset, expecting_offset); + BOOST_CHECK_EQUAL(this->replication_area, expecting_replication_data_area); + + cout << "[12]------------------------------------------" << endl; + // unit_test[12] virtual service対応のreplicationデータヘッダーが存在しなくて、且つヘッダーエリアがfullでなく、且つ + // unit_test[12] replicationデータエリアの領域が足りない場合、処理を行わない。 + try { + memset(replication_data_area, 0, 128*sizeof(l7vs::sslid_replication_data_header)); + std::string temp_virtual_service_ip = "255.255.255.255"; + test_virtual_service_endpoint.address(boost::asio::ip::address::from_string("192.168.120.102")); + test_virtual_service_endpoint.port(90); + for(int i = 0; i < 127; i++){ + l7vs::sslid_replication_data_header* temp= reinterpret_cast(replication_data_area) + i; + temp->size = 0; + temp->virtualserver_port = 80; + memcpy(temp->virtualserver_ip, temp_virtual_service_ip.c_str(), temp_virtual_service_ip.length()); + } + sslid_replication_data_header old_data; + memcpy(&old_data, reinterpret_cast(replication_data_area) + 127, sizeof(sslid_replication_data_header)); + l7vs::sslid_replication_data_processor test_object6( + 10000, replication_data_area, + 20, test_virtual_service_endpoint, + replication_ingetloglevel, replication_inputLogFatal, + replication_inputLogError, replication_inputLogWarn, + replication_inputLogInfo, replication_inputLogDebug); + compare_result = memcmp(reinterpret_cast(replication_data_area) + 127, &old_data, sizeof(sslid_replication_data_header)); + BOOST_CHECK_EQUAL(compare_result, 0); + } catch (...) { + BOOST_ERROR("exception: sslid_replication_data_processor"); + } + + cout << "[13]------------------------------------------" << endl; + // unit_test[13] virtual service対応のreplicationデータヘッダーが存在して、且つreplicationデータエリアの領域が足りる場合、 + // unit_test[13] ヘッダーエリアに、virtual serviceを追加する。 + memset(replication_data_area, 0, 128*sizeof(l7vs::sslid_replication_data_header)); + test_virtual_service_endpoint.address(boost::asio::ip::address::from_string(virtual_service_ip)); + test_virtual_service_endpoint.port(80); + memcpy(first_header->virtualserver_ip, virtual_service_ip.c_str(), virtual_service_ip.length()); + first_header->virtualserver_port = 80; + first_header->offset = static_cast(real_data_start_address - header_start_address); + first_header->size = (max_list_size + 1) * sizeof(sslid_replication_data); + l7vs::sslid_replication_data_processor test_object7( + max_list_size, replication_data_area, + SECTION_NUMBER, test_virtual_service_endpoint, + replication_ingetloglevel, replication_inputLogFatal, + replication_inputLogError, replication_inputLogWarn, + replication_inputLogInfo, replication_inputLogDebug); + expecting_size = static_cast(max_list_size * sizeof(l7vs::sslid_replication_data)); + expecting_offset = static_cast(real_data_start_address - header_start_address); + expecting_replication_data_area = reinterpret_cast(real_data_start_address); + // session information's size check + BOOST_CHECK_EQUAL(first_header->size, expecting_size); + // session information's offset check + BOOST_CHECK_EQUAL(first_header->offset, expecting_offset); + // replication_area check + BOOST_CHECK_EQUAL(replication_area, expecting_replication_data_area); + + cout << "[14]------------------------------------------" << endl; + // unit_test[14] virtual serviceが存在しなくて、且つヘッダーエリアがfullの場合,処理を行わない。 + try { + memset(replication_data_area, 0, 128*sizeof(l7vs::sslid_replication_data_header)); + std::string temp_virtual_service_ip = "255.255.255.255"; + for(int i = 0; i < 128; i++){ + l7vs::sslid_replication_data_header* temp= reinterpret_cast(replication_data_area) + i; + temp->size = static_cast(max_list_size * sizeof(l7vs::sslid_replication_data)); + memcpy(temp->virtualserver_ip, temp_virtual_service_ip.c_str(), temp_virtual_service_ip.length()); + } + l7vs::sslid_replication_data_processor test_object8( + max_list_size, replication_data_area, + SECTION_NUMBER, test_virtual_service_endpoint, + replication_ingetloglevel, replication_inputLogFatal, + replication_inputLogError, replication_inputLogWarn, + replication_inputLogInfo, replication_inputLogDebug); + } catch (...) { + BOOST_ERROR("exception: sslid_replication_data_processor"); + } + + cout << "[15]------------------------------------------" << endl; + // unit_test[15] virtual serviceのipがipv6で、virtual serviceが存在して、且つ + // unit_test[15] virtual service対応のデータ領域が足りない場合、virtual service対応のreplicationデータヘッダーの情報を再設定する。 + virtual_service_ip = "abcd:21d0:8936:4866:eefe:567d:3a4b:1230"; + memset(replication_data_area, 0, data_area_size); + test_virtual_service_endpoint.address(boost::asio::ip::address::from_string(virtual_service_ip)); + test_virtual_service_endpoint.port(80); + memcpy(first_header->virtualserver_ip, virtual_service_ip.c_str(), virtual_service_ip.length()); + first_header->virtualserver_port = 80; + first_header->size = static_cast((max_list_size - 1) * sizeof(l7vs::sslid_replication_data)); + first_header->offset = static_cast(real_data_start_address - header_start_address); + l7vs::sslid_replication_data_processor test_object9( + max_list_size, replication_data_area, + SECTION_NUMBER, test_virtual_service_endpoint, + replication_ingetloglevel, replication_inputLogFatal, + replication_inputLogError, replication_inputLogWarn, + replication_inputLogInfo, replication_inputLogDebug); + // the virtual service's size is resetted, check it + expecting_size = static_cast(max_list_size * sizeof(l7vs::sslid_replication_data)); + expecting_offset = static_cast(real_data_start_address - header_start_address + first_header->size); + expecting_replication_data_area = reinterpret_cast(real_data_start_address); + BOOST_CHECK_EQUAL((first_header+1)->size, expecting_size); + BOOST_CHECK_EQUAL((first_header+1)->offset, expecting_offset); + BOOST_CHECK_EQUAL(this->replication_area, expecting_replication_data_area); + } + + // put_into_temp_list_test + void put_into_temp_list_test(){ + + time_t last_time = time(0); + boost::asio::ip::tcp::endpoint endpoint; + std::string session_id1 = "test_id123456789abcdefghijklmnop"; + std::string session_id2 = "test_id2abcdefghijklmnop23456789"; + std::string session_id3 = "test_id3333333333333333333333333"; + l7vs::sslid_replication_temp_data test_data1; + l7vs::sslid_replication_temp_data test_data2; + l7vs::sslid_replication_temp_data test_data3; + + cout << "[16]------------------------------------------" << endl; + // unit_test[16] 1つのアイテムの場合、temp_listにデータを追加する。 + test_data1.session_id = session_id1; + test_data1.last_time = last_time; + test_data1.op_code = 'A'; + test_data1.realserver_addr = endpoint; + this->temp_list.clear(); + this->put_into_temp_list(test_data1); + l7vs::sslid_replication_temp_data& put_into_data = this->temp_list.back(); + // the item which put into the temp_list check + // session_id check + BOOST_CHECK_EQUAL(put_into_data.session_id, test_data1.session_id); + // last_time check + BOOST_CHECK_EQUAL(put_into_data.last_time, test_data1.last_time); + // op_code check + BOOST_CHECK_EQUAL(put_into_data.op_code, 'A'); + // realserver_addr check + BOOST_CHECK_EQUAL(put_into_data.realserver_addr, test_data1.realserver_addr); + + cout << "[17]------------------------------------------" << endl; + // unit_test[17] 2つのアイテムの場合、temp_listにデータを追加する。 + test_data1.session_id = session_id1; + test_data1.last_time = last_time; + test_data1.op_code = 'U'; + test_data1.realserver_addr = endpoint; + test_data2.session_id = session_id2; + test_data2.last_time = last_time; + test_data2.op_code = 'D'; + test_data2.realserver_addr = endpoint; + this->temp_list.clear(); + this->put_into_temp_list(test_data1); + this->put_into_temp_list(test_data2); + l7vs::sslid_replication_temp_data& first_put_into_data = this->temp_list.front(); + l7vs::sslid_replication_temp_data& second_put_into_data = this->temp_list.back(); + // the items which put into the temp_list check + // session_id check + BOOST_CHECK_EQUAL(first_put_into_data.session_id, test_data1.session_id); + BOOST_CHECK_EQUAL(second_put_into_data.session_id, test_data2.session_id); + // last_time check + BOOST_CHECK_EQUAL(first_put_into_data.last_time, test_data1.last_time); + BOOST_CHECK_EQUAL(second_put_into_data.last_time, test_data2.last_time); + // op_code check + BOOST_CHECK_EQUAL(first_put_into_data.op_code, 'U'); + BOOST_CHECK_EQUAL(second_put_into_data.op_code, 'D'); + // realserver_addr check + BOOST_CHECK_EQUAL(first_put_into_data.realserver_addr, test_data1.realserver_addr); + BOOST_CHECK_EQUAL(second_put_into_data.realserver_addr, test_data2.realserver_addr); + + cout << "[18]------------------------------------------" << endl; + // unit_test[18] 3つのアイテムの場合、temp_listにデータを追加する。 + test_data1.session_id = session_id1; + test_data1.last_time = last_time; + test_data1.op_code = 'U'; + test_data1.realserver_addr = endpoint; + test_data2.session_id = session_id2; + test_data2.last_time = last_time; + test_data2.op_code = 'D'; + test_data2.realserver_addr = endpoint; + test_data3.session_id = session_id3; + test_data3.last_time = last_time; + test_data3.op_code = 'T'; + test_data3.realserver_addr = endpoint; + this->temp_list.clear(); + this->put_into_temp_list(test_data1); + this->put_into_temp_list(test_data2); + this->put_into_temp_list(test_data3); + first_put_into_data = this->temp_list[0]; + second_put_into_data = this->temp_list[1]; + l7vs::sslid_replication_temp_data& third_put_into_data = this->temp_list[2]; + // the items which put into the temp_list check + // session_id check + BOOST_CHECK_EQUAL(first_put_into_data.session_id, test_data1.session_id); + BOOST_CHECK_EQUAL(second_put_into_data.session_id, test_data2.session_id); + BOOST_CHECK_EQUAL(third_put_into_data.session_id, test_data3.session_id); + // last_time check + BOOST_CHECK_EQUAL(first_put_into_data.last_time, test_data1.last_time); + BOOST_CHECK_EQUAL(second_put_into_data.last_time, test_data2.last_time); + BOOST_CHECK_EQUAL(third_put_into_data.last_time, test_data3.last_time); + // op_code check + BOOST_CHECK_EQUAL(first_put_into_data.op_code, 'U'); + BOOST_CHECK_EQUAL(second_put_into_data.op_code, 'D'); + BOOST_CHECK_EQUAL(third_put_into_data.op_code, 'T'); + // realserver_addr check + BOOST_CHECK_EQUAL(first_put_into_data.realserver_addr, test_data1.realserver_addr); + BOOST_CHECK_EQUAL(second_put_into_data.realserver_addr, test_data2.realserver_addr); + BOOST_CHECK_EQUAL(third_put_into_data.realserver_addr, test_data3.realserver_addr); + + cout << "[19]------------------------------------------" << endl; + // unit_test[19] マルチスレッドの場合、temp_listにデータを正常追加する。 + try{ + boost::thread_group thread_group; + this->temp_list.clear(); + thread_group.create_thread(boost::bind( + &sslid_replication_data_processor_test_class::put_into_temp_list_test_thread1, + this, session_id1, endpoint, last_time)); + thread_group.create_thread(boost::bind( + &sslid_replication_data_processor_test_class::put_into_temp_list_test_thread2, + this, session_id2, endpoint, last_time)); + thread_group.create_thread(boost::bind( + &sslid_replication_data_processor_test_class::put_into_temp_list_test_thread3, + this, session_id3, endpoint, last_time)); + thread_group.join_all(); + } catch(...){ + BOOST_ERROR("exception: put_into_temp_list"); + } + BOOST_CHECK_EQUAL(this->temp_list.size(), 3u); + // temp_list item check + int count = static_cast(this->temp_list.size()); + for(int i = 0; i < count; i++){ + sslid_replication_temp_data& temp = this->temp_list[i]; + if(temp.op_code == 'A'){ + BOOST_CHECK_EQUAL(temp.session_id, session_id1); + BOOST_CHECK_EQUAL(temp.realserver_addr, endpoint); + BOOST_CHECK_EQUAL(temp.last_time, last_time); + } else if(temp.op_code == 'U'){ + BOOST_CHECK_EQUAL(temp.session_id, session_id2); + BOOST_CHECK_EQUAL(temp.realserver_addr, endpoint); + BOOST_CHECK_EQUAL(temp.last_time, last_time); + } else if(temp.op_code == 'D'){ + BOOST_CHECK_EQUAL(temp.session_id, session_id3); + BOOST_CHECK_EQUAL(temp.realserver_addr, endpoint); + BOOST_CHECK_EQUAL(temp.last_time, last_time); + } else { + BOOST_ERROR("error: put_into_temp_list"); + } + } + + cout << "[20]------------------------------------------" << endl; + // unit_test[20] マルチスレッド がつ temp_listのサイズが max_temp_listの場合、temp_listにデータを正常追加する。 + try{ + boost::thread_group thread_group; + is_put_into_temp_list_test_thread4_waiting = false; + this->temp_list.clear(); + thread_group.create_thread(boost::bind( + &sslid_replication_data_processor_test_class::put_into_temp_list_test_thread4, + this, session_id1, endpoint, last_time)); + while(!is_put_into_temp_list_test_thread4_waiting){ + } + thread_group.create_thread(boost::bind(&sslid_replication_data_processor_test_class::put_into_temp_list_test_thread5, this)); + thread_group.join_all(); + } catch(...){ + BOOST_ERROR("exception: put_into_temp_list"); + } + BOOST_CHECK_EQUAL(this->temp_list.size(), 5u); + // temp_list item check + count = static_cast(this->temp_list.size()); + for(int i = 0; i < count; i++){ + sslid_replication_temp_data& temp = this->temp_list[i]; + BOOST_CHECK_EQUAL(temp.session_id, session_id1); + BOOST_CHECK_EQUAL(temp.realserver_addr, endpoint); + BOOST_CHECK_EQUAL(temp.last_time, last_time); + BOOST_CHECK_EQUAL(temp.op_code, 'A'); + } + + cout << "[21]------------------------------------------" << endl; + // unit_test[21] ルチスレッド がつ temp_list size > max_temp_listの場合、temp_listにデータを正常追加する。 + try{ + boost::thread_group thread_group; + is_put_into_temp_list_test_thread6_waiting = false; + this->temp_list.clear(); + thread_group.create_thread(boost::bind( + &sslid_replication_data_processor_test_class::put_into_temp_list_test_thread6, + this, session_id1, endpoint, last_time)); + while(!is_put_into_temp_list_test_thread6_waiting){ + } + thread_group.create_thread(boost::bind(&sslid_replication_data_processor_test_class::put_into_temp_list_test_thread7, this)); + thread_group.join_all(); + } catch(...){ + BOOST_ERROR("exception: put_into_temp_list"); + } + BOOST_CHECK_EQUAL(this->temp_list.size(), 4u); + // temp_list item check + count = static_cast(this->temp_list.size()); + for(int i = 0; i < count; i++){ + sslid_replication_temp_data& temp = this->temp_list[i]; + BOOST_CHECK_EQUAL(temp.session_id, session_id1); + BOOST_CHECK_EQUAL(temp.realserver_addr, endpoint); + BOOST_CHECK_EQUAL(temp.last_time, last_time); + BOOST_CHECK_EQUAL(temp.op_code, 'A'); + } + + cout << "[22]------------------------------------------" << endl; + // unit_test[22] temp_listがfullで、且1つのスレッドが待ち状態の場合、waitingフラグを待ちに設定する。 + try{ + boost::thread_group thread_group; + + is_put_into_temp_list_test_thread8_waiting = false; + this->temp_list.clear(); + + thread_group.create_thread(boost::bind( + &sslid_replication_data_processor_test_class::put_into_temp_list_test_thread8, + this, session_id1, endpoint, last_time)); + + while(!is_put_into_temp_list_test_thread8_waiting){ + } + // put_into_temp_list_test_thread8 is waiting check + BOOST_CHECK_EQUAL(is_put_into_temp_list_test_thread8_waiting, true); + + thread_group.create_thread(boost::bind(&sslid_replication_data_processor_test_class::put_into_temp_list_test_thread7, this)); + thread_group.join_all(); + } catch(...){ + BOOST_ERROR("exception: put_into_temp_list"); + } + + cout << "[23]------------------------------------------" << endl; + // unit_test[23] temp_listがfullで、且2つのスレッドが待ち状態の場合、waitingフラグを待ちに設定する。 + try{ + boost::thread_group thread_group; + + is_put_into_temp_list_test_thread8_waiting = false; + is_put_into_temp_list_test_thread9_waiting = false; + this->temp_list.clear(); + + thread_group.create_thread(boost::bind( + &sslid_replication_data_processor_test_class::put_into_temp_list_test_thread8, + this, session_id1, endpoint, last_time)); + + while(!is_put_into_temp_list_test_thread8_waiting){ + } + thread_group.create_thread(boost::bind( + &sslid_replication_data_processor_test_class::put_into_temp_list_test_thread9, + this, session_id1, endpoint, last_time)); + + while(!is_put_into_temp_list_test_thread9_waiting){ + } + + // put_into_temp_list_test_thread8 is waiting check + BOOST_CHECK_EQUAL(is_put_into_temp_list_test_thread8_waiting, true); + // put_into_temp_list_test_thread9 is waiting check + BOOST_CHECK_EQUAL(is_put_into_temp_list_test_thread9_waiting, true); + + thread_group.create_thread(boost::bind(&sslid_replication_data_processor_test_class::put_into_temp_list_test_thread7, this)); + thread_group.join_all(); + } catch(...){ + BOOST_ERROR("exception: put_into_temp_list"); + } + + cout << "[24]------------------------------------------" << endl; + // unit_test[24] temp_listがfullで、且3つのスレッドが待ち状態の場合、waitingフラグを待ちに設定する。 + try{ + boost::thread_group thread_group; + + is_put_into_temp_list_test_thread8_waiting = false; + is_put_into_temp_list_test_thread9_waiting = false; + is_put_into_temp_list_test_thread10_waiting = false; + this->temp_list.clear(); + + thread_group.create_thread(boost::bind( + &sslid_replication_data_processor_test_class::put_into_temp_list_test_thread8, + this, session_id1, endpoint, last_time)); + while(!is_put_into_temp_list_test_thread8_waiting){ + } + thread_group.create_thread(boost::bind( + &sslid_replication_data_processor_test_class::put_into_temp_list_test_thread9, + this, session_id1, endpoint, last_time)); + thread_group.create_thread(boost::bind( + &sslid_replication_data_processor_test_class::put_into_temp_list_test_thread10, + this, session_id1, endpoint, last_time)); + while(!is_put_into_temp_list_test_thread9_waiting){ + } + while(!is_put_into_temp_list_test_thread10_waiting){ + } + + // put_into_temp_list_test_thread8 is waiting check + BOOST_CHECK_EQUAL(is_put_into_temp_list_test_thread8_waiting, true); + // put_into_temp_list_test_thread9 is waiting check + BOOST_CHECK_EQUAL(is_put_into_temp_list_test_thread9_waiting, true); + // put_into_temp_list_test_thread10 is waiting check + BOOST_CHECK_EQUAL(is_put_into_temp_list_test_thread10_waiting, true); + + thread_group.create_thread(boost::bind(&sslid_replication_data_processor_test_class::put_into_temp_list_test_thread7, this)); + thread_group.join_all(); + } catch(...){ + BOOST_ERROR("exception: put_into_temp_list"); + } + } + + // write_replicaion_area_test + void write_replicaion_area_test(){ + + unsigned short port = 999; + time_t last_time = time(0); + time_t update_time = last_time - 10; + time_t delete_time = last_time - 10; + std::string temp_session_id; + boost::asio::ip::tcp::endpoint realserver_addr; + boost::function function_pointer; + l7vs::sslid_replication_data temp_data; + l7vs::sslid_replication_temp_data test_data1; + + this->replication_area_lock = lock_function; + this->replication_area_unlock = unlock_function; + + cout << "[25]------------------------------------------" << endl; + // unit_test[25] maxlistが0の場合、例外が発生しない。 + int old_maxlist = this->maxlist; + try { + this->maxlist = 0; + this->write_replicaion_area(); + } catch(...) { + BOOST_ERROR("exception: write_replicaion_area"); + } + + cout << "[26]------------------------------------------" << endl; + // unit_test[26] maxlist < 0の場合、例外が発生しない。 + try { + this->maxlist = -1; + this->write_replicaion_area(); + } catch (...) { + BOOST_ERROR("exception: write_replicaion_area"); + } + this->maxlist = old_maxlist; + + + cout << "[27]------------------------------------------" << endl; + // unit_test[27] replication_area が NULLの場合、例外が発生しない。 + sslid_replication_data* old_replication_area = this->replication_area; + try { + this->temp_list.clear(); + this->replication_area = NULL; + this->write_replicaion_area(); + } catch (...) { + BOOST_ERROR("exception: write_replicaion_area"); + } + this->replication_area = old_replication_area; + + cout << "[28]------------------------------------------" << endl; + // unit_test[28] temp_listが空の場合、例外が発生しない。 + try { + this->temp_list.clear(); + this->write_replicaion_area(); + } catch (...) { + BOOST_ERROR("exception: write_replicaion_area"); + } + + cout << "[29]------------------------------------------" << endl; + // unit_test[29] op_codeが「A」で、且つreplication_areaに1つのデータが存在する場合、新データを追加する。 + temp_session_id = "temp_id1rtrrrrtttttteeeeeeemmmmp"; + memset(this->replication_area, 0, this->maxlist*sizeof(struct l7vs::sslid_replication_data)); + temp_data.last_time = time(0); + memcpy(temp_data.session_id, temp_session_id.c_str(), temp_session_id.length()); + temp_data.valid = 1; + memcpy(this->replication_area, &temp_data, sizeof(struct l7vs::sslid_replication_data)); + // set the added data + realserver_addr.address(boost::asio::ip::address::from_string("192.168.120.102")); + realserver_addr.port(80); + test_data1.session_id = "test_id123456789abcdefghijklmnop"; + test_data1.last_time = last_time; + test_data1.op_code = 'A'; + test_data1.realserver_addr = realserver_addr; + this->temp_list.clear(); + this->put_into_temp_list(test_data1); + // get the existing data + l7vs::sslid_replication_data old_data; + memset(&old_data, 0, sizeof(sslid_replication_data)); + memcpy(&old_data, this->replication_area, sizeof(sslid_replication_data)); + this->write_replicaion_area(); + // data add position: after the old existing data, check it + // get the added data information + char session_id_array[SSLID_LENGTH + 1] = { 0 }; + memcpy(session_id_array, (this->replication_area + 1)->session_id, SSLID_LENGTH); + session_id_array[SSLID_LENGTH] = 0; + std::string added_session_id(session_id_array); + std::string added_address_ip((this->replication_area + 1)->realserver_ip); + unsigned short added_address_port = (this->replication_area + 1)->realserver_port; + // the old existing data does not changed, check it + int compare_result = memcmp(&old_data, this->replication_area, sizeof(sslid_replication_data)); + BOOST_CHECK_EQUAL(compare_result, 0); + // added session_id check + BOOST_CHECK_EQUAL(added_session_id, test_data1.session_id); + // added last_time check + BOOST_CHECK_EQUAL((this->replication_area + 1)->last_time, test_data1.last_time); + // added valid flag check + BOOST_CHECK_EQUAL((this->replication_area + 1)->valid, 1); + // added realserver_addr ip check + BOOST_CHECK_EQUAL(added_address_ip, test_data1.realserver_addr.address().to_string()); + // added realserver_addr port check + BOOST_CHECK_EQUAL(added_address_port, test_data1.realserver_addr.port()); + + cout << "[30]------------------------------------------" << endl; + // unit_test[30] op_codeが「A」で、且つreplication_areaに2つのデータが存在して、且つ1つ目データのvalidフラグが0の場合、新のデータを追加する。 + memset(this->replication_area, 0, this->maxlist*sizeof(struct l7vs::sslid_replication_data)); + temp_session_id = "temp_id2eeeeeetttteeeeeeemmmmuui"; + temp_data.last_time = time(0); + memcpy(temp_data.session_id, temp_session_id.c_str(), temp_session_id.length()); + temp_data.valid = 0; + memcpy(this->replication_area, &temp_data, sizeof(struct l7vs::sslid_replication_data)); + temp_session_id = "temp_id3333333333333333333333333"; + temp_data.last_time = time(0); + memcpy(temp_data.session_id, temp_session_id.c_str(), temp_session_id.length()); + temp_data.valid = 1; + memcpy(this->replication_area + 1, &temp_data, sizeof(struct l7vs::sslid_replication_data)); + // set the added data + realserver_addr.address(boost::asio::ip::address::from_string("192.168.120.102")); + realserver_addr.port(80); + test_data1.session_id = "test_id123456789abcdefghijklmnop"; + test_data1.last_time = last_time; + test_data1.op_code = 'A'; + test_data1.realserver_addr = realserver_addr; + this->temp_list.clear(); + this->put_into_temp_list(test_data1); + // get the second existing data + memset(&old_data, 0, sizeof(sslid_replication_data)); + memcpy(&old_data, this->replication_area + 1, sizeof(sslid_replication_data)); + this->write_replicaion_area(); + // data add position: the first existing data position, check it + // get the added data information + memset(session_id_array, 0, SSLID_LENGTH + 1); + memcpy(session_id_array, this->replication_area->session_id, SSLID_LENGTH); + added_session_id = std::string(session_id_array); + added_address_ip = std::string(this->replication_area->realserver_ip); + added_address_port = this->replication_area->realserver_port; + // the second existing data not changed, check it + compare_result = memcmp(&old_data, this->replication_area + 1, sizeof(sslid_replication_data)); + BOOST_CHECK_EQUAL(compare_result, 0); + // added session_id check + BOOST_CHECK_EQUAL(added_session_id, test_data1.session_id); + // added last_time check + BOOST_CHECK_EQUAL((this->replication_area)->last_time, test_data1.last_time); + // added valid flag check + BOOST_CHECK_EQUAL((this->replication_area)->valid, 1); + // added realserver_addr ip check + BOOST_CHECK_EQUAL(added_address_ip, test_data1.realserver_addr.address().to_string()); + // added realserver_addr port check + BOOST_CHECK_EQUAL(added_address_port, test_data1.realserver_addr.port()); + + cout << "[31]------------------------------------------" << endl; + // unit_test[31] op_codeが「A」で、且つreplication_areaにデータが存在しない場合、新のデータを追加する。 + memset(this->replication_area, 0, this->maxlist*sizeof(struct l7vs::sslid_replication_data)); + realserver_addr.address(boost::asio::ip::address::from_string("192.168.120.102")); + realserver_addr.port(80); + test_data1.session_id = "test_id123456789abcdefghijklmnop"; + test_data1.last_time = last_time; + test_data1.op_code = 'A'; + test_data1.realserver_addr = realserver_addr; + this->temp_list.clear(); + this->put_into_temp_list(test_data1); + this->write_replicaion_area(); + // get added data information + memset(session_id_array, 0, SSLID_LENGTH + 1); + memcpy(session_id_array, this->replication_area->session_id, SSLID_LENGTH); + std::string saved_session_id(session_id_array); + std::string saved_address_ip(this->replication_area->realserver_ip); + unsigned short saved_address_port = this->replication_area->realserver_port; + // session_id is saved, check it + BOOST_CHECK_EQUAL(saved_session_id, std::string("test_id123456789abcdefghijklmnop")); + // last_time is saved, check it + BOOST_CHECK_EQUAL(this->replication_area->last_time, test_data1.last_time); + // valid flag check + BOOST_CHECK_EQUAL(this->replication_area->valid, 1); + // realserver_addr ip check + BOOST_CHECK_EQUAL(saved_address_ip, std::string("192.168.120.102")); + // realserver_addr port check + BOOST_CHECK_EQUAL(saved_address_port, 80); + + cout << "[32]------------------------------------------" << endl; + // unit_test[32] op_codeが「U」で、且つセッションIDが存在している場合、該当データを更新する。 + realserver_addr.address(boost::asio::ip::address::from_string("255.255.255.255")); + realserver_addr.port(port); + test_data1.op_code = 'U'; + test_data1.last_time = update_time; + test_data1.realserver_addr = realserver_addr; + this->temp_list.clear(); + this->put_into_temp_list(test_data1); + this->write_replicaion_area(); + // get saved information + memset(session_id_array, 0, SSLID_LENGTH + 1); + memcpy(session_id_array, this->replication_area->session_id, SSLID_LENGTH); + saved_session_id = std::string(session_id_array); + saved_address_ip = std::string(this->replication_area->realserver_ip); + saved_address_port = this->replication_area->realserver_port; + // session_id is not changed, check it + BOOST_CHECK_EQUAL(saved_session_id, std::string("test_id123456789abcdefghijklmnop")); + // last_time is updated , check it + BOOST_CHECK_EQUAL(this->replication_area->last_time, update_time); + // valid flag is not changed ,check it + BOOST_CHECK_EQUAL(this->replication_area->valid, 1); + // realserver_addr ip is changed, check it + BOOST_CHECK_EQUAL(saved_address_ip, std::string("255.255.255.255")); + // realserver_addr port is changed, check it + BOOST_CHECK_EQUAL(saved_address_port, port); + + cout << "[33]------------------------------------------" << endl; + // unit_test[33] op_codeが「D」で、且つセッションIDが存在している場合、該当データを削除する。 + realserver_addr.address(boost::asio::ip::address::from_string("192.168.120.102")); + realserver_addr.port(80); + test_data1.op_code = 'D'; + test_data1.realserver_addr = realserver_addr; + test_data1.last_time = delete_time; + this->temp_list.clear(); + this->put_into_temp_list(test_data1); + this->write_replicaion_area(); + // get saved information + memset(session_id_array, 0, SSLID_LENGTH + 1); + memcpy(session_id_array, this->replication_area->session_id, SSLID_LENGTH); + saved_session_id = std::string(session_id_array); + saved_address_ip = std::string(this->replication_area->realserver_ip); + saved_address_port = this->replication_area->realserver_port; + // sslid_replication_data is deleted logically, valid flag is setted to 0, check it + BOOST_CHECK_EQUAL(this->replication_area->valid, 0); + // last_time is not updated , check it + BOOST_CHECK_EQUAL(this->replication_area->last_time, update_time); + // realserver_addr ip is not changed, check it + BOOST_CHECK_EQUAL(saved_address_ip, std::string("255.255.255.255")); + // realserver_addr port is not changed, check it + BOOST_CHECK_EQUAL(saved_address_port, port); + + cout << "[34]------------------------------------------" << endl; + // unit_test[34] op_codeが「A」,「U」,「D」以外の場合、データを変更しない。 + memset(this->replication_area, 0, this->maxlist*sizeof(struct l7vs::sslid_replication_data)); + realserver_addr.address(boost::asio::ip::address::from_string("192.168.120.102")); + realserver_addr.port(port); + test_data1.session_id = "test_id123456789abcdefghijklmnop"; + test_data1.op_code = 'T'; + test_data1.last_time = last_time; + test_data1.realserver_addr = realserver_addr; + this->temp_list.clear(); + this->put_into_temp_list(test_data1); + // get old session data + l7vs::sslid_replication_data old_session_data[3]; + memcpy(&old_session_data, this->replication_area, 3*sizeof(sslid_replication_data)); + this->write_replicaion_area(); + // test_data1 is not saved, so old data is not changed, check it + // old data not changed check + compare_result = memcmp(&old_session_data, this->replication_area, 3*sizeof(sslid_replication_data)); + BOOST_CHECK_EQUAL(compare_result, 0); + + cout << "[35]------------------------------------------" << endl; + // unit_test[35] データを追加するの場合、replication_area_lock関数を呼び出す。 + memset(this->replication_area, 0, this->maxlist*sizeof(struct l7vs::sslid_replication_data)); + test_data1.op_code = 'A'; + this->temp_list.clear(); + this->put_into_temp_list(test_data1); + this->replication_area_lock = lock_function; + this->replication_area_unlock = unlock_function; + this->temp_list.clear(); + this->put_into_temp_list(test_data1); + this->write_replicaion_area(); + // replication_area_lock function called check + BOOST_CHECK(is_lock_function_called); + + cout << "[36]------------------------------------------" << endl; + // unit_test[36] データを追加するの場合、replication_area_unlock関数を呼び出す。 + memset(this->replication_area, 0, this->maxlist*sizeof(struct l7vs::sslid_replication_data)); + test_data1.op_code = 'A'; + this->temp_list.clear(); + this->put_into_temp_list(test_data1); + this->replication_area_lock = lock_function; + this->replication_area_unlock = unlock_function; + this->temp_list.clear(); + this->put_into_temp_list(test_data1); + this->write_replicaion_area(); + // replication_area_unlock function called check + BOOST_CHECK(is_unlock_function_called); + + cout << "[37]------------------------------------------" << endl; + // unit_test[37] endpointがipv6で、replicationエリアにデータがなくて、該当ipv6のendpointを追加する。 + memset(this->replication_area, 0, this->maxlist*sizeof(struct l7vs::sslid_replication_data)); + realserver_addr.address(boost::asio::ip::address::from_string("abcd:21d0:8936:4866:eefe:567d:3a4b:1230")); + realserver_addr.port(80); + test_data1.session_id = "test_id123456789abcdefghijklmnop"; + test_data1.last_time = last_time; + test_data1.op_code = 'A'; + test_data1.realserver_addr = realserver_addr; + this->temp_list.clear(); + this->put_into_temp_list(test_data1); + this->write_replicaion_area(); + memset(session_id_array, 0, SSLID_LENGTH + 1); + memcpy(session_id_array, this->replication_area->session_id, SSLID_LENGTH); + saved_session_id = std::string(session_id_array); + saved_address_ip = std::string(this->replication_area->realserver_ip); + saved_address_port = this->replication_area->realserver_port; + // session_id is saved, check it + BOOST_CHECK_EQUAL(saved_session_id, std::string("test_id123456789abcdefghijklmnop")); + // last_time is saved, check it + BOOST_CHECK_EQUAL(this->replication_area->last_time, test_data1.last_time); + // valid flag check + BOOST_CHECK_EQUAL(this->replication_area->valid, 1); + // realserver_addr ip check + BOOST_CHECK_EQUAL(saved_address_ip, std::string("abcd:21d0:8936:4866:eefe:567d:3a4b:1230")); + // realserver_addr port check + BOOST_CHECK_EQUAL(saved_address_port, 80); + + cout << "[38]------------------------------------------" << endl; + // unit_test[38] op_codeが「U」で、endpointがipv6で、replicationエリアにデータがある場合、該当ipv6のendpointを更新する。 + realserver_addr.address(boost::asio::ip::address::from_string("1:21d0:1:4866:1:1:3a4b:1230")); + realserver_addr.port(port); + test_data1.op_code = 'U'; + test_data1.last_time = update_time; + test_data1.realserver_addr = realserver_addr; + this->temp_list.clear(); + this->put_into_temp_list(test_data1); + this->write_replicaion_area(); + // get saved information + saved_address_ip = std::string(this->replication_area->realserver_ip); + saved_address_port = this->replication_area->realserver_port; + // realserver_addr ip is updated, check it + BOOST_CHECK_EQUAL(saved_address_ip, std::string("1:21d0:1:4866:1:1:3a4b:1230")); + // realserver_addr port check + BOOST_CHECK_EQUAL(saved_address_port, port); + + cout << "[39]------------------------------------------" << endl; + // unit_test[39] op_codeが「D」で、endpointがipv6で、replicationエリアにデータがある場合、該当ipv6のendpointを変更しない、validに0を設定する。 + realserver_addr.address(boost::asio::ip::address::from_string("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff")); + test_data1.op_code = 'D'; + test_data1.last_time = delete_time; + test_data1.realserver_addr = realserver_addr; + this->temp_list.clear(); + this->put_into_temp_list(test_data1); + this->write_replicaion_area(); + // get saved information + saved_address_ip = std::string(this->replication_area->realserver_ip); + saved_address_port = this->replication_area->realserver_port; + // sslid_replication_data is deleted logically, valid flag is setted to 0, check it + BOOST_CHECK_EQUAL(this->replication_area->valid, 0); + // last_time is not updated , check it + BOOST_CHECK_EQUAL(this->replication_area->last_time, update_time); + // realserver_addr ip is not changed, check it + BOOST_CHECK_EQUAL(saved_address_ip, std::string("1:21d0:1:4866:1:1:3a4b:1230")); + // realserver_addr port is not changed, check it + BOOST_CHECK_EQUAL(saved_address_port, port); + + cout << "[40]------------------------------------------" << endl; + // unit_test[40] op_codeが「A」で、session_idが"00000000000000000000000000000000"で、該当のデータを追加する。 + std::string zero_string = "00000000000000000000000000000000"; + memset(this->replication_area, 0, this->maxlist*sizeof(struct l7vs::sslid_replication_data)); + test_data1.session_id = zero_string; + test_data1.op_code = 'A'; + test_data1.last_time = last_time; + test_data1.realserver_addr = realserver_addr; + this->temp_list.clear(); + this->put_into_temp_list(test_data1); + this->write_replicaion_area(); + memset(session_id_array, 0, SSLID_LENGTH + 1); + memcpy(session_id_array, this->replication_area->session_id, SSLID_LENGTH); + saved_session_id = std::string(session_id_array); + saved_address_ip = std::string(this->replication_area->realserver_ip); + saved_address_port = this->replication_area->realserver_port; + BOOST_CHECK_EQUAL(this->replication_area->valid, 1); + BOOST_CHECK_EQUAL(this->replication_area->last_time, last_time); + BOOST_CHECK_EQUAL(saved_address_ip, realserver_addr.address().to_string()); + BOOST_CHECK_EQUAL(saved_address_port, realserver_addr.port()); + BOOST_CHECK_EQUAL(saved_session_id, zero_string); + + cout << "[41]------------------------------------------" << endl; + // unit_test[41] op_codeが「U」で、session_idが"00000000000000000000000000000000"で、該当のデータを更新する。 + realserver_addr.address(boost::asio::ip::address::from_string("255.255.255.0")); + test_data1.session_id = zero_string; + test_data1.op_code = 'U'; + test_data1.last_time = update_time; + test_data1.realserver_addr = realserver_addr; + this->temp_list.clear(); + this->put_into_temp_list(test_data1); + this->write_replicaion_area(); + memset(session_id_array, 0, SSLID_LENGTH + 1); + memcpy(session_id_array, this->replication_area->session_id, SSLID_LENGTH); + saved_session_id = std::string(session_id_array); + saved_address_ip = std::string(this->replication_area->realserver_ip); + saved_address_port = this->replication_area->realserver_port; + BOOST_CHECK_EQUAL(this->replication_area->valid, 1); + BOOST_CHECK_EQUAL(this->replication_area->last_time, update_time); + BOOST_CHECK_EQUAL(saved_address_ip, realserver_addr.address().to_string()); + BOOST_CHECK_EQUAL(saved_address_port, realserver_addr.port()); + BOOST_CHECK_EQUAL(saved_session_id, zero_string); + + cout << "[42]------------------------------------------" << endl; + // unit_test[42] op_codeが「D」で、session_idが"00000000000000000000000000000000"で、該当のデータを削除する。 + test_data1.op_code = 'D'; + test_data1.session_id = zero_string; + test_data1.last_time = delete_time; + this->temp_list.clear(); + this->put_into_temp_list(test_data1); + this->write_replicaion_area(); + // get saved information + memset(session_id_array, 0, SSLID_LENGTH + 1); + memcpy(session_id_array, this->replication_area->session_id, SSLID_LENGTH); + saved_session_id = std::string(session_id_array); + saved_address_ip = std::string(this->replication_area->realserver_ip); + saved_address_port = this->replication_area->realserver_port; + BOOST_CHECK_EQUAL(this->replication_area->valid, 0); + BOOST_CHECK_EQUAL(this->replication_area->last_time, delete_time); + BOOST_CHECK_EQUAL(saved_address_ip, realserver_addr.address().to_string()); + BOOST_CHECK_EQUAL(saved_address_port, realserver_addr.port()); + BOOST_CHECK_EQUAL(saved_session_id, zero_string); + } + + // register_replication_area_lock_test + void register_replication_area_lock_test(){ + + boost::function register_function = &lock_function; + + cout << "[43]------------------------------------------" << endl; + // unit_test[43] register_replication_area_lock()関数のパラメータがNULLの場合、replication_area_lockがNULLある。 + this->register_replication_area_lock(NULL); + BOOST_CHECK_EQUAL(this->replication_area_lock.empty(), true); + + cout << "[44]------------------------------------------" << endl; + // unit_test[44] register_replication_area_lock()関数のパラメータがNULLでない場合、replication_area_lockがパラメータと一致する。 + this->register_replication_area_lock(register_function); + // function registered correctly check; + BOOST_CHECK_EQUAL(this->replication_area_lock, lock_function); + } + + // register_replication_area_unlock_test + void register_replication_area_unlock_test(){ + + boost::function register_function = &unlock_function; + + cout << "[45]------------------------------------------" << endl; + // unit_test[45] register_replication_area_unlock()関数のパラメータがNULLの場合、replication_area_unlockがNULLある。 + this->register_replication_area_unlock(NULL); + // function registered correctly check; + BOOST_CHECK_EQUAL(this->replication_area_unlock.empty(), true); + + cout << "[46]------------------------------------------" << endl; + // unit_test[46] register_replication_area_unlock()関数のパラメータがNULLでない場合、replication_area_unlockがパラメータと一致する。 + this->register_replication_area_unlock(register_function); + // function registered correctly check; + BOOST_CHECK_EQUAL(this->replication_area_unlock, unlock_function); + } + + // get_from_temp_list_test + void get_from_temp_list_test(){ + + int result = 10; + l7vs::sslid_replication_temp_data test_data1; + l7vs::sslid_replication_temp_data test_data2; + l7vs::sslid_replication_temp_data get_data; + boost::asio::ip::tcp::endpoint endpoint; + + cout << "[47]------------------------------------------" << endl; + // unit_test[47] temp_listのサイズが0の場合、戻り値が失敗(-1)で設定する。 + this->temp_list.clear(); + result = this->get_from_temp_list(get_data); + BOOST_CHECK_EQUAL(result, -1); + + cout << "[48]------------------------------------------" << endl; + // unit_test[48] temp_listのサイズが1の場合、戻り値が正常(0)で設定する。 + test_data1.session_id = "test_id123456789abcdefghijklmnop"; + test_data1.op_code = 'A'; + test_data1.realserver_addr = endpoint; + test_data1.last_time = 1000; + this->temp_list.clear(); + this->temp_list.push_back(test_data1); + result = this->get_from_temp_list(get_data); + BOOST_CHECK_EQUAL(result, 0); + + cout << "[49]------------------------------------------" << endl; + // unit_test[49] temp_listのサイズが3の場合、戻り値が正常(0)で設定する。 + this->temp_list.clear(); + this->temp_list.push_back(test_data1); + this->temp_list.push_back(test_data1); + this->temp_list.push_back(test_data1); + result = this->get_from_temp_list(get_data); + BOOST_CHECK_EQUAL(result, 0); + + cout << "[50]------------------------------------------" << endl; + // unit_test[50] マルチスレッドの場合、temp_listにデータを正常取得する。 + try { + this->temp_list.clear(); + this->temp_list.push_back(test_data1); + this->temp_list.push_back(test_data1); + this->temp_list.push_back(test_data1); + this->temp_list.push_back(test_data1); + boost::thread_group thread_group1; + thread_group1.create_thread(boost::bind(&sslid_replication_data_processor_test_class::get_from_temp_list_thread1, this)); + thread_group1.create_thread(boost::bind(&sslid_replication_data_processor_test_class::get_from_temp_list_thread1, this)); + thread_group1.create_thread(boost::bind(&sslid_replication_data_processor_test_class::get_from_temp_list_thread1, this)); + thread_group1.join_all(); + } catch(...) { + BOOST_ERROR("exception: get_from_temp_list"); + } + + cout << "[51]------------------------------------------" << endl; + // unit_test[51] temp_listにデータがある場合、1つ目のデータを削除する。 + test_data1.session_id = "test_id123456789abcdefghijklmnop"; + test_data1.op_code = 'T'; + test_data1.realserver_addr = endpoint; + test_data1.last_time = time(0); + test_data2.session_id = "test_id2abcdefghijklmnop23456789"; + test_data2.op_code = 'A'; + test_data2.realserver_addr = endpoint; + test_data2.last_time = time(0); + this->temp_list.clear(); + this->temp_list.push_back(test_data1); + this->temp_list.push_back(test_data2); + this->get_from_temp_list(get_data); + l7vs::sslid_replication_temp_data& leave_data = this->temp_list.back(); + // first item removed check,so only one item leave, check it + BOOST_CHECK_EQUAL(this->temp_list.size(), 1u); + // session_id check + BOOST_CHECK_EQUAL(leave_data.session_id, test_data2.session_id); + // op_code check + BOOST_CHECK_EQUAL(leave_data.op_code, test_data2.op_code); + // realserver_addr check + BOOST_CHECK_EQUAL(leave_data.realserver_addr, test_data2.realserver_addr); + // last_time check + BOOST_CHECK_EQUAL(leave_data.last_time, test_data2.last_time); + + cout << "[52]------------------------------------------" << endl; + // unit_test[52] temp_listに1つデータがある場合、get_from_temp_list()で取得したデータがtemp_listの内容と一致する。 + test_data1.op_code = 'A'; + this->temp_list.clear(); + this->temp_list.push_back(test_data1); + this->get_from_temp_list(get_data); + // get data check + // session_id check + BOOST_CHECK_EQUAL(get_data.session_id, test_data1.session_id); + // op_code check + BOOST_CHECK_EQUAL(get_data.op_code, test_data1.op_code); + // realserver_addr check + BOOST_CHECK_EQUAL(get_data.realserver_addr, test_data1.realserver_addr); + // last_time check + BOOST_CHECK_EQUAL(get_data.last_time, test_data1.last_time); + + cout << "[53]------------------------------------------" << endl; + // unit_test[53] temp_listに2つデータがある場合、get_from_temp_list()で取得したデータがtemp_listの1つ目の内容と一致する。 + test_data1.op_code = 'U'; + test_data2.op_code = 'D'; + this->temp_list.clear(); + this->temp_list.push_back(test_data1); + this->temp_list.push_back(test_data2); + this->get_from_temp_list(get_data); + // got data check + // session_id check + BOOST_CHECK_EQUAL(get_data.session_id, test_data1.session_id); + // op_code check + BOOST_CHECK_EQUAL(get_data.op_code, test_data1.op_code); + // realserver_addr check + BOOST_CHECK_EQUAL(get_data.realserver_addr, test_data1.realserver_addr); + // last_time check + BOOST_CHECK_EQUAL(get_data.last_time, test_data1.last_time); + } + + // get_replication_area_test + void get_replication_area_test(sslid_replication_data* expecting_sslid_replication_data) { + + cout << "[54]------------------------------------------" << endl; + // unit_test[54] get_replication_area()関数の戻り値はコンストラクタが正常に生成する値と一致する。 + sslid_replication_data* get_data = this->get_replication_area(); + BOOST_CHECK_EQUAL(get_data, expecting_sslid_replication_data); + } +}; + +// function sslid_replication_data_processor test +void sslid_replication_data_processor_test(){ + + int data_area_size = 128*sizeof(struct l7vs::sslid_replication_data_header) + STRUCT_NUMBER*sizeof(struct l7vs::sslid_replication_data); + char *replication_data_area = new char[data_area_size]; + bool bret = (replication_data_area != NULL); + BOOST_REQUIRE_EQUAL(bret, true); + int maxlist_test = 5; + char *header_start_address = replication_data_area; + char *real_data_start_address = header_start_address + 128*sizeof(struct l7vs::sslid_replication_data_header); + boost::asio::ip::tcp::endpoint virtual_service_endpoint; + + memset(replication_data_area, 0, data_area_size); + + virtual_service_endpoint.port(999); + sslid_replication_data_processor_test_class test_object(maxlist_test, + replication_data_area, SECTION_NUMBER, virtual_service_endpoint, + replication_ingetloglevel, replication_inputLogFatal, + replication_inputLogError, replication_inputLogWarn, + replication_inputLogInfo, replication_inputLogDebug); + test_object.sslid_replication_data_processor_test(maxlist_test, + reinterpret_cast(real_data_start_address), + virtual_service_endpoint, replication_data_area, data_area_size, + header_start_address, real_data_start_address); + + delete []replication_data_area; +} + +// function put_into_temp_list test +void put_into_temp_list_test(){ + + int data_area_size = 128*sizeof(struct l7vs::sslid_replication_data_header) + STRUCT_NUMBER*sizeof(struct l7vs::sslid_replication_data); + char *replication_data_area = new char[data_area_size]; + bool bret = (replication_data_area != NULL); + BOOST_REQUIRE_EQUAL(bret, true); + boost::asio::ip::tcp::endpoint virtual_service_endpoint; + + memset(replication_data_area, 0, data_area_size); + + sslid_replication_data_processor_test_class test_object(3, + replication_data_area, SECTION_NUMBER, virtual_service_endpoint, + replication_ingetloglevel, replication_inputLogFatal, + replication_inputLogError, replication_inputLogWarn, + replication_inputLogInfo, replication_inputLogDebug); + + test_object.put_into_temp_list_test(); + delete []replication_data_area; +} + +// function write_replicaion_area test +void write_replicaion_area_test(){ + + int data_area_size = 128*sizeof(struct l7vs::sslid_replication_data_header) + STRUCT_NUMBER*sizeof(struct l7vs::sslid_replication_data); + char *replication_data_area = new char[data_area_size]; + bool bret = (replication_data_area != NULL); + BOOST_REQUIRE_EQUAL(bret, true); + boost::asio::ip::tcp::endpoint virtual_service_endpoint; + + memset(replication_data_area, 0, data_area_size); + + sslid_replication_data_processor_test_class test_object(3, + replication_data_area, SECTION_NUMBER, virtual_service_endpoint, + replication_ingetloglevel, replication_inputLogFatal, + replication_inputLogError, replication_inputLogWarn, + replication_inputLogInfo, replication_inputLogDebug); + l7vs::sslid_replication_temp_data test_data1; + boost::function function_pointer; + boost::asio::ip::tcp::endpoint realserver_addr; + + test_object.write_replicaion_area_test(); + delete []replication_data_area; +} + +// function register_replication_area_lock test +void register_replication_area_lock_test(){ + + int data_area_size = 128*sizeof(struct l7vs::sslid_replication_data_header) + STRUCT_NUMBER*sizeof(struct l7vs::sslid_replication_data); + char *replication_data_area = new char[data_area_size]; + bool bret = (replication_data_area != NULL); + BOOST_REQUIRE_EQUAL(bret, true); + boost::asio::ip::tcp::endpoint virtual_service_endpoint; + + memset(replication_data_area, 0, data_area_size); + + sslid_replication_data_processor_test_class test_object(1, + replication_data_area, SECTION_NUMBER, virtual_service_endpoint, + replication_ingetloglevel, replication_inputLogFatal, + replication_inputLogError, replication_inputLogWarn, + replication_inputLogInfo, replication_inputLogDebug); + + test_object.register_replication_area_lock_test(); + delete []replication_data_area; +} + +// function register_replication_area_unlock test +void register_replication_area_unlock_test(){ + + int data_area_size = 128*sizeof(struct l7vs::sslid_replication_data_header) + STRUCT_NUMBER*sizeof(struct l7vs::sslid_replication_data); + char *replication_data_area = new char[data_area_size]; + bool bret = (replication_data_area != NULL); + BOOST_REQUIRE_EQUAL(bret, true); + boost::asio::ip::tcp::endpoint virtual_service_endpoint; + + memset(replication_data_area, 0, data_area_size); + + sslid_replication_data_processor_test_class test_object(1, + replication_data_area, SECTION_NUMBER, virtual_service_endpoint, + replication_ingetloglevel, replication_inputLogFatal, + replication_inputLogError, replication_inputLogWarn, + replication_inputLogInfo, replication_inputLogDebug); + + test_object.register_replication_area_unlock_test(); + delete []replication_data_area; +} + +// function get_from_temp_list test +void get_from_temp_list_test(){ + + int data_area_size = 128*sizeof(struct l7vs::sslid_replication_data_header) + STRUCT_NUMBER*sizeof(struct l7vs::sslid_replication_data); + char *replication_data_area = new char[data_area_size]; + bool bret = (replication_data_area != NULL); + BOOST_REQUIRE_EQUAL(bret, true); + boost::asio::ip::tcp::endpoint virtual_service_endpoint; + + memset(replication_data_area, 0, data_area_size); + + sslid_replication_data_processor_test_class test_object(5, + replication_data_area, SECTION_NUMBER, virtual_service_endpoint, + replication_ingetloglevel, replication_inputLogFatal, + replication_inputLogError, replication_inputLogWarn, + replication_inputLogInfo, replication_inputLogDebug); + l7vs::sslid_replication_temp_data test_data1; + l7vs::sslid_replication_temp_data test_data2; + l7vs::sslid_replication_temp_data get_data; + boost::asio::ip::tcp::endpoint endpoint; + + test_object.get_from_temp_list_test(); + delete []replication_data_area; +} + +// get_replication_area_test +void get_replication_area_test() { + + int data_area_size = 128*sizeof(struct l7vs::sslid_replication_data_header) + STRUCT_NUMBER*sizeof(struct l7vs::sslid_replication_data); + char *replication_data_area = new char[data_area_size]; + bool bret = (replication_data_area != NULL); + BOOST_REQUIRE_EQUAL(bret, true); + boost::asio::ip::tcp::endpoint virtual_service_endpoint; + + memset(replication_data_area, 0, data_area_size); + + sslid_replication_data_processor_test_class test_object(2, + replication_data_area, SECTION_NUMBER, virtual_service_endpoint, + replication_ingetloglevel, replication_inputLogFatal, + replication_inputLogError, replication_inputLogWarn, + replication_inputLogInfo, replication_inputLogDebug); + + sslid_replication_data* expecting_result; + expecting_result = reinterpret_cast (replication_data_area + + 128 * sizeof(struct l7vs::sslid_replication_data_header)); + + test_object.get_replication_area_test(expecting_result); + delete []replication_data_area; +} + +void sslid_replication_data_processor_test_main() +{ + // create unit test suite + test_suite* ts = BOOST_TEST_SUITE( "sslid_replication_data_processor" ); + + // add test case to test suite + ts->add( BOOST_TEST_CASE( &sslid_replication_data_processor_test ) ); + ts->add( BOOST_TEST_CASE( &put_into_temp_list_test ) ); + ts->add( BOOST_TEST_CASE( &write_replicaion_area_test ) ); + ts->add( BOOST_TEST_CASE( ®ister_replication_area_lock_test ) ); + ts->add( BOOST_TEST_CASE( ®ister_replication_area_unlock_test ) ); + ts->add( BOOST_TEST_CASE( &get_from_temp_list_test ) ); + ts->add( BOOST_TEST_CASE( &get_replication_area_test ) ); + + framework::master_test_suite().add( ts ); +} diff --git a/unit_tests/module_test/protocol_module_sslid_test/sslid_session_data_processor_test.cpp b/unit_tests/module_test/protocol_module_sslid_test/sslid_session_data_processor_test.cpp new file mode 100644 index 00000000..d7677000 --- /dev/null +++ b/unit_tests/module_test/protocol_module_sslid_test/sslid_session_data_processor_test.cpp @@ -0,0 +1,1586 @@ +/* + * @file sslid_session_data_processor_test.cpp + * @brief sslid session data processor test file. + * + * L7VSD: Linux Virtual Server for Layer7 Load Balancing + * Copyright (C) 2009 NTT COMWARE Corporation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + **********************************************************************/ + +#include "sslid_to_be_test_file.h" + +using namespace boost::unit_test; +using namespace l7vs; + +#define SECTION_NUMBER 200 +#define STRUCT_NUMBER 256 + +bool clear_function_return_fail = false; + +LOG_LEVEL_TAG getloglevel_test(){ + + return LOG_LV_NONE; +} + +void putLogFatal_test(const unsigned int id, const std::string& message, const char* file_name, int line_number){ +} + +void putLogError_test(const unsigned int id, const std::string& message, const char* file_name, int line_number){ +} + +void putLogWarn_test(const unsigned int id, const std::string& message, const char* file_name, int line_number){ +} + +void putLogInfo_test(const unsigned int id, const std::string& message, const char* file_name, int line_number){ +} + +void putLogDebug_test(const unsigned int id, const std::string& message, const char* file_name, int line_number){ +} +l7vs::sslid_replication_data_processor::getloglevel_func_type ingetloglevel1 = getloglevel_test; +l7vs::sslid_replication_data_processor::logger_func_type inputLogFatal1 = putLogFatal_test; +l7vs::sslid_replication_data_processor::logger_func_type inputLogError1 = putLogError_test; +l7vs::sslid_replication_data_processor::logger_func_type inputLogWarn1 = putLogWarn_test; +l7vs::sslid_replication_data_processor::logger_func_type inputLogInfo1 = putLogInfo_test; +l7vs::sslid_replication_data_processor::logger_func_type inputLogDebug1 = putLogDebug_test; +l7vs::sslid_session_data_processor::getloglevel_func_type ingetloglevel2 = getloglevel_test; +l7vs::sslid_session_data_processor::logger_func_type inputLogFatal2 = putLogFatal_test; +l7vs::sslid_session_data_processor::logger_func_type inputLogError2 = putLogError_test; +l7vs::sslid_session_data_processor::logger_func_type inputLogWarn2 = putLogWarn_test; +l7vs::sslid_session_data_processor::logger_func_type inputLogInfo2 = putLogInfo_test; +l7vs::sslid_session_data_processor::logger_func_type inputLogDebug2 = putLogDebug_test; + +class sslid_replication_data_processor_replacement: public sslid_replication_data_processor{ +public: + sslid_replication_data_processor_replacement(int maxlist, + char* sslid_replication_area_begain, + int sslid_replication_area_size, + const boost::asio::ip::tcp::endpoint& virtual_service_endpoint, + getloglevel_func_type ingetloglevel, + logger_func_type inputLogFatal, + logger_func_type inputLogError, + logger_func_type inputLogWarn, + logger_func_type inputLogInfo, + logger_func_type inputLogDebug ) : + sslid_replication_data_processor(maxlist, + sslid_replication_area_begain, + sslid_replication_area_size, + virtual_service_endpoint, + ingetloglevel, + inputLogFatal, + inputLogError, + inputLogWarn, + inputLogInfo, + inputLogDebug ) { + } + + // to call the get_from_temp_list function + void to_get_from_temp_list( sslid_replication_temp_data& data ){ + this->get_from_temp_list(data); + } + + // to get the temp_list + std::deque& get_temp_list(){ + return this->temp_list; + } +}; + +// test class +class sslid_session_data_processor_test_class : public sslid_session_data_processor{ +public: + boost::mutex check_mutex; + // sslid_session_data_processor_test_class + sslid_session_data_processor_test_class(int maxlist, int timeout, + sslid_replication_data_processor* replication_data_processor, + getloglevel_func_type ingetloglevel, + logger_func_type inputLogFatal, logger_func_type inputLogError, + logger_func_type inputLogWarn, logger_func_type inputLogInfo, + logger_func_type inputLogDebug) : + sslid_session_data_processor(maxlist, timeout, + replication_data_processor, ingetloglevel, inputLogFatal, + inputLogError, inputLogWarn, inputLogInfo, inputLogDebug) { + + } + + // clear_expired_session_data + int clear_expired_session_data(){ + if(clear_function_return_fail){ + return 1; + } else { + return sslid_session_data_processor::clear_expired_session_data(); + } + } + + // write_session_data_test thread + void write_session_data_test_thread( + const std::string& session_id, + const boost::asio::ip::tcp::endpoint& endpoint, + time_t now_time ){ + this->write_session_data(session_id, endpoint, now_time); + } + + // get_endpoint_from_session_data_test thread + void get_endpoint_from_session_data_thread( + const std::string& session_id, + boost::asio::ip::tcp::endpoint& expecting_endpoint){ + + int result = 10; + boost::asio::ip::tcp::endpoint get_endpoint; + + result = this->get_endpoint_from_session_data(session_id, get_endpoint); + { + boost::mutex::scoped_lock sclock(check_mutex); + BOOST_CHECK_EQUAL(result, 0); + BOOST_CHECK_EQUAL(get_endpoint, expecting_endpoint); + } + } + + // sslid_session_data_processor_test + void sslid_session_data_processor_test( + int expecting_maxlist, + int expecting_timeout, + sslid_replication_data_processor* expecting_replication_data_processor) { + + cout << "[1]------------------------------------------" << endl; + // unit_test[1] メンバー変数が初期化されるチェックする。 + // maxlist check + BOOST_CHECK_EQUAL(this->maxlist, expecting_maxlist); + // timeout check + BOOST_CHECK_EQUAL(this->timeout, expecting_timeout); + // replication_data_processor check + BOOST_CHECK_EQUAL(this->replication_data_processor, expecting_replication_data_processor); + // getloglevel check + BOOST_CHECK_EQUAL(this->getloglevel, getloglevel_test); + // putLogFatal check + BOOST_CHECK_EQUAL(this->putLogFatal, putLogFatal_test); + // putLogError check + BOOST_CHECK_EQUAL(this->putLogError, putLogError_test); + // putLogWarn check + BOOST_CHECK_EQUAL(this->putLogWarn, putLogWarn_test); + // putLogInfo check + BOOST_CHECK_EQUAL(this->putLogInfo, putLogInfo_test); + // putLogDebug check + BOOST_CHECK_EQUAL(this->putLogDebug, putLogDebug_test); + // session_endpoint_map check + BOOST_CHECK_EQUAL(this->session_endpoint_map.size(), 0u); + // session_lasttime_map check + BOOST_CHECK_EQUAL(this->session_lasttime_map.size(), 0u); + // lasttime_session_map + BOOST_CHECK_EQUAL(this->lasttime_session_map.size(), 0u); + + cout << "[2]------------------------------------------" << endl; + // unit_test[2] maxlist < 0の場合, 例外が発生する。 + bool exception_occur = false; + try{ + l7vs::sslid_session_data_processor(-1, 1, expecting_replication_data_processor, + ingetloglevel2, inputLogFatal2, inputLogError2, inputLogWarn2, + inputLogInfo2, inputLogDebug2); + } catch(...) { + exception_occur = true; + } + BOOST_CHECK(exception_occur); + + cout << "[3]------------------------------------------" << endl; + // unit_test[3] maxlist が0の場合, 例外が発生しない。 + try{ + l7vs::sslid_session_data_processor(0, 1, expecting_replication_data_processor, + ingetloglevel2, inputLogFatal2, inputLogError2, inputLogWarn2, + inputLogInfo2, inputLogDebug2); + } catch(...) { + BOOST_ERROR("exception: sslid_session_data_processor"); + } + + cout << "[4]------------------------------------------" << endl; + // unit_test[4] timeout < 0の場合, 例外が発生する。 + exception_occur = false; + try{ + l7vs::sslid_session_data_processor(2, -2, expecting_replication_data_processor, + ingetloglevel2, inputLogFatal2, inputLogError2, inputLogWarn2, + inputLogInfo2, inputLogDebug2); + } catch(...) { + exception_occur = true; + } + BOOST_CHECK(exception_occur); + + cout << "[5]------------------------------------------" << endl; + // unit_test[5] timeout が0の場合, 例外が発生しない。 + try{ + l7vs::sslid_session_data_processor(2, 0, expecting_replication_data_processor, + ingetloglevel2, inputLogFatal2, inputLogError2, inputLogWarn2, + inputLogInfo2, inputLogDebug2); + } catch(...) { + BOOST_ERROR("exception: sslid_session_data_processor"); + } + + cout << "[6]------------------------------------------" << endl; + // unit_test[6] replication_data_processorがNULLの場合, 例外が発生する。 + exception_occur = false; + try{ + l7vs::sslid_session_data_processor(2, 2, NULL, + ingetloglevel2, inputLogFatal2, inputLogError2, inputLogWarn2, + inputLogInfo2, inputLogDebug2); + } catch(...) { + exception_occur = true; + } + BOOST_CHECK(exception_occur); + } + + // get_endpoint_from_session_data_test + void get_endpoint_from_session_data_test(){ + + int result = 10; + time_t last_time = time(0); + std::string session_id; + boost::asio::ip::tcp::endpoint get_endpoint; + boost::asio::ip::tcp::endpoint saved_endpoint; + sslid_replication_temp_data temp_list_data; + sslid_replication_data_processor_replacement *this_replication_data_processor = + dynamic_cast(this->replication_data_processor); + + cout << "[7]------------------------------------------" << endl; + // unit_test[7] session_endpoint_map と session_lasttime_mapが空の場合、戻り値が失敗(1)で設定する。 + session_id = "test_id123456789abcdefghijklmnop"; + this->session_endpoint_map.clear(); + this->session_lasttime_map.clear(); + this->lasttime_session_map.clear(); + result = this->get_endpoint_from_session_data(session_id, get_endpoint); + // function result check + BOOST_CHECK_EQUAL(result, 1); + + cout << "[8]------------------------------------------" << endl; + // unit_test[8] session_endpoint_mapが空で,session_lasttime_mapが空でない場合、戻り値が失敗(1)で設定する。 + this->session_endpoint_map.clear(); + this->session_lasttime_map.clear(); + this->lasttime_session_map.clear(); + this->session_lasttime_map[session_id] = last_time; + result = this->get_endpoint_from_session_data(session_id, get_endpoint); + // function result check + BOOST_CHECK_EQUAL(result, 1); + + cout << "[9]------------------------------------------" << endl; + // unit_test[9] session_lasttime_mapが空で,session_endpoint_mapが空でない場合、戻り値が失敗(1)で設定する。 + this->session_endpoint_map.clear(); + this->session_lasttime_map.clear(); + this->lasttime_session_map.clear(); + this->session_endpoint_map[session_id] = saved_endpoint; + result = this->get_endpoint_from_session_data(session_id, get_endpoint); + // function result check + BOOST_CHECK_EQUAL(result, 1); + + cout << "[10]------------------------------------------" << endl; + // unit_test[10] 1つのデータがmapに存在して、タイムアウトしない場合、戻り値が正常(0)で設定する。 + result = 10; + session_id = "test_id123456789abcdefghijklmnop"; + saved_endpoint.address(boost::asio::ip::address::from_string("192.168.120.102")); + saved_endpoint.port(80); + get_endpoint.address(boost::asio::ip::address::from_string("0.0.0.0")); + this->timeout = 10000; + this->session_endpoint_map.clear(); + this->session_lasttime_map.clear(); + this->lasttime_session_map.clear(); + this->session_endpoint_map[session_id] = saved_endpoint; + this->session_lasttime_map[session_id] = last_time; + result = this->get_endpoint_from_session_data(session_id, get_endpoint); + // got endpoint check + BOOST_CHECK_EQUAL(get_endpoint, saved_endpoint); + // function result check + BOOST_CHECK_EQUAL(result, 0); + + cout << "[11]------------------------------------------" << endl; + // unit_test[11] 1つのデータがmapに存在して、タイムアウトの場合、戻り値が正常(0)で設定する。 + result = 10; + this->timeout = 0; + this->session_endpoint_map.clear(); + this->session_lasttime_map.clear(); + this->lasttime_session_map.clear(); + this_replication_data_processor->get_temp_list().clear(); + this->session_endpoint_map[session_id] = saved_endpoint; + this->session_lasttime_map[session_id] = last_time - 10; + this->lasttime_session_map.insert(std::make_pair(last_time - 10, session_id)); + result = this->get_endpoint_from_session_data(session_id, get_endpoint); + // get the item which put into the temp_list + this_replication_data_processor->to_get_from_temp_list(temp_list_data); + // session_endpoint_map item removed check + BOOST_CHECK_EQUAL(this->session_endpoint_map.size(), 0u); + // session_lasttime_map item removed check + BOOST_CHECK_EQUAL(this->session_lasttime_map.size(), 0u); + // lasttime_session_map item removed check + BOOST_CHECK_EQUAL(this->lasttime_session_map.size(), 0u); + // function result check + BOOST_CHECK_EQUAL(result, 0); + // the item which put into the temp_list check + BOOST_CHECK_EQUAL(temp_list_data.op_code, 'D'); + BOOST_CHECK_EQUAL(temp_list_data.session_id, session_id); + + cout << "[12]------------------------------------------" << endl; + // unit_test[12] mapに3つデータがあり、且つ3つデータが全部タイムアウトしない場合、戻り値が正常(0)で設定する。 + result = 10; + std::string temp_session_id1 = "temp_session_idyyyyyuuuu33456780"; + std::string temp_session_id2 = "temp_session_id456789012rtyuerxy"; + boost::asio::ip::tcp::endpoint temp_endpoint; + temp_endpoint.port(3333); + this->timeout = 10000; + this->session_endpoint_map.clear(); + this->session_lasttime_map.clear(); + this->lasttime_session_map.clear(); + this->session_endpoint_map[session_id] = saved_endpoint; + this->session_endpoint_map[temp_session_id1] = temp_endpoint; + this->session_endpoint_map[temp_session_id2] = temp_endpoint; + this->session_lasttime_map[session_id] = last_time; + this->session_lasttime_map[temp_session_id1] = last_time; + this->session_lasttime_map[temp_session_id2] = last_time; + this->lasttime_session_map.insert(std::make_pair(last_time, session_id)); + this->lasttime_session_map.insert(std::make_pair(last_time, temp_session_id1)); + this->lasttime_session_map.insert(std::make_pair(last_time, temp_session_id2)); + result = this->get_endpoint_from_session_data(session_id, get_endpoint); + // function result check + BOOST_CHECK_EQUAL(result, 0); + // got endpoint check + BOOST_CHECK_EQUAL(get_endpoint, saved_endpoint); + + cout << "[13]------------------------------------------" << endl; + // unit_test[13] mapに3つデータがあり、且つ2つデータがタイムアウトしなくて,1つのデータだけタイムアウトの場合、戻り値が正常(0)で設定する。 + time_t temp_last_time = time(0) - 10; + time_t out_time = time(0) - 5000; + result = 10; + this->timeout = 1000; + this->session_endpoint_map.clear(); + this->session_lasttime_map.clear(); + this->lasttime_session_map.clear(); + this->session_endpoint_map[session_id] = saved_endpoint; + this->session_endpoint_map[temp_session_id1] = temp_endpoint; + this->session_endpoint_map[temp_session_id2] = temp_endpoint; + this->session_lasttime_map[session_id] = temp_last_time; + this->session_lasttime_map[temp_session_id1] = temp_last_time; + this->session_lasttime_map[temp_session_id2] = out_time; + this->lasttime_session_map.insert(std::make_pair(temp_last_time, session_id)); + this->lasttime_session_map.insert(std::make_pair(temp_last_time, temp_session_id1)); + this->lasttime_session_map.insert(std::make_pair(out_time, temp_session_id2)); + result = this->get_endpoint_from_session_data(session_id, get_endpoint); + // function result check + BOOST_CHECK_EQUAL(result, 0); + // got endpoint check + BOOST_CHECK_EQUAL(get_endpoint, saved_endpoint); + + cout << "[14]------------------------------------------" << endl; + // unit_test[14] mapに3つデータがあり、且つ3つデータが全部タイムアウトの場合、戻り値が正常(0)で設定する。 + temp_last_time = last_time - 10; + this->timeout = 0; + this->session_endpoint_map.clear(); + this->session_lasttime_map.clear(); + this->lasttime_session_map.clear(); + this_replication_data_processor->get_temp_list().clear(); + this->session_endpoint_map[session_id] = saved_endpoint; + this->session_endpoint_map[temp_session_id1] = temp_endpoint; + this->session_endpoint_map[temp_session_id2] = temp_endpoint; + this->session_lasttime_map[session_id] = temp_last_time ; + this->session_lasttime_map[temp_session_id1] = temp_last_time; + this->session_lasttime_map[temp_session_id2] = temp_last_time; + this->lasttime_session_map.insert(std::make_pair(temp_last_time, session_id)); + this->lasttime_session_map.insert(std::make_pair(temp_last_time, temp_session_id1)); + this->lasttime_session_map.insert(std::make_pair(temp_last_time, temp_session_id2)); + result = this->get_endpoint_from_session_data(session_id, get_endpoint); + // get the item which put into the temp_list + this_replication_data_processor->to_get_from_temp_list(temp_list_data); + // session_endpoint_map item removed check + BOOST_CHECK_EQUAL(this->session_endpoint_map.size(), 2u); + // session_lasttime_map item removed check + BOOST_CHECK_EQUAL(this->session_lasttime_map.size(), 2u); + // lasttime_session_map item removed check + BOOST_CHECK_EQUAL(this->lasttime_session_map.size(), 2u); + // function result check + BOOST_CHECK_EQUAL(result, 0); + // the item which put into the temp_list check + BOOST_CHECK_EQUAL(temp_list_data.op_code, 'D'); + BOOST_CHECK_EQUAL(temp_list_data.session_id, session_id); + + cout << "[15]------------------------------------------" << endl; + // unit_test[15] メンバー関数timeoutが0でなくて、且つ検索対象データがタイムアウトの場合、戻り値が正常(0)で設定する。 + temp_last_time = time(0) - 20; + this->timeout = 10; + this->session_endpoint_map.clear(); + this->session_lasttime_map.clear(); + this->lasttime_session_map.clear(); + this_replication_data_processor->get_temp_list().clear(); + this->session_endpoint_map[session_id] = saved_endpoint; + this->session_lasttime_map[session_id] = temp_last_time; + this->lasttime_session_map.insert(std::make_pair(temp_last_time, session_id)); + result = this->get_endpoint_from_session_data(session_id, get_endpoint); + // get the item which put into the temp_list + this_replication_data_processor->to_get_from_temp_list(temp_list_data); + // session_endpoint_map item removed check + BOOST_CHECK_EQUAL(this->session_endpoint_map.size(), 0u); + // session_lasttime_map item removed check + BOOST_CHECK_EQUAL(this->session_lasttime_map.size(), 0u); + // lasttime_session_map item removed check + BOOST_CHECK_EQUAL(this->lasttime_session_map.size(), 0u); + // function result check + BOOST_CHECK_EQUAL(result, 0); + // the item which put into the temp_list check + BOOST_CHECK_EQUAL(temp_list_data.op_code, 'D'); + BOOST_CHECK_EQUAL(temp_list_data.session_id, session_id); + + cout << "[16]------------------------------------------" << endl; + // unit_test[16] endpointがipv6で、1つのデータが存在して、且つタイムアウトしない場合、戻り値が正常(0)で設定する。 + saved_endpoint.address(boost::asio::ip::address::from_string("abcd:21d0:8936:4866:eefe:567d:3a4b:1230")); + result = 10; + this->timeout = 10000; + this->session_endpoint_map.clear(); + this->session_lasttime_map.clear(); + this->lasttime_session_map.clear(); + this->session_endpoint_map[session_id] = saved_endpoint; + this->session_lasttime_map[session_id] = last_time; + this->lasttime_session_map.insert(std::make_pair(last_time, session_id)); + result = this->get_endpoint_from_session_data(session_id, get_endpoint); + // got endpoint check + BOOST_CHECK_EQUAL(get_endpoint, saved_endpoint); + // function result check + BOOST_CHECK_EQUAL(result, 0); + + cout << "[17]------------------------------------------" << endl; + // unit_test[17] マルチスレッドの場合、データを正常取得する。 + time_t time1 = time(0); + time_t time2 = time1 - 2000; + time_t time3 = time1 - 3000; + std::string session_id1 = "11111111111111111111111111111111"; + std::string session_id2 = "22222222222222222222222222222222"; + std::string session_id3 = "33333333333333333333333333333333"; + boost::asio::ip::tcp::endpoint endpoint1; + boost::asio::ip::tcp::endpoint endpoint2; + boost::asio::ip::tcp::endpoint endpoint3; + boost::asio::ip::tcp::endpoint default_endpoint; + endpoint1.address(boost::asio::ip::address::from_string("192.168.120.1")); + endpoint2.address(boost::asio::ip::address::from_string("192.168.120.2")); + endpoint3.address(boost::asio::ip::address::from_string("192.168.120.3")); + endpoint1.port(1); + endpoint2.port(2); + endpoint3.port(3); + this->timeout = 1000; + this->session_endpoint_map.clear(); + this->session_lasttime_map.clear(); + this->lasttime_session_map.clear(); + this->session_endpoint_map[session_id1] = endpoint1; + this->session_endpoint_map[session_id2] = endpoint2; + this->session_endpoint_map[session_id3] = endpoint3; + this->session_lasttime_map[session_id1] = time1; + this->session_lasttime_map[session_id2] = time2; + this->session_lasttime_map[session_id3] = time3; + this->lasttime_session_map.insert(std::make_pair(time1, session_id1)); + this->lasttime_session_map.insert(std::make_pair(time2, session_id2)); + this->lasttime_session_map.insert(std::make_pair(time3, session_id3)); + boost::thread_group thread_group; + thread_group.create_thread(boost::bind( + &sslid_session_data_processor_test_class::get_endpoint_from_session_data_thread, + this, session_id1, endpoint1)); + thread_group.create_thread(boost::bind( + &sslid_session_data_processor_test_class::get_endpoint_from_session_data_thread, + this, session_id2, default_endpoint)); + thread_group.create_thread(boost::bind( + &sslid_session_data_processor_test_class::get_endpoint_from_session_data_thread, + this, session_id3, default_endpoint)); + thread_group.join_all(); + } + + // write_session_data_test + void write_session_data_test(){ + + int result = 10; + time_t last_time = time(0); + time_t write_time = time(0) + 55; + std::string session_id; + boost::asio::ip::tcp::endpoint old_saved_endpoint; + boost::asio::ip::tcp::endpoint new_saved_endpoint; + std::multimap::iterator lasttime_session_map_iterator; + std::multimap::iterator delete_item_iterator; + sslid_replication_temp_data temp_list_data; + sslid_replication_data_processor_replacement *this_replication_data_processor = + dynamic_cast (this->replication_data_processor); + + cout << "[18]------------------------------------------" << endl; + // unit_test[18] maxlistが0の場合、戻り値が正常(0)で設定する。 + this->session_endpoint_map.clear(); + this->session_lasttime_map.clear(); + this->lasttime_session_map.clear(); + this->maxlist = 0; + result = this->write_session_data(session_id, new_saved_endpoint, write_time); + BOOST_CHECK_EQUAL(result, 0); + + cout << "[19]------------------------------------------" << endl; + // unit_test[19] mapが空の場合、例外が発生しない。 + try{ + this->maxlist = 3; + this->session_endpoint_map.clear(); + this->session_lasttime_map.clear(); + this->lasttime_session_map.clear(); + this_replication_data_processor->get_temp_list().clear(); + result = this->write_session_data(session_id, new_saved_endpoint, write_time); + lasttime_session_map_iterator = this->lasttime_session_map.find(write_time); + // get the item which put into the temp_list + this_replication_data_processor->to_get_from_temp_list(temp_list_data); + // session_endpoint_map is setted check + BOOST_CHECK_EQUAL(this->session_endpoint_map[session_id], new_saved_endpoint); + // session_lasttime_map is setted check + BOOST_CHECK_EQUAL(this->session_lasttime_map[session_id], write_time); + // lasttime_session_map is setted check + BOOST_CHECK_EQUAL(lasttime_session_map_iterator->second, session_id); + // function result check + BOOST_CHECK_EQUAL(result, 0); + // the item which put into the temp_list check + BOOST_CHECK_EQUAL(temp_list_data.op_code, 'A'); + BOOST_CHECK_EQUAL(temp_list_data.session_id, session_id); + BOOST_CHECK_EQUAL(temp_list_data.realserver_addr, new_saved_endpoint); + BOOST_CHECK_EQUAL(temp_list_data.last_time, write_time); + } catch (...) { + BOOST_ERROR("exception: write_session_data"); + } + + cout << "[20]------------------------------------------" << endl; + // unit_test[20] mapにセッションIDが存在している場合、戻り値が正常(0)で設定する。 + old_saved_endpoint.address(boost::asio::ip::address::from_string("0.0.0.0")); + new_saved_endpoint.address(boost::asio::ip::address::from_string("192.168.120.102")); + session_id = "test_id123456789abcdefghijklmnop"; + this->session_endpoint_map.clear(); + this->session_lasttime_map.clear(); + this->lasttime_session_map.clear(); + this_replication_data_processor->get_temp_list().clear(); + this->session_endpoint_map[session_id] = old_saved_endpoint; + this->session_lasttime_map[session_id] = last_time; + this->lasttime_session_map.insert(std::make_pair(last_time, session_id)); + result = this->write_session_data(session_id, new_saved_endpoint, write_time); + lasttime_session_map_iterator = this->lasttime_session_map.find(write_time); + // get the item which put into the temp_list + this_replication_data_processor->to_get_from_temp_list(temp_list_data); + // session_endpoint_map is setted check + BOOST_CHECK_EQUAL(this->session_endpoint_map[session_id], new_saved_endpoint); + // session_lasttime_map is setted check + BOOST_CHECK_EQUAL(this->session_lasttime_map[session_id], write_time); + // lasttime_session_map is setted check + BOOST_CHECK_EQUAL(lasttime_session_map_iterator->second, session_id); + BOOST_CHECK_EQUAL(this->lasttime_session_map.size(), 1u); + // function result check + BOOST_CHECK_EQUAL(result, 0); + // the item which put into the temp_list check + BOOST_CHECK_EQUAL(temp_list_data.op_code, 'U'); + BOOST_CHECK_EQUAL(temp_list_data.session_id, session_id); + BOOST_CHECK_EQUAL(temp_list_data.realserver_addr, new_saved_endpoint); + BOOST_CHECK_EQUAL(temp_list_data.last_time, write_time); + + cout << "[21]------------------------------------------" << endl; + // unit_test[21] mapにセッションIDが存在して、session_endpoint_mapのサイズがmaxlist - 1の場合、戻り値が正常(0)で設定する。 + std::string temp_session_id = "test_id2abcdefghijklmnop23456789"; + this->session_endpoint_map.clear(); + this->session_lasttime_map.clear(); + this->lasttime_session_map.clear(); + this_replication_data_processor->get_temp_list().clear(); + this->session_endpoint_map[session_id] = old_saved_endpoint; + this->session_endpoint_map[temp_session_id] = old_saved_endpoint; + this->session_lasttime_map[session_id] = last_time; + this->session_lasttime_map[temp_session_id] = last_time; + this->lasttime_session_map.insert(std::make_pair(last_time, session_id)); + this->lasttime_session_map.insert(std::make_pair(last_time, temp_session_id)); + result = this->write_session_data(session_id, new_saved_endpoint, write_time); + lasttime_session_map_iterator = this->lasttime_session_map.find(write_time); + delete_item_iterator = this->lasttime_session_map.begin(); + // get the item which put into the temp_list + this_replication_data_processor->to_get_from_temp_list(temp_list_data); + // session_endpoint_map is setted check + BOOST_CHECK_EQUAL(this->session_endpoint_map[session_id], new_saved_endpoint); + // session_lasttime_map is setted check + BOOST_CHECK_EQUAL(this->session_lasttime_map[session_id], write_time); + // lasttime_session_map is setted check + BOOST_CHECK_EQUAL(lasttime_session_map_iterator->second, session_id); + BOOST_CHECK_EQUAL(this->lasttime_session_map.size(), 2u); + for(;delete_item_iterator != this->lasttime_session_map.end(); delete_item_iterator++){ + if(delete_item_iterator->first == last_time + && delete_item_iterator->second == session_id){ + BOOST_ERROR("error: write_session_data"); + } + } + // function result check + BOOST_CHECK_EQUAL(result, 0); + // the item which put into the temp_list check + BOOST_CHECK_EQUAL(temp_list_data.op_code, 'U'); + BOOST_CHECK_EQUAL(temp_list_data.session_id, session_id); + BOOST_CHECK_EQUAL(temp_list_data.realserver_addr, new_saved_endpoint); + BOOST_CHECK_EQUAL(temp_list_data.last_time, write_time); + + cout << "[22]------------------------------------------" << endl; + // unit_test[22] mapにセッションIDが存在して、session_endpoint_mapのサイズがmaxlistの場合、戻り値が正常(0)で設定する。 + std::string temp_session_id1 = "test_idthhhffffeeeeddddffffeeeed"; + this->session_endpoint_map.clear(); + this->session_lasttime_map.clear(); + this->lasttime_session_map.clear(); + this_replication_data_processor->get_temp_list().clear(); + this->session_endpoint_map[session_id] = old_saved_endpoint; + this->session_endpoint_map[temp_session_id] = old_saved_endpoint; + this->session_endpoint_map[temp_session_id1] = old_saved_endpoint; + this->session_lasttime_map[session_id] = last_time; + this->session_lasttime_map[temp_session_id] = last_time; + this->session_lasttime_map[temp_session_id1] = last_time; + this->lasttime_session_map.insert(std::make_pair(last_time, session_id)); + this->lasttime_session_map.insert(std::make_pair(last_time, temp_session_id)); + this->lasttime_session_map.insert(std::make_pair(last_time, temp_session_id1)); + result = this->write_session_data(session_id, new_saved_endpoint, write_time); + lasttime_session_map_iterator = this->lasttime_session_map.find(write_time); + delete_item_iterator = this->lasttime_session_map.begin(); + // get the item which put into the temp_list + this_replication_data_processor->to_get_from_temp_list(temp_list_data); + // session_endpoint_map is setted check + BOOST_CHECK_EQUAL(this->session_endpoint_map[session_id], new_saved_endpoint); + // session_lasttime_map is setted check + BOOST_CHECK_EQUAL(this->session_lasttime_map[session_id], write_time); + // lasttime_session_map is setted check + BOOST_CHECK_EQUAL(lasttime_session_map_iterator->second, session_id); + BOOST_CHECK_EQUAL(this->lasttime_session_map.size(), 3u); + for(;delete_item_iterator != this->lasttime_session_map.end(); delete_item_iterator++){ + if(delete_item_iterator->first == last_time + && delete_item_iterator->second == session_id){ + BOOST_ERROR("error: write_session_data"); + } + } + // function result check + BOOST_CHECK_EQUAL(result, 0); + // the item which put into the temp_list check + BOOST_CHECK_EQUAL(temp_list_data.op_code, 'U'); + BOOST_CHECK_EQUAL(temp_list_data.session_id, session_id); + BOOST_CHECK_EQUAL(temp_list_data.realserver_addr, new_saved_endpoint); + BOOST_CHECK_EQUAL(temp_list_data.last_time, write_time); + + cout << "[23]------------------------------------------" << endl; + // unit_test[23] mapにセッションIDが存在しない、session_endpoint_mapのサイズがmaxlist - 1の場合、戻り値が正常(0)で設定する。 + this->session_endpoint_map.clear(); + this->session_lasttime_map.clear(); + this->lasttime_session_map.clear(); + this_replication_data_processor->get_temp_list().clear(); + this->session_endpoint_map.insert(std::make_pair(temp_session_id, new_saved_endpoint)); + this->session_endpoint_map.insert(std::make_pair(temp_session_id1, new_saved_endpoint)); + this->session_lasttime_map.insert(std::make_pair(temp_session_id, last_time)); + this->session_lasttime_map.insert(std::make_pair(temp_session_id1, last_time)); + this->lasttime_session_map.insert(std::make_pair(last_time, temp_session_id)); + this->lasttime_session_map.insert(std::make_pair(last_time, temp_session_id1)); + result = this->write_session_data(session_id, new_saved_endpoint, write_time); + lasttime_session_map_iterator = this->lasttime_session_map.find(write_time); + // get the item which put into the temp_list + this_replication_data_processor->to_get_from_temp_list(temp_list_data); + // session_endpoint_map is setted check + BOOST_CHECK_EQUAL(this->session_endpoint_map[session_id], new_saved_endpoint); + // session_lasttime_map is setted check + BOOST_CHECK_EQUAL(this->session_lasttime_map[session_id], write_time); + // lasttime_session_map is setted check + BOOST_CHECK_EQUAL(lasttime_session_map_iterator->second, session_id); + // function result check + BOOST_CHECK_EQUAL(result, 0); + // the item which put into the temp_list check + BOOST_CHECK_EQUAL(temp_list_data.op_code, 'A'); + BOOST_CHECK_EQUAL(temp_list_data.session_id, session_id); + BOOST_CHECK_EQUAL(temp_list_data.realserver_addr, new_saved_endpoint); + BOOST_CHECK_EQUAL(temp_list_data.last_time, write_time); + + cout << "[24]------------------------------------------" << endl; + // unit_test[24] mapにセッションIDが存在しない、session_endpoint_mapのサイズがmaxlistの場合、戻り値が正常(0)で設定する。 + std::string temp_session_id2 = "33rty567234ertgh6890sdfghbnmeeed"; + time_t earlier_time = last_time - 10; + this->timeout = 10000; + this->session_endpoint_map.clear(); + this->session_lasttime_map.clear(); + this->lasttime_session_map.clear(); + this_replication_data_processor->get_temp_list().clear(); + this->session_endpoint_map.insert(std::make_pair(temp_session_id, new_saved_endpoint)); + this->session_endpoint_map.insert(std::make_pair(temp_session_id1, new_saved_endpoint)); + this->session_endpoint_map.insert(std::make_pair(temp_session_id2, new_saved_endpoint)); + this->session_lasttime_map.insert(std::make_pair(temp_session_id, earlier_time)); + this->session_lasttime_map.insert(std::make_pair(temp_session_id1, last_time)); + this->session_lasttime_map.insert(std::make_pair(temp_session_id2, last_time)); + this->lasttime_session_map.insert(std::make_pair(earlier_time, temp_session_id)); + this->lasttime_session_map.insert(std::make_pair(last_time, temp_session_id1)); + this->lasttime_session_map.insert(std::make_pair(last_time, temp_session_id2)); + result = this->write_session_data(session_id, new_saved_endpoint, write_time); + // get the item which put into the temp_list + sslid_replication_temp_data& frist_temp_list_data = this_replication_data_processor->get_temp_list().front(); + sslid_replication_temp_data& last_temp_list_data = this_replication_data_processor->get_temp_list().back(); + lasttime_session_map_iterator = this->lasttime_session_map.find(write_time); + // session_endpoint_map is setted check + BOOST_CHECK_EQUAL(this->session_endpoint_map[session_id], new_saved_endpoint); + // session_lasttime_map is setted check + BOOST_CHECK_EQUAL(this->session_lasttime_map[session_id], write_time); + // lasttime_session_map is setted check + BOOST_CHECK_EQUAL(lasttime_session_map_iterator->second, session_id); + // function result check + BOOST_CHECK_EQUAL(result, 0); + // the item which put into the temp_list check + BOOST_CHECK_EQUAL(frist_temp_list_data.op_code, 'D'); + BOOST_CHECK_EQUAL(frist_temp_list_data.session_id, temp_session_id); + BOOST_CHECK_EQUAL(last_temp_list_data.op_code, 'A'); + BOOST_CHECK_EQUAL(last_temp_list_data.session_id, session_id); + BOOST_CHECK_EQUAL(last_temp_list_data.realserver_addr, new_saved_endpoint); + BOOST_CHECK_EQUAL(last_temp_list_data.last_time, write_time); + + cout << "[25]------------------------------------------" << endl; + // unit_test[25] mapにセッションIDが存在しない、がつ session_endpoint_mapのサイズがmaxlist、がつ clear_expired_session_data()の戻る値が1場合、 + // unit_test[25] 戻り値が正常(0)で設定する。 + clear_function_return_fail = true; + this->session_endpoint_map.clear(); + this->session_lasttime_map.clear(); + this->lasttime_session_map.clear(); + this_replication_data_processor->get_temp_list().clear(); + this->session_endpoint_map.insert(std::make_pair(temp_session_id, new_saved_endpoint)); + this->session_endpoint_map.insert(std::make_pair(temp_session_id1, new_saved_endpoint)); + this->session_endpoint_map.insert(std::make_pair(temp_session_id2, new_saved_endpoint)); + this->session_lasttime_map.insert(std::make_pair(temp_session_id, earlier_time)); + this->session_lasttime_map.insert(std::make_pair(temp_session_id1, last_time)); + this->session_lasttime_map.insert(std::make_pair(temp_session_id2, last_time)); + this->lasttime_session_map.insert(std::make_pair(earlier_time, temp_session_id)); + this->lasttime_session_map.insert(std::make_pair(last_time, temp_session_id1)); + this->lasttime_session_map.insert(std::make_pair(last_time, temp_session_id2)); + result = this->write_session_data(session_id, new_saved_endpoint, write_time); + clear_function_return_fail = false; + BOOST_CHECK_EQUAL(result, 0); + + cout << "[26]------------------------------------------" << endl; + // unit_test[26] mapにセッションIDが存在しなくて、且つsession_endpoint_mapのサイズが maxlistで1つのデータがタイムアウトの場合 + // unit_test[26] 戻り値が正常(0)で設定する。 + time_t out_of_time = time(0) - 2000; + this->timeout = 1000; + this->session_endpoint_map.clear(); + this->session_lasttime_map.clear(); + this->lasttime_session_map.clear(); + this_replication_data_processor->get_temp_list().clear(); + this->session_endpoint_map.insert(std::make_pair(temp_session_id, new_saved_endpoint)); + this->session_endpoint_map.insert(std::make_pair(temp_session_id1, new_saved_endpoint)); + this->session_endpoint_map.insert(std::make_pair(temp_session_id2, new_saved_endpoint)); + this->session_lasttime_map.insert(std::make_pair(temp_session_id, out_of_time)); + this->session_lasttime_map.insert(std::make_pair(temp_session_id1, last_time)); + this->session_lasttime_map.insert(std::make_pair(temp_session_id2, last_time)); + this->lasttime_session_map.insert(std::make_pair(out_of_time, temp_session_id)); + this->lasttime_session_map.insert(std::make_pair(last_time, temp_session_id1)); + this->lasttime_session_map.insert(std::make_pair(last_time, temp_session_id2)); + result = this->write_session_data(session_id, new_saved_endpoint, write_time); + // get the item which put into the temp_list + frist_temp_list_data = this_replication_data_processor->get_temp_list().front(); + last_temp_list_data = this_replication_data_processor->get_temp_list().back(); + lasttime_session_map_iterator = this->lasttime_session_map.find(write_time); + // session_endpoint_map is setted check + BOOST_CHECK_EQUAL(this->session_endpoint_map[session_id], new_saved_endpoint); + // session_lasttime_map is setted check + BOOST_CHECK_EQUAL(this->session_lasttime_map[session_id], write_time); + // lasttime_session_map is setted check + BOOST_CHECK_EQUAL(lasttime_session_map_iterator->second, session_id); + // function result check + BOOST_CHECK_EQUAL(result, 0); + // the item which put into the temp_list check + BOOST_CHECK_EQUAL(frist_temp_list_data.op_code, 'D'); + BOOST_CHECK_EQUAL(frist_temp_list_data.session_id, temp_session_id); + BOOST_CHECK_EQUAL(last_temp_list_data.op_code, 'A'); + BOOST_CHECK_EQUAL(last_temp_list_data.session_id, session_id); + BOOST_CHECK_EQUAL(last_temp_list_data.realserver_addr, new_saved_endpoint); + BOOST_CHECK_EQUAL(last_temp_list_data.last_time, write_time); + + cout << "[27]------------------------------------------" << endl; + // unit_test[27] mapにセッションIDが存在しなくて、且つsession_endpoint_mapのサイズが maxlistで1つのデータがタイムアウトの場合 + // unit_test[27] 戻り値が正常(0)で設定する。 + out_of_time = time(0) - 2000; + this->timeout = 1000; + this->session_endpoint_map.clear(); + this->session_lasttime_map.clear(); + this->lasttime_session_map.clear(); + this_replication_data_processor->get_temp_list().clear(); + this->session_endpoint_map.insert(std::make_pair(temp_session_id, new_saved_endpoint)); + this->session_endpoint_map.insert(std::make_pair(temp_session_id1, new_saved_endpoint)); + this->session_endpoint_map.insert(std::make_pair(temp_session_id2, new_saved_endpoint)); + this->session_lasttime_map.insert(std::make_pair(temp_session_id, out_of_time)); + this->session_lasttime_map.insert(std::make_pair(temp_session_id1, out_of_time)); + this->session_lasttime_map.insert(std::make_pair(temp_session_id2, last_time)); + this->lasttime_session_map.insert(std::make_pair(out_of_time, temp_session_id)); + this->lasttime_session_map.insert(std::make_pair(out_of_time, temp_session_id1)); + this->lasttime_session_map.insert(std::make_pair(last_time, temp_session_id2)); + result = this->write_session_data(session_id, new_saved_endpoint, write_time); + lasttime_session_map_iterator = this->lasttime_session_map.find(write_time); + // session_endpoint_map is setted check + BOOST_CHECK_EQUAL(this->session_endpoint_map[session_id], new_saved_endpoint); + // session_lasttime_map is setted check + BOOST_CHECK_EQUAL(this->session_lasttime_map[session_id], write_time); + // lasttime_session_map is setted check + BOOST_CHECK_EQUAL(lasttime_session_map_iterator->second, session_id); + // function result check + BOOST_CHECK_EQUAL(result, 0); + // the item which put into the temp_list check + int count = static_cast(this_replication_data_processor->get_temp_list().size()); + for(int i = 0; i < count; i++){ + sslid_replication_temp_data& temp_data = this_replication_data_processor->get_temp_list()[i]; + // temp_session_id and temp_session_id1 which time out are removed check + if (temp_data.session_id == temp_session_id || + temp_data.session_id == temp_session_id1) { + BOOST_CHECK_EQUAL(temp_data.op_code, 'D'); + } + if(temp_data.session_id == session_id){ + BOOST_CHECK_EQUAL(temp_data.op_code, 'A'); + BOOST_CHECK_EQUAL(temp_data.realserver_addr, new_saved_endpoint); + BOOST_CHECK_EQUAL(temp_data.last_time, write_time); + } + } + + cout << "[28]------------------------------------------" << endl; + // unit_test[28] マルチスレッドの場合、mapにデータを正常追加する + try{ + this->session_endpoint_map.clear(); + this->session_lasttime_map.clear(); + this->lasttime_session_map.clear(); + + boost::thread_group thread_group; + thread_group.create_thread(boost::bind( + &sslid_session_data_processor_test_class::write_session_data_test_thread, + this, temp_session_id, new_saved_endpoint, + write_time)); + thread_group.create_thread(boost::bind( + &sslid_session_data_processor_test_class::write_session_data_test_thread, + this, temp_session_id1, new_saved_endpoint, + write_time)); + thread_group.create_thread(boost::bind( + &sslid_session_data_processor_test_class::write_session_data_test_thread, + this, temp_session_id2, new_saved_endpoint, + write_time)); + thread_group.join_all(); + + std::map::iterator it1 = this->session_endpoint_map.begin(); + std::map::iterator it2 = this->session_lasttime_map.begin(); + std::multimap::iterator it3 = this->lasttime_session_map.begin(); + BOOST_CHECK_EQUAL(this->session_endpoint_map.size(), 3u); + BOOST_CHECK_EQUAL(this->session_lasttime_map.size(), 3u); + BOOST_CHECK_EQUAL(this->lasttime_session_map.size(), 3u); + for(; it1 != this->session_endpoint_map.end(); it1++){ + BOOST_CHECK_EQUAL(it1->second, new_saved_endpoint); + } + for(; it2 != this->session_lasttime_map.end(); it2++){ + BOOST_CHECK_EQUAL(it2->second, write_time); + } + for(; it3 != this->lasttime_session_map.end(); it3++){ + BOOST_CHECK_EQUAL(it3->first, write_time); + } + } catch(...){ + BOOST_ERROR("exception: write_session_data"); + } + + cout << "[29]------------------------------------------" << endl; + // unit_test[29] endpointがipv6で、mapにセッションIDが存在する場合、戻り値が正常(0)で設定する。 + old_saved_endpoint.address(boost::asio::ip::address::from_string("0:0:0:0:0:0:0:0")); + new_saved_endpoint.address(boost::asio::ip::address::from_string("abcd:21d0:8936:4866:eefe:567d:3a4b:1230")); + session_id = "test_id123456789abcdefghijklmnop"; + this->session_endpoint_map.clear(); + this->session_lasttime_map.clear(); + this->lasttime_session_map.clear(); + this_replication_data_processor->get_temp_list().clear(); + this->session_endpoint_map[session_id] = old_saved_endpoint; + this->session_lasttime_map[session_id] = last_time; + this->lasttime_session_map.insert(std::make_pair(last_time, session_id)); + result = this->write_session_data(session_id, new_saved_endpoint, write_time); + lasttime_session_map_iterator = this->lasttime_session_map.find(write_time); + // session_endpoint_map is setted check + BOOST_CHECK_EQUAL(this->session_endpoint_map[session_id], new_saved_endpoint); + // session_lasttime_map is setted check + BOOST_CHECK_EQUAL(this->session_lasttime_map[session_id], write_time); + // lasttime_session_map is setted check + BOOST_CHECK_EQUAL(lasttime_session_map_iterator->second, session_id); + // function result check + BOOST_CHECK_EQUAL(result, 0); + } + + // clear_expired_session_data_test + void clear_expired_session_data_test(){ + + int result = 10; + time_t test_time = time(0); + boost::asio::ip::tcp::endpoint saved_endpoint1; + boost::asio::ip::tcp::endpoint saved_endpoint2; + std::map::iterator it1; + std::map::iterator it2; + std::multimap::iterator it3; + std::string session_id1 = "test_id123456789abcdefghijklmnop"; + std::string session_id2 = "test_id2abcdefghijklmnop23456789"; + sslid_replication_data_processor_replacement *this_replication_data_processor = + dynamic_cast (this->replication_data_processor); + + cout << "[30]------------------------------------------" << endl; + // unit_test[30] mapが空の場合、戻り値が失敗(1)で設定する。 + this->timeout = 0; + this->session_endpoint_map.clear(); + this->session_lasttime_map.clear(); + this->lasttime_session_map.clear(); + try{ + result = this->clear_expired_session_data(); + } catch(...) { + BOOST_ERROR("exception: clear_expired_session_data"); + } + // function result check + BOOST_CHECK_EQUAL(result, 1); + + cout << "[31]------------------------------------------" << endl; + // unit_test[31] mapに全てのアイテムがタイムアウトの場合、全てのアイテムを削除する。 + test_time = time(0) - 5; + this->timeout = 0; + this->session_endpoint_map.clear(); + this->session_lasttime_map.clear(); + this->lasttime_session_map.clear(); + this_replication_data_processor->get_temp_list().clear(); + this->session_endpoint_map.insert(std::make_pair(session_id1, saved_endpoint1)); + this->session_endpoint_map.insert(std::make_pair(session_id2, saved_endpoint2)); + this->session_lasttime_map.insert(std::make_pair(session_id1, test_time)); + this->session_lasttime_map.insert(std::make_pair(session_id2, test_time)); + this->lasttime_session_map.insert(std::make_pair(test_time, session_id1)); + this->lasttime_session_map.insert(std::make_pair(test_time, session_id2)); + result = this->clear_expired_session_data(); + // get data which put into temp_list + sslid_replication_temp_data& first_temp_list_data = this_replication_data_processor->get_temp_list().front(); + sslid_replication_temp_data& last_temp_list_data = this_replication_data_processor->get_temp_list().back(); + // function result check + BOOST_CHECK_EQUAL(result, 0); + // session_endpoint_map items remove check + BOOST_CHECK_EQUAL(this->session_endpoint_map.size(), 0u); + // session_lasttime_map items remove check + BOOST_CHECK_EQUAL(this->session_lasttime_map.size(), 0u); + // lasttime_session_map items remove check + BOOST_CHECK_EQUAL(this->lasttime_session_map.size(), 0u); + // temp_list item check + BOOST_CHECK_EQUAL(this_replication_data_processor->get_temp_list().size(), 2u); + BOOST_CHECK_EQUAL(first_temp_list_data.op_code, 'D'); + BOOST_CHECK_EQUAL(first_temp_list_data.session_id, session_id1); + BOOST_CHECK_EQUAL(last_temp_list_data.op_code, 'D'); + BOOST_CHECK_EQUAL(last_temp_list_data.session_id, session_id2); + + cout << "[32]------------------------------------------" << endl; + // unit_test[32] mapに1つのアイテムがタイムアウトで、もう1つのアイテムがタイムアウトしない場合、タイムアウトのアイテムだけ削除する。 + saved_endpoint2.port(88); + this->timeout = 100; + test_time = time(0); + time_t out_time = test_time - 1000; + time_t not_out_time = test_time; + this->session_endpoint_map.clear(); + this->session_lasttime_map.clear(); + this->lasttime_session_map.clear(); + this_replication_data_processor->get_temp_list().clear(); + this->session_endpoint_map.insert(std::make_pair(session_id1, saved_endpoint1)); + this->session_endpoint_map.insert(std::make_pair(session_id2, saved_endpoint2)); + this->session_lasttime_map.insert(std::make_pair(session_id1, out_time)); + this->session_lasttime_map.insert(std::make_pair(session_id2, not_out_time)); + this->lasttime_session_map.insert(std::make_pair(out_time, session_id1)); + this->lasttime_session_map.insert(std::make_pair(not_out_time, session_id2)); + result = this->clear_expired_session_data(); + it1 = this->session_endpoint_map.begin(); + it2 = this->session_lasttime_map.begin(); + it3 = this->lasttime_session_map.begin(); + // get data which put into temp_list + first_temp_list_data = this_replication_data_processor->get_temp_list().front(); + // remove ruslt check(item 'test_id123456789abcdefghijklmnop' is removed, but item 'test_id2abcdefghijklmnop23456789' is still existing) + // function result check + BOOST_CHECK_EQUAL(result, 0); + // session_endpoint_map item remove check + BOOST_CHECK_EQUAL(this->session_endpoint_map.size(), 1u); + BOOST_CHECK_EQUAL(it1->first, session_id2); + BOOST_CHECK_EQUAL(it1->second, saved_endpoint2); + // session_lasttime_map item remove check + BOOST_CHECK_EQUAL(this->session_lasttime_map.size(), 1u); + BOOST_CHECK_EQUAL(it2->first, session_id2); + BOOST_CHECK_EQUAL(it2->second, not_out_time); + // lasttime_session_map item remove check + BOOST_CHECK_EQUAL(this->lasttime_session_map.size(), 1u); + BOOST_CHECK_EQUAL(it3->first, not_out_time); + BOOST_CHECK_EQUAL(it3->second, session_id2); + // temp_list item check + BOOST_CHECK_EQUAL(first_temp_list_data.op_code, 'D'); + BOOST_CHECK_EQUAL(first_temp_list_data.session_id, session_id1); + + cout << "[33]------------------------------------------" << endl; + // unit_test[33] mapに全てのアイテムがタイムアウトしない場合、一番古いアイテムを削除する。 + this->timeout = 10000; + time_t earlier_time = test_time -5; + time_t earliest_time = test_time -10; + this->session_endpoint_map.clear(); + this->session_lasttime_map.clear(); + this->lasttime_session_map.clear(); + this_replication_data_processor->get_temp_list().clear(); + this->session_endpoint_map.insert(std::make_pair(session_id1, saved_endpoint1)); + this->session_endpoint_map.insert(std::make_pair(session_id2, saved_endpoint2)); + this->session_lasttime_map.insert(std::make_pair(session_id1, earlier_time)); + this->session_lasttime_map.insert(std::make_pair(session_id2, earliest_time)); + this->lasttime_session_map.insert(std::make_pair(earlier_time, session_id1)); + this->lasttime_session_map.insert(std::make_pair(earliest_time, session_id2)); + result = this->clear_expired_session_data(); + it1 = this->session_endpoint_map.begin(); + it2 = this->session_lasttime_map.begin(); + it3 = this->lasttime_session_map.begin(); + // get data which put into temp_list + first_temp_list_data = this_replication_data_processor->get_temp_list().front(); + // remove ruslt check(item 'test_id2abcdefghijklmnop23456789' which has the earliest lasttime is removed) + // function result check + BOOST_CHECK_EQUAL(result, 0); + // session_endpoint_map item remove check + BOOST_CHECK_EQUAL(this->session_endpoint_map.size(), 1u); + BOOST_CHECK_EQUAL(it1->first, session_id1); + BOOST_CHECK_EQUAL(it1->second, saved_endpoint1); + // session_lasttime_map item remove check + BOOST_CHECK_EQUAL(this->session_lasttime_map.size(), 1u); + BOOST_CHECK_EQUAL(it2->first, session_id1); + BOOST_CHECK_EQUAL(it2->second, earlier_time); + // lasttime_session_map item remove check + BOOST_CHECK_EQUAL(this->lasttime_session_map.size(), 1u); + BOOST_CHECK_EQUAL(it3->first, earlier_time); + BOOST_CHECK_EQUAL(it3->second, session_id1); + // temp_list item check + BOOST_CHECK_EQUAL(first_temp_list_data.op_code, 'D'); + BOOST_CHECK_EQUAL(first_temp_list_data.session_id, session_id2); + + cout << "[34]------------------------------------------" << endl; + // unit_test[34] mapに全てのアイテムがタイムアウトしない場合、lasttimeが全て同じの場合、1つ目のアイテムを削除する。 + std::string session_id3 = "test_id3wasfgasdasdwasdrggrtrrrr"; + this->timeout = 10000; + this->session_endpoint_map.clear(); + this->session_lasttime_map.clear(); + this->lasttime_session_map.clear(); + this_replication_data_processor->get_temp_list().clear(); + this->session_endpoint_map.insert(std::make_pair(session_id1, saved_endpoint1)); + this->session_endpoint_map.insert(std::make_pair(session_id2, saved_endpoint1)); + this->session_endpoint_map.insert(std::make_pair(session_id3, saved_endpoint1)); + this->session_lasttime_map.insert(std::make_pair(session_id1, test_time)); + this->session_lasttime_map.insert(std::make_pair(session_id2, test_time)); + this->session_lasttime_map.insert(std::make_pair(session_id3, test_time)); + this->lasttime_session_map.insert(std::make_pair(test_time, session_id1)); + this->lasttime_session_map.insert(std::make_pair(test_time, session_id2)); + this->lasttime_session_map.insert(std::make_pair(test_time, session_id3)); + // get the first item of session_endpoint_map + it1 = this->session_endpoint_map.begin(); + std::string expecting_delete_session_id = it1->first; + result = this->clear_expired_session_data(); + // get data which put into temp_list + first_temp_list_data = this_replication_data_processor->get_temp_list().front(); + BOOST_CHECK_EQUAL(result, 0); + // session_endpoint_map item remove check + BOOST_CHECK_EQUAL(this->session_endpoint_map.size(), 2u); + // session_lasttime_map item remove check + BOOST_CHECK_EQUAL(this->session_lasttime_map.size(), 2u); + // lasttime_session_map item remove check + BOOST_CHECK_EQUAL(this->lasttime_session_map.size(), 2u); + // temp_list item check + BOOST_CHECK_EQUAL(first_temp_list_data.op_code, 'D'); + BOOST_CHECK_EQUAL(first_temp_list_data.session_id, expecting_delete_session_id); + } + + // read_session_data_from_replication_area_test + void read_session_data_from_replication_area_test(){ + + int result = 10; + unsigned short port1 = 888; + unsigned short port2 = -999; + unsigned short port3 = 333; + unsigned short port4 = 444; + unsigned short port5 = 555; + unsigned short port6 = 666; + time_t last_time1 = time(0); + time_t last_time2 = last_time1 - 10; + time_t last_time3 = last_time2 - 10; + time_t last_time4 = last_time3 - 10; + time_t last_time5 = last_time4 - 10; + time_t last_time6 = last_time5 - 10; + std::map::iterator it1; + std::map::iterator it2; + std::multimap::iterator it3; + + sslid_replication_data* first_real_data = this->replication_data_processor->get_replication_area(); + + memset(reinterpret_cast(first_real_data), 0, 10*sizeof(sslid_replication_data)); + + // set the real data area(the first data) + std::string session_id1 = "test_id123456789abcdefghijklmnop"; + std::string realserver_ip1 = "192.168.120.242"; + memcpy(first_real_data->session_id, session_id1.c_str(), session_id1.length()); + memcpy(first_real_data->realserver_ip, realserver_ip1.c_str(), realserver_ip1.length()); + first_real_data->valid = 1; + first_real_data->realserver_port = port1; + first_real_data->last_time = last_time1; + + // set the real data area(the second data) + std::string session_id2 = "test_id2abcdefghijklmnop23456789"; + std::string realserver_ip2 = "255.255.255.255"; + memcpy((first_real_data + 1)->session_id, session_id2.c_str(), session_id2.length()); + memcpy((first_real_data + 1)->realserver_ip, realserver_ip2.c_str(), realserver_ip2.length()); + (first_real_data + 1)->valid = 1; + (first_real_data + 1)->realserver_port = port2; + (first_real_data + 1)->last_time = last_time2; + + // set the real data area(the third data) + std::string session_id3 = "test_id33333333333333333333333ty"; + std::string realserver_ip3 = "202.195.0.255"; + memcpy((first_real_data + 2)->session_id, session_id3.c_str(), session_id3.length()); + memcpy((first_real_data + 2)->realserver_ip, realserver_ip3.c_str(), realserver_ip3.length()); + (first_real_data + 2)->valid = 0; + (first_real_data + 2)->realserver_port = port3; + (first_real_data + 2)->last_time = last_time3; + + // set the real data area(the fourth data) + std::string session_id4 = "test_id4444444444444444444444444"; + std::string realserver_ip4 = "110.101.0.255"; + memcpy((first_real_data + 3)->session_id, session_id4.c_str(), session_id4.length()); + memcpy((first_real_data + 3)->realserver_ip, realserver_ip4.c_str(), realserver_ip4.length()); + (first_real_data + 3)->valid = 1; + (first_real_data + 3)->realserver_port = port4; + (first_real_data + 3)->last_time = last_time4; + + // set the real data area(the fifth data) + std::string session_id5 = "test_id5555555555555555555555555"; + std::string realserver_ip5 = "120.120.0.120"; + memcpy((first_real_data + 4)->session_id, session_id5.c_str(), session_id5.length()); + memcpy((first_real_data + 4)->realserver_ip, realserver_ip5.c_str(), realserver_ip5.length()); + (first_real_data + 4)->valid = 1; + (first_real_data + 4)->realserver_port = port5; + (first_real_data + 4)->last_time = last_time5; + + // set the real data area(the sixth data) + std::string session_id6 = "00000000000000000000000000000000"; + std::string realserver_ip6 = "0.0.0.0"; + memcpy((first_real_data + 5)->session_id, session_id6.c_str(), session_id6.length()); + memcpy((first_real_data + 5)->realserver_ip, realserver_ip6.c_str(), realserver_ip6.length()); + (first_real_data + 5)->valid = 1; + (first_real_data + 5)->realserver_port = port6; + (first_real_data + 5)->last_time = last_time6; + + cout << "[35]------------------------------------------" << endl; + // unit_test[35] パラメータがNULLの場合、戻り値が異常(-1)で設定する。 + result = 10; + try { + result = this->read_session_data_from_replication_area(NULL); + } catch (...){ + BOOST_ERROR("exception: read_session_data_from_replication_area"); + } + // function result check + BOOST_CHECK_EQUAL(result, -1); + + cout << "[36]------------------------------------------" << endl; + // unit_test[36] maxlistが1で、5つデータが存在して、パラメータがfirst_real_data の場合、replicationエリアから1つ目のデータを取得する。 + result = 10; + this->maxlist = 1; + this->session_endpoint_map.clear(); + this->session_lasttime_map.clear(); + this->lasttime_session_map.clear(); + result = this->read_session_data_from_replication_area(first_real_data); + it1 = this->session_endpoint_map.begin(); + it2 = this->session_lasttime_map.begin(); + it3 = this->lasttime_session_map.begin(); + // function result check + BOOST_CHECK_EQUAL(result, 0); + // session_endpoint_map check(only maxlist(1) data can read) + BOOST_CHECK_EQUAL(this->session_endpoint_map.size(), 1u); + // session_endpoint_map's session_id check + BOOST_CHECK_EQUAL(it1->first, session_id1); + // session_endpoint_map's endpoint (ip && port) check + BOOST_CHECK_EQUAL(it1->second.address().to_string(), realserver_ip1); + BOOST_CHECK_EQUAL(it1->second.port(), port1); + // session_lasttime_map check(only maxlist(1) data can read) + BOOST_CHECK_EQUAL(this->session_lasttime_map.size(), 1u); + // session_lasttime_map's session_id check + BOOST_CHECK_EQUAL(it2->first, session_id1); + // session_lasttime_map's lasttime check + BOOST_CHECK_EQUAL(it2->second, last_time1); + // lasttime_session_map check(only maxlist(1) data can read) + BOOST_CHECK_EQUAL(this->lasttime_session_map.size(), 1u); + // lasttime_session_map's lasttime check + BOOST_CHECK_EQUAL(it3->first, last_time1); + // lasttime_session_map's session_id check + BOOST_CHECK_EQUAL(it3->second, session_id1); + + cout << "[37]------------------------------------------" << endl; + // unit_test[37] maxlistが1で、5つデータが存在して、パラメータがfirst_real_data + 1の場合、replicationエリアから2つ目のデータを取得する。 + result = 10; + this->maxlist = 1; + this->session_endpoint_map.clear(); + this->session_lasttime_map.clear(); + this->lasttime_session_map.clear(); + result = this->read_session_data_from_replication_area(first_real_data + 1); + it1 = this->session_endpoint_map.begin(); + it2 = this->session_lasttime_map.begin(); + it3 = this->lasttime_session_map.begin(); + // function result check + BOOST_CHECK_EQUAL(result, 0); + // session_endpoint_map check(only maxlist(1) data can read) + BOOST_CHECK_EQUAL(this->session_endpoint_map.size(), 1u); + // session_endpoint_map's session_id check + BOOST_CHECK_EQUAL(it1->first, session_id2); + // session_endpoint_map's endpoint (ip && port) check + BOOST_CHECK_EQUAL(it1->second.address().to_string(), realserver_ip2); + BOOST_CHECK_EQUAL(it1->second.port(), port2); + // session_lasttime_map check(only maxlist(1) data can read) + BOOST_CHECK_EQUAL(this->session_lasttime_map.size(), 1u); + // session_lasttime_map's session_id check + BOOST_CHECK_EQUAL(it2->first, session_id2); + // session_lasttime_map's lasttime check + BOOST_CHECK_EQUAL(it2->second, last_time2); + // lasttime_session_map check(only maxlist(1) data can read) + BOOST_CHECK_EQUAL(this->lasttime_session_map.size(), 1u); + // lasttime_session_map's lasttime check + BOOST_CHECK_EQUAL(it3->first, last_time2); + // lasttime_session_map's session_id check + BOOST_CHECK_EQUAL(it3->second, session_id2); + + cout << "[38]------------------------------------------" << endl; + // unit_test[38] maxlistが1で、5つデータが存在して、パラメータがfirst_real_data + 2で 、対応するvalidが0の場合, mapのサイズが0である。 + result = 10; + this->maxlist = 1; + this->session_endpoint_map.clear(); + this->session_lasttime_map.clear(); + this->lasttime_session_map.clear(); + result = this->read_session_data_from_replication_area(first_real_data + 2); + // function result check + BOOST_CHECK_EQUAL(result, 0); + // session_endpoint_map check(nothing to read) + BOOST_CHECK_EQUAL(this->session_endpoint_map.size(), 0u); + // session_lasttime_map check(nothing to read) + BOOST_CHECK_EQUAL(this->session_lasttime_map.size(), 0u); + // lasttime_session_map check(nothing to read) + BOOST_CHECK_EQUAL(this->lasttime_session_map.size(), 0u); + + cout << "[39]------------------------------------------" << endl; + // unit_test[39] maxlistが2の場合、mapに2件のデータ読み込む。 + result = 10; + this->maxlist = 2; + this->session_endpoint_map.clear(); + this->session_lasttime_map.clear(); + this->lasttime_session_map.clear(); + result = this->read_session_data_from_replication_area(first_real_data); + it1 = this->session_endpoint_map.begin(); + it2 = this->session_lasttime_map.begin(); + it3 = this->lasttime_session_map.begin(); + // function result check + BOOST_CHECK_EQUAL(result, 0); + // session_endpoint_map check(only maxlist(2) data can read) + BOOST_CHECK_EQUAL(this->session_endpoint_map.size(), 2u); + // session_lasttime_map check(only maxlist(2) data can read) + BOOST_CHECK_EQUAL(this->session_lasttime_map.size(), 2u); + // lasttime_session_map check(only maxlist(2) data can read) + BOOST_CHECK_EQUAL(this->lasttime_session_map.size(), 2u); + // session_endpoint_map items check + while(it1 != this->session_endpoint_map.end()){ + std::string temp = it1->first; + if(temp == session_id1){ + BOOST_CHECK_EQUAL(it1->second.address().to_string(), realserver_ip1); + BOOST_CHECK_EQUAL(it1->second.port(), port1); + } else if(temp == session_id2){ + BOOST_CHECK_EQUAL(it1->second.address().to_string(), realserver_ip2); + BOOST_CHECK_EQUAL(it1->second.port(), port2); + } else { + BOOST_ERROR("error: read_session_data_from_replication_area"); + } + it1++; + } + // session_lasttime_map items check + while(it2 != this->session_lasttime_map.end()){ + std::string temp = it2->first; + if(temp == session_id1){ + BOOST_CHECK_EQUAL(it2->second, last_time1); + } else if(temp == session_id2){ + BOOST_CHECK_EQUAL(it2->second, last_time2); + } else { + BOOST_ERROR("error: read_session_data_from_replication_area"); + } + it2++; + } + // lasttime_session_map items check + while(it3 != this->lasttime_session_map.end()){ + time_t temp = it3->first; + if(temp == last_time1){ + it3->second = session_id1; + } else if(temp == last_time2){ + it3->second = session_id2; + } else { + BOOST_ERROR("error: read_session_data_from_replication_area"); + } + it3++; + } + + cout << "[40]------------------------------------------" << endl; + // unit_test[40] maxlistが2で、2つ目データのvalidが0の場合、1件目のみ読み込む。 + result = 10; + this->maxlist = 2; + this->session_endpoint_map.clear(); + this->session_lasttime_map.clear(); + this->lasttime_session_map.clear(); + result = this->read_session_data_from_replication_area(first_real_data + 1); + it1 = this->session_endpoint_map.begin(); + it2 = this->session_lasttime_map.begin(); + it3 = this->lasttime_session_map.begin(); + // function result check + BOOST_CHECK_EQUAL(result, 0); + // session_endpoint_map check(only maxlist(2) data can read and if the valid is 0 not to read) + BOOST_CHECK_EQUAL(this->session_endpoint_map.size(), 1u); + // session_lasttime_map check(only maxlist(2) data can read and if the valid is 0 not to read) + BOOST_CHECK_EQUAL(this->session_lasttime_map.size(), 1u); + // lasttime_session_map check(only maxlist(2) data can read and if the valid is 0 not to read) + BOOST_CHECK_EQUAL(this->lasttime_session_map.size(), 1u); + // session_endpoint_map items check + while(it1 != this->session_endpoint_map.end()){ + std::string temp = it1->first; + if(temp == session_id2){ + BOOST_CHECK_EQUAL(it1->second.address().to_string(), realserver_ip2); + BOOST_CHECK_EQUAL(it1->second.port(), port2); + } else { + BOOST_ERROR("error: read_session_data_from_replication_area"); + } + it1++; + } + // session_lasttime_map items check + while(it2 != this->session_lasttime_map.end()){ + std::string temp = it2->first; + if(temp == session_id2){ + BOOST_CHECK_EQUAL(it2->second, last_time2); + } else { + BOOST_ERROR("error: read_session_data_from_replication_area"); + } + it2++; + } + // lasttime_session_map items check + while(it3 != this->lasttime_session_map.end()){ + time_t temp = it3->first; + if(temp == last_time2){ + it3->second = session_id2; + } else { + BOOST_ERROR("error: read_session_data_from_replication_area"); + } + it3++; + } + + cout << "[41]------------------------------------------" << endl; + // unit_test[41] maxlistが2で、1つ目データのvalidが0の場合、2件目のみ読み込む。 + result = 10; + this->maxlist = 2; + this->session_endpoint_map.clear(); + this->session_lasttime_map.clear(); + this->lasttime_session_map.clear(); + result = this->read_session_data_from_replication_area(first_real_data + 2); + it1 = this->session_endpoint_map.begin(); + it2 = this->session_lasttime_map.begin(); + it3 = this->lasttime_session_map.begin(); + // function result check + BOOST_CHECK_EQUAL(result, 0); + // session_endpoint_map check(only maxlist(2) data can read and if the valid is 0 not to read) + BOOST_CHECK_EQUAL(this->session_endpoint_map.size(), 1u); + // session_lasttime_map check(only maxlist(2) data can read and if the valid is 0 not to read) + BOOST_CHECK_EQUAL(this->session_lasttime_map.size(), 1u); + // lasttime_session_map check(only maxlist(2) data can read and if the valid is 0 not to read) + BOOST_CHECK_EQUAL(this->lasttime_session_map.size(), 1u); + // session_endpoint_map items check + while(it1 != this->session_endpoint_map.end()){ + std::string temp = it1->first; + if(temp == session_id4){ + BOOST_CHECK_EQUAL(it1->second.address().to_string(), realserver_ip4); + BOOST_CHECK_EQUAL(it1->second.port(), port4); + } else { + BOOST_ERROR("error: read_session_data_from_replication_area"); + } + it1++; + } + // session_lasttime_map items check + while(it2 != this->session_lasttime_map.end()){ + std::string temp = it2->first; + if(temp == session_id4){ + BOOST_CHECK_EQUAL(it2->second, last_time4); + } else { + BOOST_ERROR("error: read_session_data_from_replication_area"); + } + it2++; + } + // lasttime_session_map items check + while(it3 != this->lasttime_session_map.end()){ + time_t temp = it3->first; + if(temp == last_time4){ + it3->second = session_id4; + } else { + BOOST_ERROR("error: read_session_data_from_replication_area"); + } + it3++; + } + + cout << "[42]------------------------------------------" << endl; + // unit_test[42] realserverがipv6の場合、取得のipが正しいです。 + std::string realserver_ipv6_ip1 = "abcd:21d0:8936:4866:eefe:567d:3a4b:1230"; + memcpy(first_real_data->realserver_ip, realserver_ipv6_ip1.c_str(), realserver_ipv6_ip1.length()); + result = 10; + this->maxlist = 1; + this->session_endpoint_map.clear(); + this->session_lasttime_map.clear(); + this->lasttime_session_map.clear(); + result = this->read_session_data_from_replication_area(first_real_data); + // function result check + BOOST_CHECK_EQUAL(result, 0); + // session_endpoint_map's endpoint (ip && port) check + it1 = this->session_endpoint_map.begin(); + BOOST_CHECK_EQUAL(it1->second.address().to_string(), realserver_ipv6_ip1); + BOOST_CHECK_EQUAL(it1->second.port(), port1); + + cout << "[43]------------------------------------------" << endl; + // unit_test[43] session_idが"00000000000000000000000000000000"の場合、取得のデータが正しいです。 + result = 10; + this->maxlist = 1; + this->session_endpoint_map.clear(); + this->session_lasttime_map.clear(); + this->lasttime_session_map.clear(); + result = this->read_session_data_from_replication_area(first_real_data + 5); + it1 = this->session_endpoint_map.begin(); + it2 = this->session_lasttime_map.begin(); + it3 = this->lasttime_session_map.begin(); + BOOST_CHECK_EQUAL(result, 0); + // session_endpoint_map check + BOOST_CHECK_EQUAL(this->session_endpoint_map.size(), 1u); + BOOST_CHECK_EQUAL(it1->first, session_id6); + BOOST_CHECK_EQUAL(it1->second.address().to_string(), realserver_ip6); + BOOST_CHECK_EQUAL(it1->second.port(), port6); + // session_lasttime_map check(only maxlist + BOOST_CHECK_EQUAL(this->session_lasttime_map.size(), 1u); + BOOST_CHECK_EQUAL(it2->first, session_id6); + BOOST_CHECK_EQUAL(it2->second, last_time6); + // lasttime_session_map check + BOOST_CHECK_EQUAL(this->lasttime_session_map.size(), 1u); + BOOST_CHECK_EQUAL(it3->first, last_time6); + BOOST_CHECK_EQUAL(it3->second, session_id6); + } +}; + +// sslid_session_data_processor test +void sslid_session_data_processor_test(){ + + int data_area_size = 128*sizeof(struct l7vs::sslid_replication_data_header) + STRUCT_NUMBER*sizeof(struct l7vs::sslid_replication_data); + char *replication_data_area = new char[data_area_size]; + bool bret = (replication_data_area != NULL); + BOOST_REQUIRE_EQUAL(bret, true); + boost::asio::ip::tcp::endpoint virtual_service_endpoint; + memset(replication_data_area, 0, data_area_size); + l7vs::sslid_replication_data_processor replication_data_processor(3, + replication_data_area, SECTION_NUMBER, virtual_service_endpoint, + ingetloglevel1, inputLogFatal1, inputLogError1, inputLogWarn1, + inputLogInfo1, inputLogDebug1); + sslid_session_data_processor_test_class test_object(3, 5, + &replication_data_processor, ingetloglevel2, inputLogFatal2, + inputLogError2, inputLogWarn2, inputLogInfo2, inputLogDebug2); + + test_object.sslid_session_data_processor_test(3, 5, &replication_data_processor); + + delete []replication_data_area; +} + +// get_endpoint_from_session_data test +void get_endpoint_from_session_data_test(){ + + int data_area_size = 128*sizeof(struct l7vs::sslid_replication_data_header) + STRUCT_NUMBER*sizeof(struct l7vs::sslid_replication_data); + char *replication_data_area = new char[data_area_size]; + bool bret = (replication_data_area != NULL); + BOOST_REQUIRE_EQUAL(bret, true); + boost::asio::ip::tcp::endpoint virtual_service_endpoint; + + memset(replication_data_area, 0, data_area_size); + + sslid_replication_data_processor_replacement replication_data_processor(5, + replication_data_area, SECTION_NUMBER, virtual_service_endpoint, + ingetloglevel1, inputLogFatal1, inputLogError1, inputLogWarn1, + inputLogInfo1, inputLogDebug1); + sslid_session_data_processor_test_class test_object(5, 0, + &replication_data_processor, ingetloglevel2, inputLogFatal2, + inputLogError2, inputLogWarn2, inputLogInfo2, inputLogDebug2); + + test_object.get_endpoint_from_session_data_test(); + delete []replication_data_area; +} + +// write_session_data test +void write_session_data_test(){ + + int data_area_size = 128*sizeof(struct l7vs::sslid_replication_data_header) + STRUCT_NUMBER*sizeof(struct l7vs::sslid_replication_data); + char *replication_data_area = new char[data_area_size]; + bool bret = (replication_data_area != NULL); + BOOST_REQUIRE_EQUAL(bret, true); + boost::asio::ip::tcp::endpoint virtual_service_endpoint; + + memset(replication_data_area, 0, data_area_size); + + sslid_replication_data_processor_replacement replication_data_processor(3, + replication_data_area, SECTION_NUMBER, virtual_service_endpoint, + ingetloglevel1, inputLogFatal1, inputLogError1, inputLogWarn1, + inputLogInfo1, inputLogDebug1); + sslid_session_data_processor_test_class test_object(3, 0, + &replication_data_processor, ingetloglevel2, inputLogFatal2, + inputLogError2, inputLogWarn2, inputLogInfo2, inputLogDebug2); + + test_object.write_session_data_test(); + delete []replication_data_area; +} + +// clear_expired_session_data test +void clear_expired_session_data_test(){ + + int data_area_size = 128*sizeof(struct l7vs::sslid_replication_data_header) + STRUCT_NUMBER*sizeof(struct l7vs::sslid_replication_data); + char *replication_data_area = new char[data_area_size]; + bool bret = (replication_data_area != NULL); + BOOST_REQUIRE_EQUAL(bret, true); + boost::asio::ip::tcp::endpoint virtual_service_endpoint; + + memset(replication_data_area, 0, data_area_size); + + sslid_replication_data_processor_replacement replication_data_processor(2, + replication_data_area, SECTION_NUMBER, virtual_service_endpoint, + ingetloglevel1, inputLogFatal1, inputLogError1, inputLogWarn1, + inputLogInfo1, inputLogDebug1); + sslid_session_data_processor_test_class test_object(2, 0, + &replication_data_processor, ingetloglevel2, inputLogFatal2, + inputLogError2, inputLogWarn2, inputLogInfo2, inputLogDebug2); + + test_object.clear_expired_session_data_test(); + delete []replication_data_area; +} + +// read_session_data_from_replication_area test +void read_session_data_from_replication_area_test(){ + + int data_area_size = 128*sizeof(struct l7vs::sslid_replication_data_header) + STRUCT_NUMBER*sizeof(struct l7vs::sslid_replication_data); + char *replication_data_area = new char[data_area_size]; + bool bret = (replication_data_area != NULL); + BOOST_REQUIRE_EQUAL(bret, true); + boost::asio::ip::tcp::endpoint virtual_service_endpoint; + + memset(replication_data_area, 0, data_area_size); + + l7vs::sslid_replication_data_processor replication_data_processor(1, + replication_data_area, SECTION_NUMBER, virtual_service_endpoint, + ingetloglevel1, inputLogFatal1, inputLogError1, inputLogWarn1, + inputLogInfo1, inputLogDebug1); + sslid_session_data_processor_test_class test_object(1, 0, + &replication_data_processor, ingetloglevel2, inputLogFatal2, + inputLogError2, inputLogWarn2, inputLogInfo2, inputLogDebug2); + + test_object.read_session_data_from_replication_area_test(); + + delete []replication_data_area; +} + +void sslid_session_data_processor_test_main() +{ + + // create unit test suite + test_suite* ts = BOOST_TEST_SUITE( "sslid_session_data_processor" ); + + // add test case to test suite + ts->add( BOOST_TEST_CASE( &sslid_session_data_processor_test ) ); + ts->add( BOOST_TEST_CASE( &get_endpoint_from_session_data_test ) ); + ts->add( BOOST_TEST_CASE( &write_session_data_test ) ); + ts->add( BOOST_TEST_CASE( &clear_expired_session_data_test ) ); + ts->add( BOOST_TEST_CASE( &read_session_data_from_replication_area_test ) ); + + framework::master_test_suite().add( ts ); +} diff --git a/unit_tests/module_test/protocol_module_sslid_test/sslid_to_be_test_file.h b/unit_tests/module_test/protocol_module_sslid_test/sslid_to_be_test_file.h new file mode 100644 index 00000000..99c6f0d8 --- /dev/null +++ b/unit_tests/module_test/protocol_module_sslid_test/sslid_to_be_test_file.h @@ -0,0 +1,35 @@ +/* + * @file sslid_to_be_test_file.h + * @brief sslid test header file. + * + * L7VSD: Linux Virtual Server for Layer7 Load Balancing + * Copyright (C) 2009 NTT COMWARE Corporation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + **********************************************************************/ + +#ifndef SSLID_TO_BE_TEST_FILE_H_ +#define SSLID_TO_BE_TEST_FILE_H_ + +#include + +#include "../../module/protocol/ssl_protocol_module_base.cpp" +#include "../../module/protocol/sslid_replication_data_processor.cpp" +#include "../../module/protocol/sslid_session_data_processor.cpp" +#include "../../module/protocol/protocol_module_sslid.cpp" +#define THREAD_COUNT 10 +#endif /* SSLID_TO_BE_TEST_FILE_H_ */ diff --git a/unit_tests/module_test/protocol_module_sslid_test/sslid_ut.cpp b/unit_tests/module_test/protocol_module_sslid_test/sslid_ut.cpp new file mode 100644 index 00000000..5c7a555e --- /dev/null +++ b/unit_tests/module_test/protocol_module_sslid_test/sslid_ut.cpp @@ -0,0 +1,39 @@ +/* + * @file sslid_ut.cpp + * @brief sslid test main file. + * + * L7VSD: Linux Virtual Server for Layer7 Load Balancing + * Copyright (C) 2009 NTT COMWARE Corporation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + **********************************************************************/ + +#include + +#include "protocol_module_sslid_test.cpp" +#include "sslid_replication_data_processor_test.cpp" +#include "sslid_session_data_processor_test.cpp" + +test_suite* init_unit_test_suite( int argc, char* argv[] ){ + + protocol_module_sslid_test_main(); + sslid_replication_data_processor_test_main(); + sslid_session_data_processor_test_main(); + + return 0; +} + diff --git a/unit_tests/module_test/ssl_protocol_module_base_test/Makefile b/unit_tests/module_test/ssl_protocol_module_base_test/Makefile new file mode 100644 index 00000000..0b4cd383 --- /dev/null +++ b/unit_tests/module_test/ssl_protocol_module_base_test/Makefile @@ -0,0 +1,36 @@ +# +# +# Makefile for sslid unit test frameworks. +# +# +TARGET = sslid_ut +CPP = g++ +CPPFLAGS = -g -Wall -Werror -pthread -O0 -DMAX_BUFFER_SIZE=65535 +INCLUDES = -I../../../include \ + -I../../../logger \ + -I../../../module/protocol + +LIBS = -lboost_system-gcc41-mt \ + -lboost_thread-gcc41-mt \ + -lboost_unit_test_framework-gcc41-mt + +LDFLAGS = -lrt -ldl + +SRCS = sslid_ut.cpp + +OBJS = $(SRCS:.cpp=.o) + +all: $(TARGET) + +$(TARGET): $(OBJS) + @$(CPP) $(INCLUDES) -o $@ $(OBJS) $(LIBS) + @echo "make all done!(^_^)" + +clean: + @echo "clean...(>_<)" + @rm -f $(TARGET) $(OBJS) *.o + @echo "clean done!" + +.cpp.o: + @$(CPP) $(CPPFLAGS) $(INCLUDES) -c $< + diff --git a/unit_tests/module_test/ssl_protocol_module_base_test/ssl_protocol_module_base_test.cpp b/unit_tests/module_test/ssl_protocol_module_base_test/ssl_protocol_module_base_test.cpp new file mode 100644 index 00000000..99e4ea29 --- /dev/null +++ b/unit_tests/module_test/ssl_protocol_module_base_test/ssl_protocol_module_base_test.cpp @@ -0,0 +1,1867 @@ +/* + * @file ssl_protocol_module_base_test.cpp + * @brief ssl protocol module base test file. + * + * L7VSD: Linux Virtual Server for Layer7 Load Balancing + * Copyright (C) 2009 NTT COMWARE Corporation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + **********************************************************************/ + +#include "sslid_to_be_test_file.h" + +using namespace std; +using namespace boost; +using namespace boost::unit_test; +using namespace l7vs; + +class ssl_protocol_module_base_test_class: public ssl_protocol_module_base { +public: + ssl_protocol_module_base_test_class() : ssl_protocol_module_base("sslid") { + } + + ~ssl_protocol_module_base_test_class() { + } + + bool is_tcp() { + return true; + } + + bool is_udp() { + return false; + } + + void replication_interrupt() { + } + + void initialize(rs_list_itr_func_type inlist_begin, + rs_list_itr_func_type inlist_end, + rs_list_itr_next_func_type inlist_next, + boost::function inlist_lock, + boost::function inlist_unlock) { + } + + void finalize() { + } + + bool is_use_sorry() { + return false; + } + + void handle_rslist_update() { + } + + check_message_result check_parameter(const std::vector& args) { + check_message_result result; + return result; + } + + check_message_result set_parameter(const std::vector& args) { + check_message_result result; + return result; + } + + check_message_result add_parameter(const std::vector& args) { + check_message_result result; + return result; + } + + void register_schedule(tcp_schedule_func_type inschedule) { + } + + void register_schedule(udp_schedule_func_type inschedule) { + } + + EVENT_TAG handle_session_initialize(const boost::thread::id up_thread_id, + const boost::thread::id down_thread_id, + const boost::asio::ip::tcp::endpoint& client_endpoint_tcp, + const boost::asio::ip::udp::endpoint& client_endpoint_udp) { + return STOP; + } + + EVENT_TAG handle_session_finalize(const boost::thread::id up_thread_id, + const boost::thread::id down_thread_id) { + return STOP; + } + + EVENT_TAG handle_accept(const boost::thread::id thread_id) { + return STOP; + } + + EVENT_TAG handle_client_recv(const boost::thread::id thread_id, + const boost::array& recvbuffer, + const size_t recvlen) { + return STOP; + } + + EVENT_TAG handle_realserver_select(const boost::thread::id thread_id, + boost::asio::ip::tcp::endpoint& rs_endpoint) { + return STOP; + } + + EVENT_TAG handle_realserver_select(const boost::thread::id thread_id, + boost::asio::ip::udp::endpoint& rs_endpoint, + boost::array& sendbuffer, + size_t& datalen) { + return STOP; + } + + EVENT_TAG handle_realserver_connect(const boost::thread::id thread_id, + boost::array& sendbuffer, + size_t& datalen) { + return STOP; + } + + EVENT_TAG handle_realserver_connection_fail(const boost::thread::id thread_id, + const boost::asio::ip::tcp::endpoint& rs_endpoint) { + return STOP; + } + + EVENT_TAG handle_realserver_send(const boost::thread::id thread_id) { + return STOP; + } + + EVENT_TAG handle_sorryserver_select(const boost::thread::id thread_id, + boost::asio::ip::tcp::endpoint& sorry_endpoint) { + return STOP; + } + + EVENT_TAG handle_sorryserver_connect(const boost::thread::id thread_id, + boost::array& sendbuffer, + size_t& datalen) { + return STOP; + } + + EVENT_TAG handle_sorryserver_connection_fail(const boost::thread::id thread_id, + const boost::asio::ip::tcp::endpoint& sorry_endpoint) { + return STOP; + } + + EVENT_TAG handle_sorryserver_send(const boost::thread::id thread_id) { + return STOP; + } + + EVENT_TAG handle_realserver_recv(const boost::thread::id thread_id, + const boost::asio::ip::tcp::endpoint& rs_endpoint, + const boost::array& recvbuffer, + const size_t recvlen) { + return STOP; + } + + EVENT_TAG handle_realserver_recv(const boost::thread::id thread_id, + const boost::asio::ip::udp::endpoint& rs_endpoint, + const boost::array& recvbuffer, + const size_t recvlen) { + return STOP; + } + + EVENT_TAG handle_sorryserver_recv(const boost::thread::id thread_id, + const boost::asio::ip::tcp::endpoint& sorry_endpoint, + const boost::array& recvbuffer, + const size_t recvlen) { + return STOP; + } + + EVENT_TAG handle_response_send_inform(const boost::thread::id thread_id) { + return STOP; + } + + EVENT_TAG handle_client_connection_check(const boost::thread::id thread_id, + boost::array& sendbuffer, + size_t& datalen) { + return STOP; + } + + EVENT_TAG handle_client_select(const boost::thread::id thread_id, + boost::asio::ip::udp::endpoint& cl_endpoint, + boost::array& sendbuffer, + size_t& datalen) { + return STOP; + } + + EVENT_TAG handle_client_send(const boost::thread::id thread_id) { + return STOP; + } + + EVENT_TAG handle_client_disconnect(const boost::thread::id thread_id) { + return STOP; + } + + EVENT_TAG handle_sorry_enable(const boost::thread::id thread_id) { + return STOP; + } + + EVENT_TAG handle_sorry_disable(const boost::thread::id thread_id) { + return STOP; + } + + EVENT_TAG handle_realserver_disconnect(const boost::thread::id thread_id, + const boost::asio::ip::tcp::endpoint& rs_endpoint) { + return STOP; + } + + EVENT_TAG handle_sorryserver_disconnect(const boost::thread::id thread_id, + const boost::asio::ip::tcp::endpoint& sorry_endpoint) { + return STOP; + } + + EVENT_TAG handle_realserver_close(const boost::thread::id thread_id, + const boost::asio::ip::udp::endpoint& rs_endpoint) { + return STOP; + } + + //get_ssl_session_id + void get_ssl_session_id_test() { + + std::string session_id; + int ret = 0; + char *record_data; + + cout << "[1]------------------------------------------" << endl; + // unit_test[1] recv_length が 0で, 且つrecord_data が NULLの場合 + // unit_test[1] 戻り値が-1(error)で設定する。 + record_data = NULL; + ret = this->get_ssl_session_id(NULL, 0, session_id); + BOOST_CHECK_EQUAL(ret, -1); + + cout << "[2]------------------------------------------" << endl; + // unit_test[2] recv_length が HELLO_MSG_HEADER_LENGTHで, 且つrecord_data != NULLの場合 + // unit_test[2] 戻り値が0で設定する。 + record_data = new char[HELLO_MSG_HEADER_LENGTH]; + record_data[SESSION_ID_BEGAIN_OFFSET-1] = 0x20; + ret = this->get_ssl_session_id(record_data, HELLO_MSG_HEADER_LENGTH, session_id); + BOOST_CHECK_EQUAL(ret, 0); + delete[] record_data; + + cout << "[3]------------------------------------------" << endl; + // unit_test[3] recv_length が HELLO_MSG_HEADER_LENGTHで, 且つrecord_data != NULLの場合 + // unit_test[3] 戻り値が1で設定する。 + record_data = new char[HELLO_MSG_HEADER_LENGTH]; + record_data[SESSION_ID_BEGAIN_OFFSET-1] = 0x00; + ret = this->get_ssl_session_id(record_data, HELLO_MSG_HEADER_LENGTH, session_id); + BOOST_CHECK_EQUAL(ret, 1); + delete[] record_data; + + cout << "[4]------------------------------------------" << endl; + // unit_test[4] recv_length > HELLO_MSG_HEADER_LENGTHで, 且つrecord_data != NULLの場合 + // unit_test[4] 戻り値が0で設定する。 + record_data = new char[HELLO_MSG_HEADER_LENGTH+1]; + record_data[SESSION_ID_BEGAIN_OFFSET-1] = 0x20; + ret = this->get_ssl_session_id(record_data, HELLO_MSG_HEADER_LENGTH+1, session_id); + BOOST_CHECK_EQUAL(ret, 0); + delete[] record_data; + + cout << "[5]------------------------------------------" << endl; + // unit_test[5] recv_length > HELLO_MSG_HEADER_LENGTHで, 且つrecord_data != NULLの場合 + // unit_test[5] 戻り値が1で設定する。 + record_data = new char[HELLO_MSG_HEADER_LENGTH+1]; + record_data[SESSION_ID_BEGAIN_OFFSET-1] = 0x00; + ret = this->get_ssl_session_id(record_data, HELLO_MSG_HEADER_LENGTH+1, session_id); + BOOST_CHECK_EQUAL(ret, 1); + delete[] record_data; + } + + //check_ssl_record_sendable + void check_ssl_record_sendable_test() { + + bool is_message_from_client; + char* record_data; + size_t recv_length; + size_t all_length; + bool is_hello_message; + int ret; + + cout << "[6]------------------------------------------" << endl; + // unit_test[6] recv_length が 0で, 且つrecord_data が NULLで, 且つis_message_from_client が falseの場合 + // unit_test[6] 戻り値が-1(error)で設定する。 + recv_length = 0u; + record_data = NULL; + is_message_from_client = false; + ret = this->check_ssl_record_sendable(is_message_from_client, + record_data, recv_length, all_length, is_hello_message); + BOOST_CHECK_EQUAL(ret, -1); + + cout << "[7]------------------------------------------" << endl; + // unit_test[7] 0 < recv_length < 6で, 且つrecord_data != NULLで, 且つis_message_from_client が falseの場合 + // unit_test[7] 戻り値が1(送信不可)で設定する。 + recv_length = 5u; + record_data = new char[recv_length]; + is_message_from_client = false; + is_hello_message = true; + ret = this->check_ssl_record_sendable(is_message_from_client, + record_data, recv_length, all_length, is_hello_message); + BOOST_CHECK(!is_hello_message); + BOOST_CHECK_EQUAL(ret, 1); + delete[] record_data; + + cout << "[8]------------------------------------------" << endl; + // unit_test[8] recv_length < 6で, 且つrecord_data != NULLで, 且つis_message_from_client が trueの場合 + // unit_test[8] 戻り値が1(送信不可)で設定する。 + recv_length = 5u; + record_data = new char[recv_length]; + is_message_from_client = true; + is_hello_message = true; + ret = this->check_ssl_record_sendable(is_message_from_client, + record_data, recv_length, all_length, is_hello_message); + BOOST_CHECK(!is_hello_message); + BOOST_CHECK_EQUAL(ret, 1); + delete[] record_data; + + cout << "[9]------------------------------------------" << endl; + // unit_test[9] recv_length が 6で, 且つrecord_data != NULLで, 且つis_message_from_client が trueの場合 + // unit_test[9] 戻り値が-1(異常)で設定する。 + recv_length = 6u; + record_data = new char[recv_length]; + record_data[0] = 0x00; + is_message_from_client = true; + is_hello_message = true; + ret = this->check_ssl_record_sendable(is_message_from_client, + record_data, recv_length, all_length, is_hello_message); + BOOST_CHECK(!is_hello_message); + BOOST_CHECK_EQUAL(ret, -1); + delete[] record_data; + + cout << "[10]------------------------------------------" << endl; + // unit_test[10] recv_length が 6で, 且つrecord_data != NULLで, 且つis_message_from_client が falseの場合 + // unit_test[10] 戻り値が-1(異常)で設定する。 + recv_length = 6u; + record_data = new char[recv_length]; + record_data[0] = 0x00; + is_message_from_client = false; + is_hello_message = true; + ret = this->check_ssl_record_sendable(is_message_from_client, + record_data, recv_length, all_length, is_hello_message); + BOOST_CHECK(!is_hello_message); + BOOST_CHECK_EQUAL(ret, -1); + delete[] record_data; + + cout << "[11]------------------------------------------" << endl; + // unit_test[11] recv_length が 6で, 且つis_message_from_client が trueで, record_dataがsslレコード(最小サイズ)で、且つhello messageでない場合 + // unit_test[11] 戻り値が0(送信可能)で設定する。 + recv_length = 6u; + record_data = new char[recv_length]; + record_data[0] = 0x17; + record_data[1] = 0x03; + record_data[2] = 0x01; + record_data[3] = 0x00; + record_data[4] = 0x9e; + record_data[5] = 0x00; + all_length = 0u; + is_message_from_client = true; + is_hello_message = true; + ret = this->check_ssl_record_sendable(is_message_from_client, + record_data, recv_length, all_length, is_hello_message); + BOOST_CHECK_EQUAL(all_length, 163u); + BOOST_CHECK(!is_hello_message); + BOOST_CHECK_EQUAL(ret, 0); + delete[] record_data; + + cout << "[12]------------------------------------------" << endl; + // unit_test[12] recv_length が 6で, 且つis_message_from_client が trueで, record_dataがsslレコード(最小サイズ)で、且つhello messageでない場合 + // unit_test[12] 戻り値が0(送信可能)で設定する。 + recv_length = 6u; + record_data = new char[recv_length]; + record_data[0] = 0x14; + record_data[1] = 0x03; + record_data[2] = 0x01; + record_data[3] = 0x00; + record_data[4] = 0x9e; + record_data[5] = 0x00; + all_length = 0u; + is_message_from_client = true; + is_hello_message = true; + ret = this->check_ssl_record_sendable(is_message_from_client, + record_data, recv_length, all_length, is_hello_message); + BOOST_CHECK_EQUAL(all_length, 163u); + BOOST_CHECK(!is_hello_message); + BOOST_CHECK_EQUAL(ret, 0); + delete[] record_data; + + cout << "[13]------------------------------------------" << endl; + // unit_test[13] recv_length が 6で, 且つis_message_from_client が trueで, record_dataがsslレコード(最小サイズ)で、且つhello messageでない場合 + // unit_test[13] 戻り値が0(送信可能)で設定する。 + recv_length = 6u; + record_data = new char[recv_length]; + record_data[0] = 0x15; + record_data[1] = 0x03; + record_data[2] = 0x01; + record_data[3] = 0x00; + record_data[4] = 0x9e; + record_data[5] = 0x00; + all_length = 0u; + is_message_from_client = true; + is_hello_message = true; + ret = this->check_ssl_record_sendable(is_message_from_client, + record_data, recv_length, all_length, is_hello_message); + BOOST_CHECK_EQUAL(all_length, 163u); + BOOST_CHECK(!is_hello_message); + BOOST_CHECK_EQUAL(ret, 0); + delete[] record_data; + + cout << "[14]------------------------------------------" << endl; + // unit_test[14] recv_length が 6で, 且つis_message_from_client が falseで, record_dataがsslレコード(最小サイズ)で、且つhello messageでない場合 + // unit_test[14] 戻り値が0(送信可能)で設定する。 + recv_length = 6u; + record_data = new char[recv_length]; + record_data[0] = 0x17; + record_data[1] = 0x03; + record_data[2] = 0x01; + record_data[3] = 0x00; + record_data[4] = 0x9e; + record_data[5] = 0x00; + all_length = 0u; + is_message_from_client = false; + is_hello_message = true; + ret = this->check_ssl_record_sendable(is_message_from_client, + record_data, recv_length, all_length, is_hello_message); + BOOST_CHECK_EQUAL(all_length, 163u); + BOOST_CHECK(!is_hello_message); + BOOST_CHECK_EQUAL(ret, 0); + delete[] record_data; + + cout << "[15]------------------------------------------" << endl; + // unit_test[15] recv_length が 6で, 且つis_message_from_client が trueで, record_dataがsslレコード(最小サイズ)で、且つhello messageでない場合 + // unit_test[15] 戻り値が0(送信可能)で設定する。 + recv_length = 6u; + record_data = new char[recv_length]; + record_data[0] = 0x17; + record_data[1] = 0x03; + record_data[2] = 0x00; + record_data[3] = 0x00; + record_data[4] = 0x9e; + record_data[5] = 0x00; + all_length = 0u; + is_message_from_client = true; + is_hello_message = true; + ret = this->check_ssl_record_sendable(is_message_from_client, + record_data, recv_length, all_length, is_hello_message); + BOOST_CHECK_EQUAL(all_length, 163u); + BOOST_CHECK(!is_hello_message); + BOOST_CHECK_EQUAL(ret, 0); + delete[] record_data; + + cout << "[16]------------------------------------------" << endl; + // unit_test[16] recv_length が 6で, 且つis_message_from_client が falseで, record_dataがsslレコード(最小サイズ)で、且つhello messageでない場合 + // unit_test[16] 戻り値が0(送信可能)で設定する + recv_length = 6u; + record_data = new char[recv_length]; + record_data[0] = 0x17; + record_data[1] = 0x03; + record_data[2] = 0x00; + record_data[3] = 0x00; + record_data[4] = 0x9e; + record_data[5] = 0x00; + all_length = 0u; + is_message_from_client = false; + is_hello_message = true; + ret = this->check_ssl_record_sendable(is_message_from_client, + record_data, recv_length, all_length, is_hello_message); + BOOST_CHECK_EQUAL(all_length, 163u); + BOOST_CHECK(!is_hello_message); + BOOST_CHECK_EQUAL(ret, 0); + delete[] record_data; + + cout << "[17]------------------------------------------" << endl; + // unit_test[17] recv_length が 6で, 且つis_message_from_client が trueで ,record_dataがsslレコード(最小サイズ)で、且つhello messageの場合 + // unit_test[17] 戻り値が1(送信不可)で設定する。 + recv_length = 6u; + record_data = new char[recv_length]; + record_data[0] = 0x16; + record_data[1] = 0x03; + record_data[2] = 0x01; + record_data[3] = 0x00; + record_data[4] = 0x9e; + record_data[5] = 0x01; + is_hello_message = true; + is_message_from_client = true; + ret = this->check_ssl_record_sendable(is_message_from_client, + record_data, recv_length, all_length, is_hello_message); + BOOST_CHECK(!is_hello_message); + BOOST_CHECK_EQUAL(ret, 1); + delete[] record_data; + + cout << "[18]------------------------------------------" << endl; + // unit_test[18] recv_length が 6で, 且つis_message_from_client が falseで ,record_dataがsslレコード(最小サイズ)で、且つhello messageの場合 + // unit_test[18] 戻り値が1(送信不可)で設定する。 + recv_length = 6u; + record_data = new char[recv_length]; + record_data[0] = 0x16; + record_data[1] = 0x03; + record_data[2] = 0x01; + record_data[3] = 0x00; + record_data[4] = 0x9e; + record_data[5] = 0x01; + is_hello_message = true; + is_message_from_client = false; + ret = this->check_ssl_record_sendable(is_message_from_client, + record_data, recv_length, all_length, is_hello_message); + BOOST_CHECK(!is_hello_message); + BOOST_CHECK_EQUAL(ret, 1); + delete[] record_data; + + cout << "[19]------------------------------------------" << endl; + // unit_test[19] recv_length が 6で, 且つis_message_from_client が trueで ,record_dataがsslレコード(最小サイズ)で、且つhello messageの場合 + // unit_test[19] 戻り値が1(送信不可)で設定する。 + recv_length = 6u; + record_data = new char[recv_length]; + record_data[0] = 0x16; + record_data[1] = 0x03; + record_data[2] = 0x00; + record_data[3] = 0x00; + record_data[4] = 0x9e; + record_data[5] = 0x02; + is_hello_message = true; + is_message_from_client = true; + ret = this->check_ssl_record_sendable(is_message_from_client, + record_data, recv_length, all_length, is_hello_message); + BOOST_CHECK(!is_hello_message); + BOOST_CHECK_EQUAL(ret, 1); + delete[] record_data; + + cout << "[20]------------------------------------------" << endl; + // unit_test[20] recv_length が 6で, 且つis_message_from_client が falseで ,record_dataがsslレコード(最小サイズ)で、且つhello messageの場合 + // unit_test[20] 戻り値が1(送信不可)で設定する。 + recv_length = 6u; + record_data = new char[recv_length]; + record_data[0] = 0x16; + record_data[1] = 0x03; + record_data[2] = 0x00; + record_data[3] = 0x00; + record_data[4] = 0x9e; + record_data[5] = 0x02; + is_hello_message = true; + is_message_from_client = false; + ret = this->check_ssl_record_sendable(is_message_from_client, + record_data, recv_length, all_length, is_hello_message); + BOOST_CHECK(!is_hello_message); + BOOST_CHECK_EQUAL(ret, 1); + delete[] record_data; + + cout << "[21]------------------------------------------" << endl; + // unit_test[21] recv_length > 6で, 且つis_message_from_client が trueで,record_dataがsslレコードでない場合 + // unit_test[21] 戻り値が-1(異常)で設定する。 + recv_length = 10u; + record_data = new char[recv_length]; + record_data[0] = 0x00; + is_hello_message = true; + is_message_from_client = true; + ret = this->check_ssl_record_sendable(is_message_from_client, + record_data, recv_length, all_length, is_hello_message); + BOOST_CHECK(!is_hello_message); + BOOST_CHECK_EQUAL(ret, -1); + delete[] record_data; + + cout << "[22]------------------------------------------" << endl; + // unit_test[22] recv_length > 6で, 且つis_message_from_client が falseで,record_dataがsslレコードでない場合 + // unit_test[22] 戻り値が-1(異常)で設定する + recv_length = 10u; + record_data = new char[recv_length]; + record_data[0] = 0x00; + is_hello_message = true; + is_message_from_client = false; + ret = this->check_ssl_record_sendable(is_message_from_client, + record_data, recv_length, all_length, is_hello_message); + BOOST_CHECK(!is_hello_message); + BOOST_CHECK_EQUAL(ret, -1); + delete[] record_data; + + cout << "[23]------------------------------------------" << endl; + // unit_test[23] recv_length > 6で, 且つis_message_from_client が trueで ,record_dataがsslレコードで、且つhello messageでない場合 + // unit_test[23] 戻り値が0(送信可能)で設定する。 + recv_length = 10u; + record_data = new char[recv_length]; + record_data[0] = 0x17; + record_data[1] = 0x03; + record_data[2] = 0x01; + record_data[3] = 0x00; + record_data[4] = 0x9e; + record_data[5] = 0x00; + is_hello_message = true; + is_message_from_client = true; + all_length = 0u; + ret = this->check_ssl_record_sendable(is_message_from_client, + record_data, recv_length, all_length, is_hello_message); + BOOST_CHECK(!is_hello_message); + BOOST_CHECK_EQUAL(ret, 0); + delete[] record_data; + + cout << "[24]------------------------------------------" << endl; + // unit_test[24] recv_length > 6で, 且つis_message_from_client が falseで,record_dataがsslレコードで、且つhello messageでない場合 + // unit_test[24] 戻り値が0(送信可能)で設定する。 + recv_length = 10u; + record_data = new char[recv_length]; + record_data[0] = 0x17; + record_data[1] = 0x03; + record_data[2] = 0x01; + record_data[3] = 0x00; + record_data[4] = 0x9e; + record_data[5] = 0x00; + is_hello_message = true; + is_message_from_client = false; + all_length = 0u; + ret = this->check_ssl_record_sendable(is_message_from_client, + record_data, recv_length, all_length, is_hello_message); + BOOST_CHECK(!is_hello_message); + BOOST_CHECK_EQUAL(ret, 0); + delete[] record_data; + + cout << "[25]------------------------------------------" << endl; + // unit_test[25] recv_length > 6で, 且つis_message_from_client が trueで, record_dataがsslレコードで、且つhello messageでない場合 + // unit_test[25] 戻り値が0(送信可能)で設定する。 + recv_length = 10u; + record_data = new char[recv_length]; + record_data[0] = 0x17; + record_data[1] = 0x03; + record_data[2] = 0x00; + record_data[3] = 0x00; + record_data[4] = 0x9e; + record_data[5] = 0x00; + is_hello_message = true; + is_message_from_client = true; + all_length = 0u; + ret = this->check_ssl_record_sendable(is_message_from_client, + record_data, recv_length, all_length, is_hello_message); + BOOST_CHECK(!is_hello_message); + BOOST_CHECK_EQUAL(ret, 0); + delete[] record_data; + + cout << "[26]------------------------------------------" << endl; + // unit_test[26] recv_length > 6で, 且つis_message_from_client が falseで, record_dataがsslレコードで、且つhello messageでない場合 + // unit_test[26] 戻り値が0(送信可能)で設定する。 + recv_length = 10u; + record_data = new char[recv_length]; + record_data[0] = 0x17; + record_data[1] = 0x03; + record_data[2] = 0x00; + record_data[3] = 0x00; + record_data[4] = 0x9e; + record_data[5] = 0x00; + is_hello_message = true; + is_message_from_client = false; + all_length = 0u; + ret = this->check_ssl_record_sendable(is_message_from_client, + record_data, recv_length, all_length, is_hello_message); + BOOST_CHECK(!is_hello_message); + BOOST_CHECK_EQUAL(ret, 0); + delete[] record_data; + + cout << "[27]------------------------------------------" << endl; + // unit_test[27] recv_length > 6で, 且つrecv_length < HELLO_MSG_HEADER_LENGTHで, 且つis_message_from_clientが trueで,record_dataがsslレコードで、且つhello messageの場合 + // unit_test[27] 戻り値が1(送信不可)で設定する。 + recv_length = 10u; + record_data = new char[recv_length]; + record_data[0] = 0x16; + record_data[1] = 0x03; + record_data[2] = 0x01; + record_data[3] = 0x00; + record_data[4] = 0x9e; + record_data[5] = 0x01; + is_hello_message = true; + is_message_from_client = true; + ret = this->check_ssl_record_sendable(is_message_from_client, + record_data, recv_length, all_length, is_hello_message); + BOOST_CHECK(!is_hello_message); + BOOST_CHECK_EQUAL(ret, 1); + delete[] record_data; + + cout << "[28]------------------------------------------" << endl; + // unit_test[28] recv_length > 6で, 且つrecv_length < HELLO_MSG_HEADER_LENGTHで, 且つis_message_from_clientが falseで,record_dataがsslレコードで、且つhello messageの場合 + // unit_test[28] 戻り値が1(送信不可)で設定する。 + recv_length = 10u; + record_data = new char[recv_length]; + record_data[0] = 0x16; + record_data[1] = 0x03; + record_data[2] = 0x01; + record_data[3] = 0x00; + record_data[4] = 0x9e; + record_data[5] = 0x01; + is_hello_message = true; + is_message_from_client = false; + ret = this->check_ssl_record_sendable(is_message_from_client, + record_data, recv_length, all_length, is_hello_message); + BOOST_CHECK(!is_hello_message); + BOOST_CHECK_EQUAL(ret, 1); + delete[] record_data; + + cout << "[29]------------------------------------------" << endl; + // unit_test[29] recv_length > 6で, 且つrecv_length < HELLO_MSG_HEADER_LENGTHで, 且つis_message_from_client が falseで,record_dataがsslレコードで、且つhello messageの場合 + // unit_test[29] 戻り値が1(送信不可)で設定する。 + recv_length = 10u; + record_data = new char[recv_length]; + record_data[0] = 0x16; + record_data[1] = 0x03; + record_data[2] = 0x00; + record_data[3] = 0x00; + record_data[4] = 0x9e; + record_data[5] = 0x01; + is_message_from_client = false; + is_hello_message = true; + ret = this->check_ssl_record_sendable(is_message_from_client, + record_data, recv_length, all_length, is_hello_message); + BOOST_CHECK(!is_hello_message); + BOOST_CHECK_EQUAL(ret, 1); + delete[] record_data; + + cout << "[30]------------------------------------------" << endl; + // unit_test[30] recv_length > 6で, 且つrecv_length < HELLO_MSG_HEADER_LENGTHで, 且つis_message_from_client が trueで, record_dataがsslレコードで、且つhello messageの場合 + // unit_test[30] 戻り値が1(送信不可)で設定する。 + recv_length = 10u; + record_data = new char[recv_length]; + record_data[0] = 0x16; + record_data[1] = 0x03; + record_data[2] = 0x00; + record_data[3] = 0x00; + record_data[4] = 0x9e; + record_data[5] = 0x01; + is_hello_message = true; + is_message_from_client = true; + ret = this->check_ssl_record_sendable(is_message_from_client, + record_data, recv_length, all_length, is_hello_message); + BOOST_CHECK(!is_hello_message); + BOOST_CHECK_EQUAL(ret, 1); + delete[] record_data; + + cout << "[31]------------------------------------------" << endl; + // unit_test[31] recv_length が HELLO_MSG_HEADER_LENGTHで,且つis_message_from_client が trueで, record_dataがsslレコードで,誤りのhello messageの場合 + // unit_test[31] 戻り値が-1(異常)で設定する。 + recv_length = HELLO_MSG_HEADER_LENGTH; + record_data = new char[recv_length]; + record_data[0] = 0x16; + record_data[1] = 0x03; + record_data[2] = 0x01; + record_data[3] = 0x00; + record_data[4] = 0x9e; + record_data[5] = 0x01; + record_data[9] = 0x00; + record_data[10] = 0x00; + record_data[43] = 0x20; + is_hello_message = true; + is_message_from_client = true; + ret = this->check_ssl_record_sendable(is_message_from_client, + record_data, recv_length, all_length, is_hello_message); + BOOST_CHECK(!is_hello_message); + BOOST_CHECK_EQUAL(ret, -1); + delete[] record_data; + + cout << "[32]------------------------------------------" << endl; + // unit_test[32] recv_length が HELLO_MSG_HEADER_LENGTHで, 且つis_message_from_client が falseで,record_dataがsslレコードで,誤りのhello messageの場合 + // unit_test[32] 戻り値が-1(異常)で設定する。 + recv_length = HELLO_MSG_HEADER_LENGTH; + record_data = new char[recv_length]; + record_data[0] = 0x16; + record_data[1] = 0x03; + record_data[2] = 0x01; + record_data[3] = 0x00; + record_data[4] = 0x9e; + record_data[5] = 0x01; + record_data[9] = 0x00; + record_data[10] = 0x00; + record_data[43] = 0x20; + is_hello_message = true; + is_message_from_client = false; + ret = this->check_ssl_record_sendable(is_message_from_client, + record_data, recv_length, all_length, is_hello_message); + BOOST_CHECK(!is_hello_message); + BOOST_CHECK_EQUAL(ret, -1); + delete[] record_data; + + cout << "[33]------------------------------------------" << endl; + // unit_test[33] recv_length が HELLO_MSG_HEADER_LENGTHで, 且つrecord_dataがsslレコードで,誤りのhello messageの場合 + // unit_test[33] 戻り値が-1(異常)で設定する。 + recv_length = HELLO_MSG_HEADER_LENGTH; + record_data = new char[recv_length]; + record_data[0] = 0x16; + record_data[1] = 0x03; + record_data[2] = 0x00; + record_data[3] = 0x00; + record_data[4] = 0x9e; + record_data[5] = 0x01; + record_data[9] = 0x00; + record_data[10] = 0x00; + record_data[43] = 0x20; + is_hello_message = true; + ret = this->check_ssl_record_sendable(is_message_from_client, + record_data, recv_length, all_length, is_hello_message); + BOOST_CHECK(!is_hello_message); + BOOST_CHECK_EQUAL(ret, -1); + delete[] record_data; + + cout << "[34]------------------------------------------" << endl; + // unit_test[34] recv_length が HELLO_MSG_HEADER_LENGTHで, 且つis_message_from_client が trueで,record_dataがsslレコードで,誤りのhello messageの場合 + // unit_test[34] 戻り値が-1(異常)で設定する。 + recv_length = HELLO_MSG_HEADER_LENGTH; + record_data = new char[recv_length]; + record_data[0] = 0x16; + record_data[1] = 0x03; + record_data[2] = 0x00; + record_data[3] = 0x00; + record_data[4] = 0x9e; + record_data[5] = 0x01; + record_data[9] = 0x00; + record_data[10] = 0x00; + record_data[43] = 0x20; + is_hello_message = true; + is_message_from_client = true; + ret = this->check_ssl_record_sendable(is_message_from_client, + record_data, recv_length, all_length, is_hello_message); + BOOST_CHECK(!is_hello_message); + BOOST_CHECK_EQUAL(ret, -1); + delete[] record_data; + + cout << "[35]------------------------------------------" << endl; + // unit_test[35] recv_length が HELLO_MSG_HEADER_LENGTHで, 且つis_message_from_client が falseで,record_dataがsslレコードで,誤りのhello messageの場合 + // unit_test[35] 戻り値が-1(異常)で設定する。 + recv_length = HELLO_MSG_HEADER_LENGTH; + record_data = new char[recv_length]; + record_data[0] = 0x16; + record_data[1] = 0x03; + record_data[2] = 0x00; + record_data[3] = 0x00; + record_data[4] = 0x9e; + record_data[5] = 0x01; + record_data[9] = 0x00; + record_data[10] = 0x00; + record_data[43] = 0x20; + is_hello_message = true; + is_message_from_client = false; + ret = this->check_ssl_record_sendable(is_message_from_client, + record_data, recv_length, all_length, is_hello_message); + BOOST_CHECK(!is_hello_message); + BOOST_CHECK_EQUAL(ret, -1); + delete[] record_data; + + cout << "[36]------------------------------------------" << endl; + // unit_test[36] recv_length が HELLO_MSG_HEADER_LENGTHで, record_dataがsslレコードで,誤りのhello messageの場合 + // unit_test[36] 戻り値が-1(異常)で設定する。 + recv_length = HELLO_MSG_HEADER_LENGTH; + record_data = new char[recv_length]; + record_data[0] = 0x16; + record_data[1] = 0x03; + record_data[2] = 0x01; + record_data[3] = 0x00; + record_data[4] = 0x9e; + record_data[5] = 0x01; // client hello = 0x01, server hello = 0x02 + record_data[9] = 0x03; + record_data[10] = 0x01; + record_data[43] = 0x20; + is_message_from_client = false; + is_hello_message = true; + ret = this->check_ssl_record_sendable(is_message_from_client, + record_data, recv_length, all_length, is_hello_message); + BOOST_CHECK(!is_hello_message); + BOOST_CHECK_EQUAL(ret, -1); + delete[] record_data; + + cout << "[37]------------------------------------------" << endl; + // unit_test[37] recv_length が HELLO_MSG_HEADER_LENGTHで, 且つrecord_dataがsslレコードで,誤りのhello messageの場合 + // unit_test[37] 戻り値が-1(異常)で設定する。 + recv_length = HELLO_MSG_HEADER_LENGTH; + record_data = new char[recv_length]; + record_data[0] = 0x16; + record_data[1] = 0x03; + record_data[2] = 0x00; + record_data[3] = 0x00; + record_data[4] = 0x9e; + record_data[5] = 0x01; // client hello = 0x01, server hello = 0x02 + record_data[9] = 0x03; + record_data[10] = 0x01; + record_data[43] = 0x20; + is_message_from_client = false; + is_hello_message = true; + ret = this->check_ssl_record_sendable(is_message_from_client, + record_data, recv_length, all_length, is_hello_message); + BOOST_CHECK(!is_hello_message); + BOOST_CHECK_EQUAL(ret, -1); + delete[] record_data; + + cout << "[38]------------------------------------------" << endl; + // unit_test[38] recv_length が HELLO_MSG_HEADER_LENGTHで, record_dataがsslレコードで,誤りのhello messageの場合 + // unit_test[38] 戻り値が-1(異常)で設定する。 + recv_length = HELLO_MSG_HEADER_LENGTH; + record_data = new char[recv_length]; + record_data[0] = 0x16; + record_data[1] = 0x03; + record_data[2] = 0x01; + record_data[3] = 0x00; + record_data[4] = 0x9e; + record_data[5] = 0x01; // client hello = 0x01, server hello = 0x02 + record_data[9] = 0x03; + record_data[10] = 0x00; + record_data[43] = 0x20; + is_message_from_client = false; + is_hello_message = true; + ret = this->check_ssl_record_sendable(is_message_from_client, + record_data, recv_length, all_length, is_hello_message); + BOOST_CHECK(!is_hello_message); + BOOST_CHECK_EQUAL(ret, -1); + delete[] record_data; + + cout << "[39]------------------------------------------" << endl; + // unit_test[39] recv_length が HELLO_MSG_HEADER_LENGTHで, record_dataがsslレコードで,誤りのhello messageの場合 + // unit_test[39] 戻り値が-1(異常)で設定する。 + recv_length = HELLO_MSG_HEADER_LENGTH; + record_data = new char[recv_length]; + record_data[0] = 0x16; + record_data[1] = 0x03; + record_data[2] = 0x00; + record_data[3] = 0x00; + record_data[4] = 0x9e; + record_data[5] = 0x01; // client hello = 0x01, server hello = 0x02 + record_data[9] = 0x03; + record_data[10] = 0x00; + record_data[43] = 0x20; + is_message_from_client = false; + is_hello_message = true; + ret = this->check_ssl_record_sendable(is_message_from_client, + record_data, recv_length, all_length, is_hello_message); + BOOST_CHECK(!is_hello_message); + BOOST_CHECK_EQUAL(ret, -1); + delete[] record_data; + + cout << "[40]------------------------------------------" << endl; + // unit_test[40] recv_length が HELLO_MSG_HEADER_LENGTHで, record_dataがsslレコードで,誤りのhello messageの場合 + // unit_test[40] 戻り値が-1(異常)で設定する。 + recv_length = HELLO_MSG_HEADER_LENGTH; + record_data = new char[recv_length]; + record_data[0] = 0x16; + record_data[1] = 0x03; + record_data[2] = 0x01; + record_data[3] = 0x00; + record_data[4] = 0x9e; + record_data[5] = 0x02; // client hello = 0x01, server hello = 0x02 + record_data[9] = 0x03; + record_data[10] = 0x01; + record_data[43] = 0x20; + is_message_from_client = true; + is_hello_message = true; + ret = this->check_ssl_record_sendable(is_message_from_client, + record_data, recv_length, all_length, is_hello_message); + BOOST_CHECK(!is_hello_message); + BOOST_CHECK_EQUAL(ret, -1); + delete[] record_data; + + cout << "[41]------------------------------------------" << endl; + // unit_test[41] recv_length が HELLO_MSG_HEADER_LENGTHで, record_dataがsslレコードで,誤りのhello messageの場合 + // unit_test[41] 戻り値が-1(異常)で設定する。 + recv_length = HELLO_MSG_HEADER_LENGTH; + record_data = new char[recv_length]; + record_data[0] = 0x16; + record_data[1] = 0x03; + record_data[2] = 0x00; + record_data[3] = 0x00; + record_data[4] = 0x9e; + record_data[5] = 0x02; // client hello = 0x01, server hello = 0x02 + record_data[9] = 0x03; + record_data[10] = 0x01; + record_data[43] = 0x20; + is_message_from_client = true; + is_hello_message = true; + ret = this->check_ssl_record_sendable(is_message_from_client, + record_data, recv_length, all_length, is_hello_message); + BOOST_CHECK(!is_hello_message); + BOOST_CHECK_EQUAL(ret, -1); + delete[] record_data; + + cout << "[42]------------------------------------------" << endl; + // unit_test[42] recv_length が HELLO_MSG_HEADER_LENGTHで, record_dataがsslレコードで,誤りのhello messageの場合 + // unit_test[42] 戻り値が-1(異常)で設定する。 + recv_length = HELLO_MSG_HEADER_LENGTH; + record_data = new char[recv_length]; + record_data[0] = 0x16; + record_data[1] = 0x03; + record_data[2] = 0x01; + record_data[3] = 0x00; + record_data[4] = 0x9e; + record_data[5] = 0x02; // client hello = 0x01, server hello = 0x02 + record_data[9] = 0x03; + record_data[10] = 0x00; + record_data[43] = 0x20; + is_message_from_client = true; + is_hello_message = true; + ret = this->check_ssl_record_sendable(is_message_from_client, + record_data, recv_length, all_length, is_hello_message); + BOOST_CHECK(!is_hello_message); + BOOST_CHECK_EQUAL(ret, -1); + delete[] record_data; + + cout << "[43]------------------------------------------" << endl; + // unit_test[43] recv_length が HELLO_MSG_HEADER_LENGTHで, record_dataがsslレコードで,誤りのhello messageの場合 + // unit_test[43] 戻り値が-1(異常)で設定する。 + recv_length = HELLO_MSG_HEADER_LENGTH; + record_data = new char[recv_length]; + record_data[0] = 0x16; + record_data[1] = 0x03; + record_data[2] = 0x00; + record_data[3] = 0x00; + record_data[4] = 0x9e; + record_data[5] = 0x02; // client hello = 0x01, server hello = 0x02 + record_data[9] = 0x03; + record_data[10] = 0x00; + record_data[43] = 0x20; + is_message_from_client = true; + is_hello_message = true; + ret = this->check_ssl_record_sendable(is_message_from_client, + record_data, recv_length, all_length, is_hello_message); + BOOST_CHECK(!is_hello_message); + BOOST_CHECK_EQUAL(ret, -1); + delete[] record_data; + + cout << "[44]------------------------------------------" << endl; + // unit_test[44] recv_length が HELLO_MSG_HEADER_LENGTHで, record_dataがsslレコードで,且つclient hello messageの場合 + // unit_test[44] 戻り値が0(送信可能)で設定する。 + recv_length = HELLO_MSG_HEADER_LENGTH; + record_data = new char[recv_length]; + record_data[0] = 0x16; + record_data[1] = 0x03; + record_data[2] = 0x01; + record_data[3] = 0x00; + record_data[4] = 0x9e; + record_data[5] = 0x01; // client hello = 0x01, server hello = 0x02 + record_data[9] = 0x03; + record_data[10] = 0x01; + record_data[43] = 0x20; + is_message_from_client = true; + is_hello_message = false; + all_length = 0u; + ret = this->check_ssl_record_sendable(is_message_from_client, + record_data, recv_length, all_length, is_hello_message); + BOOST_CHECK(is_hello_message); + BOOST_CHECK_EQUAL(all_length, 163u); + BOOST_CHECK_EQUAL(ret, 0); + delete[] record_data; + + cout << "[45]------------------------------------------" << endl; + // unit_test[45] recv_length が HELLO_MSG_HEADER_LENGTHで, record_dataがsslレコードで,且つclient hello messageの場合 + // unit_test[45] 戻り値が0(送信可能)で設定する。 + recv_length = HELLO_MSG_HEADER_LENGTH; + record_data = new char[recv_length]; + record_data[0] = 0x16; + record_data[1] = 0x03; + record_data[2] = 0x00; + record_data[3] = 0x00; + record_data[4] = 0x9e; + record_data[5] = 0x01; // client hello = 0x01, server hello = 0x02 + record_data[9] = 0x03; + record_data[10] = 0x01; + is_message_from_client = true; + is_hello_message = false; + all_length = 0u; + ret = this->check_ssl_record_sendable(is_message_from_client, + record_data, recv_length, all_length, is_hello_message); + BOOST_CHECK(is_hello_message); + BOOST_CHECK_EQUAL(all_length, 163u); + BOOST_CHECK_EQUAL(ret, 0); + delete[] record_data; + + cout << "[46]------------------------------------------" << endl; + // unit_test[46] recv_length が HELLO_MSG_HEADER_LENGTHで, record_dataがsslレコードで,且つclient hello messageの場合 + // unit_test[46] 戻り値が0(送信可能)で設定する。 + recv_length = HELLO_MSG_HEADER_LENGTH; + record_data = new char[recv_length]; + record_data[0] = 0x16; + record_data[1] = 0x03; + record_data[2] = 0x01; + record_data[3] = 0x00; + record_data[4] = 0x9e; + record_data[5] = 0x01; // client hello = 0x01, server hello = 0x02 + record_data[9] = 0x03; + record_data[10] = 0x00; + is_message_from_client = true; + is_hello_message = false; + all_length = 0u; + ret = this->check_ssl_record_sendable(is_message_from_client, + record_data, recv_length, all_length, is_hello_message); + BOOST_CHECK(is_hello_message); + BOOST_CHECK_EQUAL(all_length, 163u); + BOOST_CHECK_EQUAL(ret, 0); + delete[] record_data; + + cout << "[47]------------------------------------------" << endl; + // unit_test[47] recv_length が HELLO_MSG_HEADER_LENGTHで, record_dataがsslレコードで,且つclient hello messageの場合 + // unit_test[47] 戻り値が0(送信可能)で設定する。 + recv_length = HELLO_MSG_HEADER_LENGTH; + record_data = new char[recv_length]; + record_data[0] = 0x16; + record_data[1] = 0x03; + record_data[2] = 0x00; + record_data[3] = 0x00; + record_data[4] = 0x9e; + record_data[5] = 0x01; // client hello = 0x01, server hello = 0x02 + record_data[9] = 0x03; + record_data[10] = 0x00; + is_message_from_client = true; + is_hello_message = false; + all_length = 0u; + ret = this->check_ssl_record_sendable(is_message_from_client, + record_data, recv_length, all_length, is_hello_message); + BOOST_CHECK(is_hello_message); + BOOST_CHECK_EQUAL(all_length, 163u); + BOOST_CHECK_EQUAL(ret, 0); + delete[] record_data; + + cout << "[48]------------------------------------------" << endl; + // unit_test[48] recv_length が HELLO_MSG_HEADER_LENGTHで, record_dataがsslレコードで,且つserver hello messageの場合 + // unit_test[48] 戻り値が0(送信可能)で設定する。 + recv_length = HELLO_MSG_HEADER_LENGTH; + record_data = new char[recv_length]; + record_data[0] = 0x16; + record_data[1] = 0x03; + record_data[2] = 0x01; + record_data[3] = 0x00; + record_data[4] = 0x9e; + record_data[5] = 0x02; // client hello = 0x01, server hello = 0x02 + record_data[9] = 0x03; + record_data[10] = 0x01; + is_message_from_client = false; + is_hello_message = false; + all_length = 0u; + ret = this->check_ssl_record_sendable(is_message_from_client, + record_data, recv_length, all_length, is_hello_message); + BOOST_CHECK(is_hello_message); + BOOST_CHECK_EQUAL(all_length, 163u); + BOOST_CHECK_EQUAL(ret, 0); + delete[] record_data; + + cout << "[49]------------------------------------------" << endl; + // unit_test[49] recv_length が HELLO_MSG_HEADER_LENGTHで, record_dataがsslレコードで,且つserver hello messageの場合 + // unit_test[49] 戻り値が0(送信可能)で設定する。 + recv_length = HELLO_MSG_HEADER_LENGTH; + record_data = new char[recv_length]; + record_data[0] = 0x16; + record_data[1] = 0x03; + record_data[2] = 0x00; + record_data[3] = 0x00; + record_data[4] = 0x9e; + record_data[5] = 0x02; // client hello = 0x01, server hello = 0x02 + record_data[9] = 0x03; + record_data[10] = 0x01; + is_message_from_client = false; + is_hello_message = false; + all_length = 0u; + ret = this->check_ssl_record_sendable(is_message_from_client, + record_data, recv_length, all_length, is_hello_message); + BOOST_CHECK(is_hello_message); + BOOST_CHECK_EQUAL(all_length, 163u); + BOOST_CHECK_EQUAL(ret, 0); + delete[] record_data; + + cout << "[50]------------------------------------------" << endl; + // unit_test[50] recv_length が HELLO_MSG_HEADER_LENGTHで, record_dataがsslレコードで,且つserver hello messageの場合 + // unit_test[50] 戻り値が0(送信可能)で設定する。 + recv_length = HELLO_MSG_HEADER_LENGTH; + record_data = new char[recv_length]; + record_data[0] = 0x16; + record_data[1] = 0x03; + record_data[2] = 0x01; + record_data[3] = 0x00; + record_data[4] = 0x9e; + record_data[5] = 0x02; // client hello = 0x01, server hello = 0x02 + record_data[9] = 0x03; + record_data[10] = 0x00; + is_message_from_client = false; + is_hello_message = false; + all_length = 0u; + ret = this->check_ssl_record_sendable(is_message_from_client, + record_data, recv_length, all_length, is_hello_message); + BOOST_CHECK(is_hello_message); + BOOST_CHECK_EQUAL(all_length, 163u); + BOOST_CHECK_EQUAL(ret, 0); + delete[] record_data; + + cout << "[51]------------------------------------------" << endl; + // unit_test[51] recv_length が HELLO_MSG_HEADER_LENGTHで, record_dataがsslレコードで,且つserver hello messageの場合 + // unit_test[51] 戻り値が0(送信可能)で設定する。 + recv_length = HELLO_MSG_HEADER_LENGTH; + record_data = new char[recv_length]; + record_data[0] = 0x16; + record_data[1] = 0x03; + record_data[2] = 0x00; + record_data[3] = 0x00; + record_data[4] = 0x9e; + record_data[5] = 0x02; // client hello = 0x01, server hello = 0x02 + record_data[9] = 0x03; + record_data[10] = 0x00; + is_message_from_client = false; + is_hello_message = false; + all_length = 0u; + ret = this->check_ssl_record_sendable(is_message_from_client, + record_data, recv_length, all_length, is_hello_message); + BOOST_CHECK(is_hello_message); + BOOST_CHECK_EQUAL(all_length, 163u); + BOOST_CHECK_EQUAL(ret, 0); + delete[] record_data; + + cout << "[52]------------------------------------------" << endl; + // unit_test[52] recv_length > HELLO_MSG_HEADER_LENGTHで, 且つis_message_from_client が trueで,record_dataがsslレコードで,誤りのhello messageの場合 + // unit_test[52] 戻り値が-1(異常)で設定する。 + recv_length = 100u; + record_data = new char[recv_length]; + record_data[0] = 0x16; + record_data[1] = 0x03; + record_data[2] = 0x01; + record_data[3] = 0x00; + record_data[4] = 0x9e; + record_data[5] = 0x01; + record_data[9] = 0x00; + record_data[10] = 0x00; + record_data[43] = 0x20; + is_hello_message = true; + is_message_from_client = true; + ret = this->check_ssl_record_sendable(is_message_from_client, + record_data, recv_length, all_length, is_hello_message); + BOOST_CHECK(!is_hello_message); + BOOST_CHECK_EQUAL(ret, -1); + delete[] record_data; + + cout << "[53]------------------------------------------" << endl; + // unit_test[53] recv_length > HELLO_MSG_HEADER_LENGTHで, 且つis_message_from_client が falseで,record_dataがsslレコードで,誤りのhello messageの場合 + // unit_test[53] 戻り値が-1(異常)で設定する。 + recv_length = 100u; + record_data = new char[recv_length]; + record_data[0] = 0x16; + record_data[1] = 0x03; + record_data[2] = 0x01; + record_data[3] = 0x00; + record_data[4] = 0x9e; + record_data[5] = 0x01; + record_data[9] = 0x00; + record_data[10] = 0x00; + record_data[43] = 0x20; + is_hello_message = true; + is_message_from_client = false; + ret = this->check_ssl_record_sendable(is_message_from_client, + record_data, recv_length, all_length, is_hello_message); + BOOST_CHECK(!is_hello_message); + BOOST_CHECK_EQUAL(ret, -1); + delete[] record_data; + + cout << "[54]------------------------------------------" << endl; + // unit_test[54] recv_length > HELLO_MSG_HEADER_LENGTHで, 且つis_message_from_client が trueで, record_dataがsslレコードで,誤りのhello messageの場合 + // unit_test[54] 戻り値が-1(異常)で設定する。 + recv_length = 100u; + record_data = new char[recv_length]; + record_data[0] = 0x16; + record_data[1] = 0x03; + record_data[2] = 0x00; + record_data[3] = 0x00; + record_data[4] = 0x9e; + record_data[5] = 0x01; + record_data[9] = 0x00; + record_data[10] = 0x00; + record_data[43] = 0x20; + is_message_from_client = true; + is_hello_message = true; + ret = this->check_ssl_record_sendable(is_message_from_client, + record_data, recv_length, all_length, is_hello_message); + BOOST_CHECK(!is_hello_message); + BOOST_CHECK_EQUAL(ret, -1); + delete[] record_data; + + cout << "[55]------------------------------------------" << endl; + // unit_test[55] recv_length > HELLO_MSG_HEADER_LENGTHで, 且つis_message_from_client が falseで, record_dataがsslレコードで,誤りのhello messageの場合 + // unit_test[55] 戻り値が-1(異常)で設定する。 + recv_length = 100u; + record_data = new char[recv_length]; + record_data[0] = 0x16; + record_data[1] = 0x03; + record_data[2] = 0x00; + record_data[3] = 0x00; + record_data[4] = 0x9e; + record_data[5] = 0x01; + record_data[9] = 0x00; + record_data[10] = 0x00; + record_data[43] = 0x20; + is_message_from_client = false; + is_hello_message = true; + ret = this->check_ssl_record_sendable(is_message_from_client, + record_data, recv_length, all_length, is_hello_message); + BOOST_CHECK(!is_hello_message); + BOOST_CHECK_EQUAL(ret, -1); + delete[] record_data; + + cout << "[56]------------------------------------------" << endl; + // unit_test[56] recv_length > HELLO_MSG_HEADER_LENGTHで, record_dataがsslレコードで,誤りのhello messageの場合 + // unit_test[56] 戻り値が-1(異常)で設定する。 + recv_length = 100u; + record_data = new char[recv_length]; + record_data[0] = 0x16; + record_data[1] = 0x03; + record_data[2] = 0x01; + record_data[3] = 0x00; + record_data[4] = 0x9e; + record_data[5] = 0x01; // client hello = 0x01, server hello = 0x02 + record_data[9] = 0x03; + record_data[10] = 0x01; + record_data[43] = 0x20; + is_message_from_client = false; + is_hello_message = true; + ret = this->check_ssl_record_sendable(is_message_from_client, + record_data, recv_length, all_length, is_hello_message); + BOOST_CHECK(!is_hello_message); + BOOST_CHECK_EQUAL(ret, -1); + delete[] record_data; + + cout << "[57]------------------------------------------" << endl; + // unit_test[57] recv_length > HELLO_MSG_HEADER_LENGTHで, record_dataがsslレコードで,誤りのhello messageの場合 + // unit_test[57] 戻り値が-1(異常)で設定する。 + recv_length = 100u; + record_data = new char[recv_length]; + record_data[0] = 0x16; + record_data[1] = 0x03; + record_data[2] = 0x00; + record_data[3] = 0x00; + record_data[4] = 0x9e; + record_data[5] = 0x01; // client hello = 0x01, server hello = 0x02 + record_data[9] = 0x03; + record_data[10] = 0x01; + record_data[43] = 0x20; + is_message_from_client = false; + is_hello_message = true; + ret = this->check_ssl_record_sendable(is_message_from_client, + record_data, recv_length, all_length, is_hello_message); + BOOST_CHECK(!is_hello_message); + BOOST_CHECK_EQUAL(ret, -1); + delete[] record_data; + + cout << "[58]------------------------------------------" << endl; + // unit_test[58] recv_length > HELLO_MSG_HEADER_LENGTHで, record_dataがsslレコードで,誤りのhello messageの場合 + // unit_test[58] 戻り値が-1(異常)で設定する。 + recv_length = 100u; + record_data = new char[recv_length]; + record_data[0] = 0x16; + record_data[1] = 0x03; + record_data[2] = 0x01; + record_data[3] = 0x00; + record_data[4] = 0x9e; + record_data[5] = 0x01; // client hello = 0x01, server hello = 0x02 + record_data[9] = 0x03; + record_data[10] = 0x00; + record_data[43] = 0x20; + is_message_from_client = false; + is_hello_message = true; + ret = this->check_ssl_record_sendable(is_message_from_client, + record_data, recv_length, all_length, is_hello_message); + BOOST_CHECK(!is_hello_message); + BOOST_CHECK_EQUAL(ret, -1); + delete[] record_data; + + cout << "[59]------------------------------------------" << endl; + // unit_test[59] recv_length > HELLO_MSG_HEADER_LENGTHで, record_dataがsslレコードで,誤りのhello messageの場合 + // unit_test[59] 戻る値が-1(異常)で設定する。 + recv_length = 100u; + record_data = new char[recv_length]; + record_data[0] = 0x16; + record_data[1] = 0x03; + record_data[2] = 0x00; + record_data[3] = 0x00; + record_data[4] = 0x9e; + record_data[5] = 0x01; // client hello = 0x01, server hello = 0x02 + record_data[9] = 0x03; + record_data[10] = 0x00; + record_data[43] = 0x20; + is_message_from_client = false; + is_hello_message = true; + ret = this->check_ssl_record_sendable(is_message_from_client, + record_data, recv_length, all_length, is_hello_message); + BOOST_CHECK(!is_hello_message); + BOOST_CHECK_EQUAL(ret, -1); + delete[] record_data; + + cout << "[60]------------------------------------------" << endl; + // unit_test[60] recv_length > HELLO_MSG_HEADER_LENGTHで, record_dataがsslレコードで,誤りのhello messageの場合 + // unit_test[60] 戻り値が-1(異常)で設定する。 + recv_length = 100u; + record_data = new char[recv_length]; + record_data[0] = 0x16; + record_data[1] = 0x03; + record_data[2] = 0x01; + record_data[3] = 0x00; + record_data[4] = 0x9e; + record_data[5] = 0x02; // client hello = 0x01, server hello = 0x02 + record_data[9] = 0x03; + record_data[10] = 0x01; + record_data[43] = 0x20; + is_message_from_client = true; + is_hello_message = true; + ret = this->check_ssl_record_sendable(is_message_from_client, + record_data, recv_length, all_length, is_hello_message); + BOOST_CHECK(!is_hello_message); + BOOST_CHECK_EQUAL(ret, -1); + delete[] record_data; + + cout << "[61]------------------------------------------" << endl; + // unit_test[61] recv_length > HELLO_MSG_HEADER_LENGTHで, record_dataがsslレコードで,誤りのhello messageの場合 + // unit_test[61] 戻り値が-1(異常)で設定する。 + recv_length = 100u; + record_data = new char[recv_length]; + record_data[0] = 0x16; + record_data[1] = 0x03; + record_data[2] = 0x00; + record_data[3] = 0x00; + record_data[4] = 0x9e; + record_data[5] = 0x02; // client hello = 0x01, server hello = 0x02 + record_data[9] = 0x03; + record_data[10] = 0x01; + record_data[43] = 0x20; + is_message_from_client = true; + is_hello_message = true; + ret = this->check_ssl_record_sendable(is_message_from_client, + record_data, recv_length, all_length, is_hello_message); + BOOST_CHECK(!is_hello_message); + BOOST_CHECK_EQUAL(ret, -1); + delete[] record_data; + + cout << "[62]------------------------------------------" << endl; + // unit_test[62] recv_length > HELLO_MSG_HEADER_LENGTHで, record_dataがsslレコードで,誤りのhello messageの場合 + // unit_test[62] 戻り値が-1(異常)で設定する。 + recv_length = 100u; + record_data = new char[recv_length]; + record_data[0] = 0x16; + record_data[1] = 0x03; + record_data[2] = 0x01; + record_data[3] = 0x00; + record_data[4] = 0x9e; + record_data[5] = 0x02; // client hello = 0x01, server hello = 0x02 + record_data[9] = 0x03; + record_data[10] = 0x00; + record_data[43] = 0x20; + is_message_from_client = true; + is_hello_message = true; + ret = this->check_ssl_record_sendable(is_message_from_client, + record_data, recv_length, all_length, is_hello_message); + BOOST_CHECK(!is_hello_message); + BOOST_CHECK_EQUAL(ret, -1); + delete[] record_data; + + cout << "[63]------------------------------------------" << endl; + // unit_test[63] recv_length > HELLO_MSG_HEADER_LENGTHで, record_dataがsslレコードで,誤りのhello messageの場合 + // unit_test[63] 戻り値が-1(異常)で設定する。 + recv_length = 100u; + record_data = new char[recv_length]; + record_data[0] = 0x16; + record_data[1] = 0x03; + record_data[2] = 0x00; + record_data[3] = 0x00; + record_data[4] = 0x9e; + record_data[5] = 0x02; // client hello = 0x01, server hello = 0x02 + record_data[9] = 0x03; + record_data[10] = 0x00; + record_data[43] = 0x20; + is_message_from_client = true; + is_hello_message = true; + ret = this->check_ssl_record_sendable(is_message_from_client, + record_data, recv_length, all_length, is_hello_message); + BOOST_CHECK(!is_hello_message); + BOOST_CHECK_EQUAL(ret, -1); + delete[] record_data; + + cout << "[64]------------------------------------------" << endl; + // unit_test[64] recv_length > HELLO_MSG_HEADER_LENGTHで, record_dataがsslレコードで,且つclient hello messageの場合 + // unit_test[64] 戻り値が0(送信可能)で設定する。 + recv_length = 100u; + record_data = new char[recv_length]; + record_data[0] = 0x16; + record_data[1] = 0x03; + record_data[2] = 0x01; + record_data[3] = 0x00; + record_data[4] = 0x9e; + record_data[5] = 0x01; // client hello = 0x01, server hello = 0x02 + record_data[9] = 0x03; + record_data[10] = 0x01; + record_data[43] = 0x20; + is_message_from_client = true; + is_hello_message = false; + all_length = 0u; + ret = this->check_ssl_record_sendable(is_message_from_client, + record_data, recv_length, all_length, is_hello_message); + BOOST_CHECK(is_hello_message); + BOOST_CHECK_EQUAL(all_length, 163u); + BOOST_CHECK_EQUAL(ret, 0); + delete[] record_data; + + cout << "[65]------------------------------------------" << endl; + // unit_test[65] recv_length > HELLO_MSG_HEADER_LENGTHで, record_dataがsslレコードで,且つclient hello messageの場合 + // unit_test[65] 戻り値が0(送信可能)で設定する。 + recv_length = 100u; + record_data = new char[recv_length]; + record_data[0] = 0x16; + record_data[1] = 0x03; + record_data[2] = 0x00; + record_data[3] = 0x00; + record_data[4] = 0x9e; + record_data[5] = 0x01; // client hello = 0x01, server hello = 0x02 + record_data[9] = 0x03; + record_data[10] = 0x01; + record_data[43] = 0x20; + is_message_from_client = true; + is_hello_message = false; + all_length = 0u; + ret = this->check_ssl_record_sendable(is_message_from_client, + record_data, recv_length, all_length, is_hello_message); + BOOST_CHECK(is_hello_message); + BOOST_CHECK_EQUAL(all_length, 163u); + BOOST_CHECK_EQUAL(ret, 0); + delete[] record_data; + + cout << "[66]------------------------------------------" << endl; + // unit_test[66] recv_length > HELLO_MSG_HEADER_LENGTHで, record_dataがsslレコードで,且つclient hello messageの場合 + // unit_test[66] 戻り値が0(送信可能)で設定する。 + recv_length = 100u; + record_data = new char[recv_length]; + record_data[0] = 0x16; + record_data[1] = 0x03; + record_data[2] = 0x01; + record_data[3] = 0x00; + record_data[4] = 0x9e; + record_data[5] = 0x01; // client hello = 0x01, server hello = 0x02 + record_data[9] = 0x03; + record_data[10] = 0x00; + record_data[43] = 0x20; + is_message_from_client = true; + is_hello_message = false; + all_length = 0u; + ret = this->check_ssl_record_sendable(is_message_from_client, + record_data, recv_length, all_length, is_hello_message); + BOOST_CHECK(is_hello_message); + BOOST_CHECK_EQUAL(all_length, 163u); + BOOST_CHECK_EQUAL(ret, 0); + delete[] record_data; + + cout << "[67]------------------------------------------" << endl; + // unit_test[67] recv_length > HELLO_MSG_HEADER_LENGTHで, record_dataがsslレコードで,且つclient hello messageの場合 + // unit_test[67] 戻り値が0(送信可能)で設定する。 + recv_length = 100u; + record_data = new char[recv_length]; + record_data[0] = 0x16; + record_data[1] = 0x03; + record_data[2] = 0x00; + record_data[3] = 0x00; + record_data[4] = 0x9e; + record_data[5] = 0x01; // client hello = 0x01, server hello = 0x02 + record_data[9] = 0x03; + record_data[10] = 0x00; + record_data[43] = 0x20; + is_message_from_client = true; + is_hello_message = false; + all_length = 0u; + ret = this->check_ssl_record_sendable(is_message_from_client, + record_data, recv_length, all_length, is_hello_message); + BOOST_CHECK(is_hello_message); + BOOST_CHECK_EQUAL(all_length, 163u); + BOOST_CHECK_EQUAL(ret, 0); + delete[] record_data; + + cout << "[68]------------------------------------------" << endl; + // unit_test[68] recv_length > HELLO_MSG_HEADER_LENGTHで, record_dataがsslレコードで,且つserver hello messageの場合 + // unit_test[68] 戻り値が0(送信可能)で設定する。 + recv_length = 100u; + record_data = new char[recv_length]; + record_data[0] = 0x16; + record_data[1] = 0x03; + record_data[2] = 0x01; + record_data[3] = 0x00; + record_data[4] = 0x9e; + record_data[5] = 0x02; // client hello = 0x01, server hello = 0x02 + record_data[9] = 0x03; + record_data[10] = 0x01; + record_data[43] = 0x20; + is_message_from_client = false; + is_hello_message = false; + all_length = 0u; + ret = this->check_ssl_record_sendable(is_message_from_client, + record_data, recv_length, all_length, is_hello_message); + BOOST_CHECK(is_hello_message); + BOOST_CHECK_EQUAL(all_length, 163u); + BOOST_CHECK_EQUAL(ret, 0); + delete[] record_data; + + cout << "[69]------------------------------------------" << endl; + // unit_test[69] recv_length > HELLO_MSG_HEADER_LENGTHで, record_dataがsslレコードで,且つserver hello messageの場合 + // unit_test[69] 戻り値が0(送信可能)で設定する。 + recv_length = 100u; + record_data = new char[recv_length]; + record_data[0] = 0x16; + record_data[1] = 0x03; + record_data[2] = 0x00; + record_data[3] = 0x00; + record_data[4] = 0x9e; + record_data[5] = 0x02; // client hello = 0x01, server hello = 0x02 + record_data[9] = 0x03; + record_data[10] = 0x01; + record_data[43] = 0x20; + is_message_from_client = false; + is_hello_message = false; + all_length = 0u; + ret = this->check_ssl_record_sendable(is_message_from_client, + record_data, recv_length, all_length, is_hello_message); + BOOST_CHECK(is_hello_message); + BOOST_CHECK_EQUAL(all_length, 163u); + BOOST_CHECK_EQUAL(ret, 0); + delete[] record_data; + + cout << "[70]------------------------------------------" << endl; + // unit_test[70] recv_length > HELLO_MSG_HEADER_LENGTHで, record_dataがsslレコードで,且つserver hello messageの場合 + // unit_test[70] 戻り値が0(送信可能)で設定する。 + recv_length = 100u; + record_data = new char[recv_length]; + record_data[0] = 0x16; + record_data[1] = 0x03; + record_data[2] = 0x01; + record_data[3] = 0x00; + record_data[4] = 0x9e; + record_data[5] = 0x02; // client hello = 0x01, server hello = 0x02 + record_data[9] = 0x03; + record_data[10] = 0x00; + record_data[43] = 0x20; + is_message_from_client = false; + is_hello_message = false; + all_length = 0u; + ret = this->check_ssl_record_sendable(is_message_from_client, + record_data, recv_length, all_length, is_hello_message); + BOOST_CHECK(is_hello_message); + BOOST_CHECK_EQUAL(all_length, 163u); + BOOST_CHECK_EQUAL(ret, 0); + delete[] record_data; + + cout << "[71]------------------------------------------" << endl; + // unit_test[71] recv_length > HELLO_MSG_HEADER_LENGTHで, record_dataがsslレコードで,且つserver hello messageの場合 + // unit_test[71] 戻り値が0(送信可能)で設定する。 + recv_length = 100u; + record_data = new char[recv_length]; + record_data[0] = 0x16; + record_data[1] = 0x03; + record_data[2] = 0x00; + record_data[3] = 0x00; + record_data[4] = 0x9e; + record_data[5] = 0x02; // client hello = 0x01, server hello = 0x02 + record_data[9] = 0x03; + record_data[10] = 0x00; + record_data[43] = 0x20; + is_message_from_client = false; + is_hello_message = false; + all_length = 0u; + ret = this->check_ssl_record_sendable(is_message_from_client, + record_data, recv_length, all_length, is_hello_message); + BOOST_CHECK(is_hello_message); + BOOST_CHECK_EQUAL(all_length, 163u); + BOOST_CHECK_EQUAL(ret, 0); + delete[] record_data; + + cout << "[72]------------------------------------------" << endl; + // unit_test[72] recv_length が MAX_SSLID_BUFFER_SIZEで, record_dataがsslレコードで,且つserver hello messageの場合 + // unit_test[72] 戻り値が0(送信可能)で設定する。 + recv_length = MAX_SSLID_BUFFER_SIZE; + record_data = new char[recv_length]; + record_data[0] = 0x16; + record_data[1] = 0x03; + record_data[2] = 0x00; + record_data[3] = 0x00; + record_data[4] = 0x9e; + record_data[5] = 0x02; // client hello = 0x01, server hello = 0x02 + record_data[9] = 0x03; + record_data[10] = 0x00; + record_data[43] = 0x20; + is_message_from_client = false; + is_hello_message = false; + all_length = 0u; + ret = this->check_ssl_record_sendable(is_message_from_client, + record_data, recv_length, all_length, is_hello_message); + BOOST_CHECK(is_hello_message); + BOOST_CHECK_EQUAL(all_length, 163u); + BOOST_CHECK_EQUAL(ret, 0); + delete[] record_data; + + cout << "[73]------------------------------------------" << endl; + // unit_test[73] record_data が NULLの場合 + // unit_test[73] 戻り値が-1(異常)で設定する。 + record_data = NULL; + ret = this->check_ssl_record_sendable(is_message_from_client, + record_data, 0u, all_length, is_hello_message); + BOOST_CHECK_EQUAL(ret, -1); + delete[] record_data; + + cout << "[74]------------------------------------------" << endl; + // unit_test[74] recv_lengthがSESSION_ID_BEGAIN_OFFSETで, record_dataがsslレコードで,セッションIDがない場合 + // uint_test[74] 戻り値が0(送信可能)で設定する。 + recv_length = SESSION_ID_BEGAIN_OFFSET; + record_data = new char[SESSION_ID_BEGAIN_OFFSET]; + record_data[0] = 0x16; + record_data[1] = 0x03; + record_data[2] = 0x01; + record_data[3] = 0x00; + record_data[4] = 0x27; + record_data[5] = 0x01; + record_data[43] = 0x00; + is_message_from_client = true; + is_hello_message = false; + ret = this->check_ssl_record_sendable(is_message_from_client, + record_data, recv_length, all_length, is_hello_message); + BOOST_CHECK_EQUAL(ret, 0); + BOOST_CHECK(is_hello_message); + BOOST_CHECK_EQUAL(all_length, 44u); + delete[] record_data; + + cout << "[75]------------------------------------------" << endl; + // unit_test[75] recv_length>SESSION_ID_BEGAIN_OFFSETで, record_dataがsslレコードで,セッションIDがない場合 + // uint_test[75] 戻り値が0(送信可能)で設定する。 + recv_length = SESSION_ID_BEGAIN_OFFSET+1; + record_data = new char[SESSION_ID_BEGAIN_OFFSET]; + record_data[0] = 0x16; + record_data[1] = 0x03; + record_data[2] = 0x01; + record_data[3] = 0x00; + record_data[4] = 0x28; + record_data[5] = 0x01; + record_data[43] = 0x00; + is_message_from_client = true; + is_hello_message = false; + ret = this->check_ssl_record_sendable(is_message_from_client, + record_data, recv_length, all_length, is_hello_message); + BOOST_CHECK_EQUAL(ret, 0); + BOOST_CHECK(is_hello_message); + BOOST_CHECK_EQUAL(all_length, 45u); + delete[] record_data; + + } + + void dump_session_id_test(){ + struct check_condition + { + char memory[256]; + size_t memory_size; + std::string out_string; + }; + + // テスト条件(正常系): + check_condition condition_empty_string[12] = + { + {"a", 0, ""}, + {"a", 1, "61"}, + {"ab", 2, "6162"}, + {"abc", 3, "616263"}, + {"abcd", 4, "61626364"}, + {"abcde", 5, "6162636465"}, + {"abcdefghijklmnopqrstuvwxyzABCDEF", 32, + "6162636465666768696A6B6C6D6E6F707172737475767778797A414243444546"}, + {"abcdefghijklmnopqrstuvwxyzABCDEFG", 33, + "6162636465666768696A6B6C6D6E6F707172737475767778797A41424344454647"}, + {"abcdefghijklmnopqrstuvwxyzABCDEFGH", 34, + "6162636465666768696A6B6C6D6E6F707172737475767778797A4142434445464748"}, + {"abcdefghijklmnopqrstuvwxyzABCDEFGHI", 35, + "6162636465666768696A6B6C6D6E6F707172737475767778797A414243444546474849"}, + {"abcdefghijklmnopqrstuvwxyzABCDEFabcdefghijklmnopqrstuvwxyzABCDEF", 64, + "6162636465666768696A6B6C6D6E6F707172737475767778797A414243444546" + "6162636465666768696A6B6C6D6E6F707172737475767778797A414243444546"}, + {"abcdefghijklmnopqrstuvwxyzABCDEFabcdefghijklmnopqrstuvwxyzABCDEFG", 65, + "6162636465666768696A6B6C6D6E6F707172737475767778797A414243444546" + "6162636465666768696A6B6C6D6E6F707172737475767778797A41424344454647"}, + }; + + // unit_test[1] ヌルポイントのテスト(異常系) + std::string out_string = "123"; + std::string out_string_src(out_string); + protocol_module_base::dump_memory(NULL, 100, out_string); + BOOST_CHECK_EQUAL(out_string, out_string_src); + std::cout << "out_string = \n" << out_string << std::endl; + std::cout << "unit_test[1]-----------------------------\n" << std::endl; + + // unit_test[2] ポイントの内容のサイズ < データサイズのテスト(異常系) + out_string = ""; + char* less_data = "abcdefghij"; + this->dump_session_id(less_data, 65, out_string); + BOOST_CHECK_EQUAL(out_string.size(), 130u ); + std::cout << "out_string = \n" << out_string << std::endl; + std::cout << "unit_test[2]-----------------------------\n" << std::endl; + + // 正常系テスト + for (size_t i = 0; i < 2; i++) + { + for (size_t j = 0; j < 12; j++) + { + out_string_src = ""; + + if (i == 0) + { + out_string = ""; + } + else + { + out_string = "test"; + out_string_src = out_string; + } + this->dump_session_id(condition_empty_string[j].memory, + condition_empty_string[j].memory_size, + out_string); + BOOST_CHECK_EQUAL(out_string, out_string_src + condition_empty_string[j].out_string); + + std::cout << "condition[" << j << "].memory = " << condition_empty_string[j].memory << std::endl; + std::cout << "condition[" << j << "].memory_size = " << condition_empty_string[j].memory_size << std::endl; + std::cout << "condition[" << j << "].out_string = " << condition_empty_string[j].out_string << std::endl; + + std::cout << "out_string = " << out_string << std::endl; + + if ((j + 12 * i) >= 10) + { + std::cout << "unit_test[" << j + 12 * i + 3 << "]------------------------------------\n" << std::endl; + } + else + { + std::cout << "unit_test[" << j + 12 * i + 3 << "]-------------------------------------\n" << std::endl; + } + } + } + } +void is_exec_OK_test() +{ + std::cout << "[1]--------------------------------------------- " << std::endl; + //unit_test[1] SSL以外モード trueを返す + BOOST_CHECK_EQUAL(this->is_exec_OK(VS_CONTACT_CLASS_NORMAL), true); + std::cout << "[2]--------------------------------------------- " << std::endl; + //unit_test[2] SSLモード falseを返す + BOOST_CHECK_EQUAL(this->is_exec_OK(VS_CONTACT_CLASS_SSL), false); +} + +}; + +void get_ssl_session_id_test() { + ssl_protocol_module_base_test_class obj; + obj.get_ssl_session_id_test(); +} + +void check_ssl_record_sendable_test() { + ssl_protocol_module_base_test_class obj; + obj.check_ssl_record_sendable_test(); +} + +void dump_session_id_test() { + ssl_protocol_module_base_test_class obj; + obj.dump_session_id_test(); +} + +void is_exec_OK_test() { + ssl_protocol_module_base_test_class obj; + obj.is_exec_OK_test(); +} + +void ssl_protocol_module_base_test_main() { + test_suite* ts = BOOST_TEST_SUITE( "ssl_protocol_module_base_ut" ); + ts->add(BOOST_TEST_CASE( &get_ssl_session_id_test )); + ts->add(BOOST_TEST_CASE( &check_ssl_record_sendable_test )); + ts->add(BOOST_TEST_CASE( &dump_session_id_test )); + ts->add(BOOST_TEST_CASE( &is_exec_OK_test )); + framework::master_test_suite().add(ts); +} diff --git a/unit_tests/module_test/ssl_protocol_module_base_test/sslid_to_be_test_file.h b/unit_tests/module_test/ssl_protocol_module_base_test/sslid_to_be_test_file.h new file mode 100644 index 00000000..92f16949 --- /dev/null +++ b/unit_tests/module_test/ssl_protocol_module_base_test/sslid_to_be_test_file.h @@ -0,0 +1,35 @@ +/* + * @file sslid_to_be_test_file.h + * @brief sslid test header file. + * + * L7VSD: Linux Virtual Server for Layer7 Load Balancing + * Copyright (C) 2009 NTT COMWARE Corporation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + **********************************************************************/ + +#ifndef SSLID_TO_BE_TEST_FILE_H_ +#define SSLID_TO_BE_TEST_FILE_H_ + +#include + +#include "../../../module/protocol/ssl_protocol_module_base.cpp" +#include "../../../module/protocol/sslid_replication_data_processor.cpp" +#include "../../../module/protocol/sslid_session_data_processor.cpp" +#include "../../../module/protocol/protocol_module_sslid.cpp" +#define THREAD_COUNT 10 +#endif /* SSLID_TO_BE_TEST_FILE_H_ */ diff --git a/unit_tests/module_test/ssl_protocol_module_base_test/sslid_ut.cpp b/unit_tests/module_test/ssl_protocol_module_base_test/sslid_ut.cpp new file mode 100644 index 00000000..49db4216 --- /dev/null +++ b/unit_tests/module_test/ssl_protocol_module_base_test/sslid_ut.cpp @@ -0,0 +1,35 @@ +/* + * @file sslid_ut.cpp + * @brief sslid test main file. + * + * L7VSD: Linux Virtual Server for Layer7 Load Balancing + * Copyright (C) 2009 NTT COMWARE Corporation. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + * + **********************************************************************/ + +#include + +#include "ssl_protocol_module_base_test.cpp" + +test_suite* init_unit_test_suite( int argc, char* argv[] ){ + + ssl_protocol_module_base_test_main(); + + return 0; +} + diff --git a/unit_tests/schedule_module_test/schedule_module_lc_test.cpp b/unit_tests/schedule_module_test/schedule_module_lc_test.cpp index 336862e8..a5623046 100644 --- a/unit_tests/schedule_module_test/schedule_module_lc_test.cpp +++ b/unit_tests/schedule_module_test/schedule_module_lc_test.cpp @@ -189,6 +189,24 @@ void schedule_module_test(){ BOOST_MESSAGE( "unit_test[15]" ); schedule_module_lc->replication_interrupt(); + // unit_test[16] handle_schedule(tcp)メソッドのテスト8 server3が返る + BOOST_MESSAGE( "unit_test[16]" ); + rs_list.clear(); + server1.increment_active(); + server1.increment_active(); + server1.increment_active(); + rs_list.push_back( server1 ); + server2.increment_active(); + server2.increment_active(); + rs_list.push_back( server2 ); + server3.increment_active(); + rs_list.push_back( server3 ); + server4.increment_active(); + server4.increment_active(); + rs_list.push_back( server4 ); + schedule_module_lc->handle_schedule( thread_id, rslist_begin, rslist_end, rslist_next, endpoint1 ) ; + BOOST_CHECK( server3.tcp_endpoint == endpoint1 ); + // destroy_module( schedule_module_lc ); control.unload_module( schedule_module_lc ); control.finalize(); diff --git a/unit_tests/schedule_module_test/schedule_module_wrr_test.cpp b/unit_tests/schedule_module_test/schedule_module_wrr_test.cpp index df254b42..f62d7002 100644 --- a/unit_tests/schedule_module_test/schedule_module_wrr_test.cpp +++ b/unit_tests/schedule_module_test/schedule_module_wrr_test.cpp @@ -201,7 +201,7 @@ void schedule_module_test(){ BOOST_CHECK( endpoint3 == endpoint1 ); // unit_test[11] handle_schedule(tcp)メソッドのテスト4(重みが設定されているので最大値のserver3が返る) - BOOST_MESSAGE( "unit_test[10]" ); + BOOST_MESSAGE( "unit_test[11]" ); rs_list.clear(); server1.weight = 2; rs_list.push_back( server1 ); @@ -368,7 +368,7 @@ void schedule_module_test(){ rslist_next = boost::bind( &list_next, _1 ); BOOST_CHECK_EQUAL( schedule_module_wrr_fake.sched_wrr_service_init_wrapper( rslist_begin, rslist_end, rslist_next ), -1 ); - + // unit_test[34] sched_wrr_service_initメソッドのテスト2(リストの項目が全て振り分け無し) BOOST_MESSAGE( "unit_test[34]" ); rs_list.clear(); @@ -414,8 +414,8 @@ void schedule_module_test(){ BOOST_CHECK_EQUAL( schedule_module_wrr_fake.sched_wrr_gcd_wrapper( 6, 3 ), 3 ); - // unit_test[x1] handle_schedule(tcp)メソッドのテスト(重みが設定されているので最大値のserver2が返る) - BOOST_MESSAGE( "unit_test[x1]" ); + // unit_test[39] handle_schedule(tcp)メソッドのテスト(重みが設定されているので最大値のserver2が返る) + BOOST_MESSAGE( "unit_test[39]" ); rs_list.clear(); server1.weight = 1; rs_list.push_back( server1 ); @@ -425,18 +425,18 @@ void schedule_module_test(){ schedule_module_wrr->handle_schedule( thread_id, rslist_begin, rslist_end, rslist_next, endpoint1 ) ; BOOST_CHECK( server2.tcp_endpoint == endpoint1 ); - // unit_test[x2] handle_schedule(tcp)メソッドのテスト2(一巡し重みが設定されているのでserver1が返る) - BOOST_MESSAGE( "unit_test[x2]" ); + // unit_test[40] handle_schedule(tcp)メソッドのテスト2(一巡し重みが設定されているのでserver1が返る) + BOOST_MESSAGE( "unit_test[40]" ); schedule_module_wrr->handle_schedule( thread_id, rslist_begin, rslist_end, rslist_next, endpoint1 ) ; BOOST_CHECK( server1.tcp_endpoint == endpoint1 ); - // unit_test[x3] handle_schedule(tcp)メソッドのテスト3(重みが設定されているので次のserver2が返る) - BOOST_MESSAGE( "unit_test[x3]" ); + // unit_test[41] handle_schedule(tcp)メソッドのテスト3(重みが設定されているので次のserver2が返る) + BOOST_MESSAGE( "unit_test[41]" ); schedule_module_wrr->handle_schedule( thread_id, rslist_begin, rslist_end, rslist_next, endpoint1 ) ; BOOST_CHECK( server2.tcp_endpoint == endpoint1 ); - // unit_test[x4] handle_schedule(tcp)メソッドのテスト4(一巡し重みが設定されているので最大値のserver2が返る) - BOOST_MESSAGE( "unit_test[x4]" ); + // unit_test[42] handle_schedule(tcp)メソッドのテスト4(一巡し重みが設定されているので最大値のserver2が返る) + BOOST_MESSAGE( "unit_test[42]" ); schedule_module_wrr->handle_schedule( thread_id, rslist_begin, rslist_end, rslist_next, endpoint1 ) ; BOOST_CHECK( server2.tcp_endpoint == endpoint1 ); -- 2.11.0