diff options
Diffstat (limited to 'test')
| -rw-r--r-- | test/CMakeLists.txt | 172 | ||||
| -rw-r--r-- | test/http_decoder_driver.cpp | 981 | ||||
| -rw-r--r-- | test/http_decoder_gtest.cpp | 89 | ||||
| -rw-r--r-- | test/http_decoder_gtest.h | 88 | ||||
| -rw-r--r-- | test/http_decoder_perf_main.cpp | 358 | ||||
| -rw-r--r-- | test/http_decoder_perf_plug.cpp (renamed from test/http_decoder_perf.cpp) | 66 | ||||
| -rw-r--r-- | test/http_decoder_stub.cpp | 254 | ||||
| -rw-r--r-- | test/http_gtest_main.cpp | 44 | ||||
| -rw-r--r-- | test/http_gtest_unit.cpp | 569 | ||||
| -rw-r--r-- | test/test_result_json/http_get_malformed.json | 26 |
10 files changed, 454 insertions, 2193 deletions
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 4869a90..478995c 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -5,170 +5,28 @@ add_dependencies(${DECODER_NAME}_test ${DECODER_NAME}) target_link_libraries(${DECODER_NAME}_test MESA_prof_load cjson-static) set_target_properties(${DECODER_NAME}_test PROPERTIES PREFIX "") -add_library(${DECODER_NAME}_perf SHARED http_decoder_perf.cpp) +add_library(${DECODER_NAME}_perf SHARED http_decoder_perf_plug.cpp) add_dependencies(${DECODER_NAME}_perf ${DECODER_NAME}) set_target_properties(${DECODER_NAME}_perf PROPERTIES PREFIX "") -set(TEST_RUN_DIR ${CMAKE_BINARY_DIR}/testing) +set(TEST_RUN_DIR /home/mesasoft/sapp_run) include_directories(${CMAKE_SOURCE_DIR}/include) -include_directories(/usr/local/include/cjson) -include_directories(/opt/tsg/framework/include/stellar) +include_directories(${CMAKE_SOURCE_DIR}/src) +include_directories(${CMAKE_SOURCE_DIR}/deps) +# include_directories(/usr/local/include/cjson) include_directories(/opt/tsg/framework/include/) include_directories(/opt/MESA/include/MESA) +include_directories(${CMAKE_BINARY_DIR}/vendor/vbuild/include) +include_directories(${CMAKE_BINARY_DIR}/vendor/cjson/src/cjson/include) -add_executable(gtest_http_decoder http_gtest_main.cpp http_decoder_driver.cpp http_decoder_stub.cpp http_decoder_gtest.cpp md5.c base64.c) -link_directories(${CMAKE_BINARY_DIR}/src) -target_link_libraries(gtest_http_decoder http_decoder gtest pcap MESA_jump_layer cjson-static) +aux_source_directory(${PROJECT_SOURCE_DIR}/deps/mempool PERF_TEST_DEP_SRC) +aux_source_directory(${PROJECT_SOURCE_DIR}/deps/toml PERF_TEST_DEP_SRC) +aux_source_directory(${PROJECT_SOURCE_DIR}/src PERF_TEST_DEP_SRC) -add_executable(gtest_unit http_gtest_unit.cpp http_decoder_driver.cpp http_decoder_stub.cpp http_decoder_gtest.cpp md5.c base64.c) -target_link_libraries(gtest_unit http_decoder gtest pcap MESA_jump_layer cjson-static) +add_executable(httpd_perf_test ${PERF_TEST_DEP_SRC} http_decoder_perf_main.cpp http_decoder_perf_plug.cpp) +target_link_libraries(httpd_perf_test z brotlidec llhttp-static fieldstat4 pthread) -set(TEST_MAIN gtest_http_decoder) - -add_test(NAME CREATE_RUN_ENV COMMAND sh -c "mkdir -p ${TEST_RUN_DIR}") -add_test(NAME COPY_TEST_MAIN COMMAND sh -c "cp ${CMAKE_BINARY_DIR}/test/${TEST_MAIN} ${TEST_RUN_DIR}/${TEST_MAIN}") -add_test(NAME COPY_TEST_UNIT COMMAND sh -c "cp ${CMAKE_BINARY_DIR}/test/gtest_unit ${TEST_RUN_DIR}/gtest_unit") -add_test(NAME COPY_HTTP_DECODER_CONF COMMAND sh -c "mkdir -p ${TEST_RUN_DIR}/etc/http && cp ${PROJECT_SOURCE_DIR}/conf/http_decoder.toml ${TEST_RUN_DIR}/etc/http/") - - -set_tests_properties(CREATE_RUN_ENV COPY_TEST_MAIN COPY_TEST_UNIT COPY_HTTP_DECODER_CONF - PROPERTIES FIXTURES_SETUP TestFixture) - -# run tests -add_test(NAME HTTP_UNIT_TEST COMMAND ./gtest_unit WORKING_DIRECTORY ${TEST_RUN_DIR}) - -add_test(NAME HTTP_GET_SINGLE_TRANS_TEST COMMAND ${TEST_MAIN} -b ${CMAKE_CURRENT_SOURCE_DIR}/test_result_json/http_get_single_trans.json - -p ${CMAKE_CURRENT_SOURCE_DIR}/http_pcap/http_get_single_trans.pcap WORKING_DIRECTORY ${TEST_RUN_DIR}) - -add_test(NAME HTTP_GET_SINGLE_TRANS_MSS1_TEST COMMAND ${TEST_MAIN} -b ${CMAKE_CURRENT_SOURCE_DIR}/test_result_json/http_get_single_trans.json - -p ${CMAKE_CURRENT_SOURCE_DIR}/http_pcap/http_get_single_trans.pcap -m 1 WORKING_DIRECTORY ${TEST_RUN_DIR}) - -add_test(NAME HTTP_GET_MULTI_TRANS_TEST COMMAND ${TEST_MAIN} -b ${CMAKE_CURRENT_SOURCE_DIR}/test_result_json/http_get_multi_trans.json - -p ${CMAKE_CURRENT_SOURCE_DIR}/http_pcap/http_get_multi_trans.pcap WORKING_DIRECTORY ${TEST_RUN_DIR}) - -add_test(NAME HTTP_GET_LONG_COOKIE_TEST COMMAND ${TEST_MAIN} -b ${CMAKE_CURRENT_SOURCE_DIR}/test_result_json/http_get_long_cookie.json - -p ${CMAKE_CURRENT_SOURCE_DIR}/http_pcap/http_get_long_cookie.pcap WORKING_DIRECTORY ${TEST_RUN_DIR}) - -add_test(NAME HTTP_GET_ENCODED_URI_TEST COMMAND ${TEST_MAIN} -b ${CMAKE_CURRENT_SOURCE_DIR}/test_result_json/http_get_encoded_uri.json - -p ${CMAKE_CURRENT_SOURCE_DIR}/http_pcap/http_get_encoded_uri.pcap WORKING_DIRECTORY ${TEST_RUN_DIR}) - -add_test(NAME HTTP_RES_GZIP_TEST COMMAND ${TEST_MAIN} -b ${CMAKE_CURRENT_SOURCE_DIR}/test_result_json/http_res_gzip.json - -p ${CMAKE_CURRENT_SOURCE_DIR}/http_pcap/http_res_gzip.pcap WORKING_DIRECTORY ${TEST_RUN_DIR}) - -add_test(NAME HTTP_CHUNKED_RES_GZIP_TEST COMMAND ${TEST_MAIN} -b ${CMAKE_CURRENT_SOURCE_DIR}/test_result_json/http_chunked_res_gzip.json - -p ${CMAKE_CURRENT_SOURCE_DIR}/http_pcap/http_chunked_res_gzip.pcap WORKING_DIRECTORY ${TEST_RUN_DIR}) - -add_test(NAME HTTP_OVER_TCP_KEEPALIVE_TEST COMMAND ${TEST_MAIN} -b ${CMAKE_CURRENT_SOURCE_DIR}/test_result_json/http_over_tcp_keepalive.json - -p ${CMAKE_CURRENT_SOURCE_DIR}/http_pcap/http_over_tcp_keepalive.pcap WORKING_DIRECTORY ${TEST_RUN_DIR}) - -#todo: support http tunnel to fully parse pop3 protocol -add_test(NAME HTTP_TUNNEL_FOR_POP3_TEST COMMAND ${TEST_MAIN} -b ${CMAKE_CURRENT_SOURCE_DIR}/test_result_json/http_tunnel_for_pop3.json - -p ${CMAKE_CURRENT_SOURCE_DIR}/http_pcap/http_tunnel_for_pop3.pcap WORKING_DIRECTORY ${TEST_RUN_DIR}) - -add_test(NAME HTTP_OVER_PPPOE_TEST COMMAND ${TEST_MAIN} -b ${CMAKE_CURRENT_SOURCE_DIR}/test_result_json/http_over_pppoe.json - -p ${CMAKE_CURRENT_SOURCE_DIR}/http_pcap/http_over_pppoe.pcap WORKING_DIRECTORY ${TEST_RUN_DIR}) - -add_test(NAME HTTP_OVER_TLS_TEST COMMAND ${TEST_MAIN} -b ${CMAKE_CURRENT_SOURCE_DIR}/test_result_json/http_over_tls.json - -p ${CMAKE_CURRENT_SOURCE_DIR}/http_pcap/http_over_tls.pcap WORKING_DIRECTORY ${TEST_RUN_DIR}) - -add_test(NAME NON_HTTP_TEST COMMAND ${TEST_MAIN} -b ${CMAKE_CURRENT_SOURCE_DIR}/test_result_json/non_http.json - -p ${CMAKE_CURRENT_SOURCE_DIR}/http_pcap/non_http.pcap WORKING_DIRECTORY ${TEST_RUN_DIR}) - -add_test(NAME HTTP_REQ_1BYTE_SLIDING_WINDOW_TEST COMMAND ${TEST_MAIN} -b ${CMAKE_CURRENT_SOURCE_DIR}/test_result_json/http_req_1byte_sliding_window.json - -p ${CMAKE_CURRENT_SOURCE_DIR}/http_pcap/http_req_1byte_sliding_window.pcap WORKING_DIRECTORY ${TEST_RUN_DIR}) - -add_test(NAME HTTP_RES_1BYTE_SLIDING_WINDOW_TEST COMMAND ${TEST_MAIN} -b ${CMAKE_CURRENT_SOURCE_DIR}/test_result_json/http_res_1byte_sliding_window.json - -p ${CMAKE_CURRENT_SOURCE_DIR}/http_pcap/http_res_1byte_sliding_window.pcap WORKING_DIRECTORY ${TEST_RUN_DIR}) - -add_test(NAME HTTP_NO_CONTENT_LENGTH_TEST COMMAND ${TEST_MAIN} -b ${CMAKE_CURRENT_SOURCE_DIR}/test_result_json/http_no_content_length.json - -p ${CMAKE_CURRENT_SOURCE_DIR}/http_pcap/http_no_content_length.pcap WORKING_DIRECTORY ${TEST_RUN_DIR}) - -add_test(NAME HTTP_POST_MULTIPART_FORM_DATA_TEST COMMAND ${TEST_MAIN} -b ${CMAKE_CURRENT_SOURCE_DIR}/test_result_json/http_post_multipart_form_data.json - -p ${CMAKE_CURRENT_SOURCE_DIR}/http_pcap/http_post_multipart_form_data.pcap WORKING_DIRECTORY ${TEST_RUN_DIR}) - -add_test(NAME HTTP_HEADERS_EXCEED_MAXIMUM_TEST COMMAND ${TEST_MAIN} -b ${CMAKE_CURRENT_SOURCE_DIR}/test_result_json/http_hdrs_exceed_maximum.json - -p ${CMAKE_CURRENT_SOURCE_DIR}/http_pcap/http_hdrs_exceed_maximum.pcap WORKING_DIRECTORY ${TEST_RUN_DIR}) - -#add_test(NAME HTTP_CONNECT_FLOOD_TEST COMMAND ${TEST_MAIN} -b ${CMAKE_CURRENT_SOURCE_DIR}/test_result_json/http_connect_flood.json -# -p ${CMAKE_CURRENT_SOURCE_DIR}/http_pcap/http_connect_flood.pcap WORKING_DIRECTORY ${TEST_RUN_DIR}) - -add_test(NAME HTTP_GET_MALFORMED_TEST COMMAND ${TEST_MAIN} -b ${CMAKE_CURRENT_SOURCE_DIR}/test_result_json/http_get_malformed.json - -p ${CMAKE_CURRENT_SOURCE_DIR}/http_pcap/http_get_malformed.pcap WORKING_DIRECTORY ${TEST_RUN_DIR}) - -add_test(NAME HTTP_HEADER_VALUE_EMPTY_TEST COMMAND ${TEST_MAIN} -b ${CMAKE_CURRENT_SOURCE_DIR}/test_result_json/http_hdr_value_empty.json - -p ${CMAKE_CURRENT_SOURCE_DIR}/http_pcap/http_hdr_value_empty.pcap WORKING_DIRECTORY ${TEST_RUN_DIR}) - -add_test(NAME HTTP_UPGRADE_WEBSOCKET_TEST COMMAND ${TEST_MAIN} -b ${CMAKE_CURRENT_SOURCE_DIR}/test_result_json/http_upgrade_websocket.json - -p ${CMAKE_CURRENT_SOURCE_DIR}/http_pcap/http_upgrade_websocket.pcap WORKING_DIRECTORY ${TEST_RUN_DIR}) - -add_test(NAME HTTP_UPGRADE_HTTP2_TEST COMMAND ${TEST_MAIN} -b ${CMAKE_CURRENT_SOURCE_DIR}/test_result_json/http_upgrade_http2.json - -p ${CMAKE_CURRENT_SOURCE_DIR}/http_pcap/http_upgrade_http2.pcap WORKING_DIRECTORY ${TEST_RUN_DIR}) - -add_test(NAME HTTP_MULTI_PARSE_ERROR_TEST COMMAND ${TEST_MAIN} -b ${CMAKE_CURRENT_SOURCE_DIR}/test_result_json/http_multi_parse_error.json - -p ${CMAKE_CURRENT_SOURCE_DIR}/http_pcap/http_multi_parse_error.pcap WORKING_DIRECTORY ${TEST_RUN_DIR}) - -add_test(NAME HTTP_GET_REQ_PIPELINE_TEST COMMAND ${TEST_MAIN} -b ${CMAKE_CURRENT_SOURCE_DIR}/test_result_json/http_get_req_pipeline.json - -p ${CMAKE_CURRENT_SOURCE_DIR}/http_pcap/http_get_req_pipeline.pcap WORKING_DIRECTORY ${TEST_RUN_DIR}) - -add_test(NAME HTTP_TRANS_PIPELINE_TEST COMMAND ${TEST_MAIN} -b ${CMAKE_CURRENT_SOURCE_DIR}/test_result_json/http_trans_pipeline.json - -p ${CMAKE_CURRENT_SOURCE_DIR}/http_pcap/http_trans_pipeline.pcap WORKING_DIRECTORY ${TEST_RUN_DIR}) - -add_test(NAME HTTP_HEADER_TRUNCATED_IN_KV_TEST COMMAND ${TEST_MAIN} -b ${CMAKE_CURRENT_SOURCE_DIR}/test_result_json/http_hdr_truncated_in_kv.json - -p ${CMAKE_CURRENT_SOURCE_DIR}/http_pcap/http_hdr_truncated_in_kv.pcap WORKING_DIRECTORY ${TEST_RUN_DIR}) - -add_test(NAME HTTP_HEADER_TRUNCATED_AFTER_KV_TEST COMMAND ${TEST_MAIN} -b ${CMAKE_CURRENT_SOURCE_DIR}/test_result_json/http_hdr_truncated_after_kv.json - -p ${CMAKE_CURRENT_SOURCE_DIR}/http_pcap/http_hdr_truncated_after_kv.pcap WORKING_DIRECTORY ${TEST_RUN_DIR}) - -add_test(NAME HTTP_URL_WITH_HOST_TEST COMMAND ${TEST_MAIN} -b ${CMAKE_CURRENT_SOURCE_DIR}/test_result_json/http_url_test_with_host.json - -p ${CMAKE_CURRENT_SOURCE_DIR}/http_pcap/http_url_test_with_host.pcap WORKING_DIRECTORY ${TEST_RUN_DIR}) - -add_test(NAME HTTP_URL_WITHOUT_HOST_TEST COMMAND ${TEST_MAIN} -b ${CMAKE_CURRENT_SOURCE_DIR}/test_result_json/http_url_test_without_host.json - -p ${CMAKE_CURRENT_SOURCE_DIR}/http_pcap/http_url_test_without_host.pcap WORKING_DIRECTORY ${TEST_RUN_DIR}) - -add_test(NAME HTTP_6OVER4_SINGLE_TRANS_TEST COMMAND ${TEST_MAIN} -b ${CMAKE_CURRENT_SOURCE_DIR}/test_result_json/http_6over4_single_trans.json - -p ${CMAKE_CURRENT_SOURCE_DIR}/http_pcap/http_6over4_single_trans.pcap WORKING_DIRECTORY ${TEST_RUN_DIR}) - -add_test(NAME HTTP_POST_SINGLE_TRANS_TEST COMMAND ${TEST_MAIN} -b ${CMAKE_CURRENT_SOURCE_DIR}/test_result_json/http_post_single_trans.json - -p ${CMAKE_CURRENT_SOURCE_DIR}/http_pcap/http_post_single_trans.pcap WORKING_DIRECTORY ${TEST_RUN_DIR}) - -add_test(NAME HTTP_SELF_CONSISTENT_V4_TEST COMMAND ${TEST_MAIN} -b ${CMAKE_CURRENT_SOURCE_DIR}/test_result_json/http_get_single_trans.json - -s ${CMAKE_CURRENT_SOURCE_DIR}/test_result_json/http_get_single_trans.json WORKING_DIRECTORY ${TEST_RUN_DIR}) - -add_test(NAME HTTP_SELF_CONSISTENT_V6_TEST COMMAND ${TEST_MAIN} -b ${CMAKE_CURRENT_SOURCE_DIR}/test_result_json/http_6over4_single_trans.json - -s ${CMAKE_CURRENT_SOURCE_DIR}/test_result_json/http_6over4_single_trans.json WORKING_DIRECTORY ${TEST_RUN_DIR}) - -set_tests_properties(HTTP_UNIT_TEST - HTTP_GET_SINGLE_TRANS_TEST - HTTP_GET_SINGLE_TRANS_MSS1_TEST - HTTP_GET_MULTI_TRANS_TEST - HTTP_GET_LONG_COOKIE_TEST - HTTP_GET_ENCODED_URI_TEST - HTTP_RES_GZIP_TEST - HTTP_CHUNKED_RES_GZIP_TEST - HTTP_OVER_TCP_KEEPALIVE_TEST - HTTP_TUNNEL_FOR_POP3_TEST - HTTP_OVER_PPPOE_TEST - HTTP_OVER_TLS_TEST - NON_HTTP_TEST - HTTP_REQ_1BYTE_SLIDING_WINDOW_TEST - HTTP_RES_1BYTE_SLIDING_WINDOW_TEST - HTTP_NO_CONTENT_LENGTH_TEST - HTTP_POST_MULTIPART_FORM_DATA_TEST - HTTP_HEADERS_EXCEED_MAXIMUM_TEST - HTTP_GET_MALFORMED_TEST - HTTP_HEADER_VALUE_EMPTY_TEST - HTTP_MULTI_PARSE_ERROR_TEST - HTTP_UPGRADE_WEBSOCKET_TEST - HTTP_UPGRADE_HTTP2_TEST - HTTP_GET_REQ_PIPELINE_TEST - HTTP_TRANS_PIPELINE_TEST - HTTP_HEADER_TRUNCATED_IN_KV_TEST - HTTP_HEADER_TRUNCATED_AFTER_KV_TEST - HTTP_URL_WITH_HOST_TEST - HTTP_URL_WITHOUT_HOST_TEST - HTTP_6OVER4_SINGLE_TRANS_TEST - HTTP_POST_SINGLE_TRANS_TEST - HTTP_SELF_CONSISTENT_V4_TEST - HTTP_SELF_CONSISTENT_V6_TEST - PROPERTIES FIXTURES_REQUIRED TestFixture) +add_test(NAME INSTALL_PERF_TEST_MAIN COMMAND sh -c "cp ${CMAKE_CURRENT_BINARY_DIR}/httpd_perf_test ${TEST_RUN_DIR}/httpd_perf_test") +set_tests_properties(INSTALL_PERF_TEST_MAIN + PROPERTIES FIXTURES_REQUIRED TestFixture)
\ No newline at end of file diff --git a/test/http_decoder_driver.cpp b/test/http_decoder_driver.cpp deleted file mode 100644 index be10f97..0000000 --- a/test/http_decoder_driver.cpp +++ /dev/null @@ -1,981 +0,0 @@ -/* - Http Decoder Google Test driver module -*/ -#include <stdio.h> -#include <string.h> -#ifndef __USE_MISC -#define __USE_MISC 1 -#endif -#ifndef __FAVOR_BSD -#define __FAVOR_BSD 1 -#endif -#ifndef __USE_BSD -#define __USE_BSD 1 -#endif -#include <netinet/tcp.h> -#include <netinet/ip.h> -#include <arpa/inet.h> -#include <time.h> -#include <unistd.h> -#include <assert.h> -#include <getopt.h> -#include <gtest/gtest.h> -#include <pcap/pcap.h> -#include "http_decoder_gtest.h" -#include "MESA_jump_layer.h" -#include "base64.h" - -extern "C" int http_decoder_entry(struct session *sess, int events, - const struct packet *pkt, void *cb_arg); -extern "C" void http_decoder_test_exit(void *test_ctx); -extern "C" void *http_decoder_test_init(struct stellar *st); -extern "C" void *http_decoder_init(struct stellar *st); - -static const char *hdgt_cla_short_options = "hb:p:s:m:"; -static const struct option hdgt_cla_long_options[] = - { - {"help", no_argument, NULL, 'h'}, - {"benchmark-file", required_argument, NULL, 'b'}, - {"data-pcap-file", required_argument, NULL, 'p'}, - {"data-json-file", required_argument, NULL, 's'}, - {"mss", required_argument, NULL, 'm'}, - {NULL, 0, NULL, 0}}; - -static const char *g_data_src_json_non_headers[] = { - GTEST_HTTP_URL_NAME, - GTEST_HTTP_TRANS_NAME, - GTEST_HTTP_TRANS_SEQ_NAME, - GTEST_HTTP_TUPLE4_NAME, - GTEST_HTTP_PAYLOAD_NAME, - GTEST_HTTP_PAYLOAD_MD5_NAME, - "method", - "uri", - "req_version", - "major_version", - "minor_version", - "res_version", - "res_status", - "status_code", - NULL}; - -static void hdgt_cmd_usage(int argc, char **argv) -{ - fprintf(stderr, "Usage:\n"); - fprintf(stderr, "\t -b set benchmark json file\n"); - fprintf(stderr, "\t -p set data source as pcap file\n"); - fprintf(stderr, "\t -s set data source as json file\n"); - fprintf(stderr, "\t -m set tcp Max Segment Size\n"); - exit(1); -} - -void hdgt_set_data_source_type(fake_stellar *fst, enum data_source_type_t type) -{ - fst->data_source_type = type; -} - -static int hdgt_parse_cmd_args(fake_stellar *fst, int argc, char **argv) -{ - int c, ret; - - while (1) - { - c = getopt_long(argc, argv, hdgt_cla_short_options, hdgt_cla_long_options, NULL); - if (c == -1) - { - ret = 0; - break; - } - - switch (c) - { - case 'h': - hdgt_cmd_usage(argc, argv); - break; - case 'b': - fst->benchmark_json_file_name = optarg; - break; - case 'p': - hdgt_set_data_source_type(fst, DATA_SOURCE_PCAP); - fst->data_source_file_name = optarg; - break; - case 's': - hdgt_set_data_source_type(fst, DATA_SOURCE_JSON); - fst->data_source_file_name = optarg; - break; - case 'm': - fst->tcp_mss = atoi(optarg); - if (fst->tcp_mss <= 0 || fst->tcp_mss > 65535) - { - DEBUG_PRINT("Invalid tcp mss value! must be [1, 65535]\n"); - hdgt_cmd_usage(argc, argv); - } - break; - default: - return -1; - break; - } - } - - // check args - // if (!fst->benchmark_json_file_name) - // { - // DEBUG_PRINT("benchmark json file is not set!\n"); - // hdgt_cmd_usage(argc, argv); - // return -1; - // } - - if (__DATA_SOURCE_NULL == fst->data_source_type) - { - DEBUG_PRINT("data source is not set!\n"); - hdgt_cmd_usage(argc, argv); - return -1; - } - - return ret; -} - -int hdgt_compare_result(struct fake_stellar *fst) -{ - int final_result = 0; - cJSON_bool case_sensitive = FLASE; - - if (!fst->http_plug_test_result_root) - { - DEBUG_PRINT("Not found test json result!\n"); - return -1; - } - - if (!fst->load_benchmark_json_root) - { - DEBUG_PRINT("Not found benchmark json instance!\n"); - return -1; - } - - if (cJSON_GetArraySize(fst->load_benchmark_json_root) != cJSON_GetArraySize(fst->http_plug_test_result_root)) - { - DEBUG_PRINT("Compare json result: array size is diff!\n"); - final_result++; - } - - int ret = cJSON_Compare(fst->load_benchmark_json_root, fst->http_plug_test_result_root, case_sensitive); - if (ret != TRUE) - { - char *load_json_str = cJSON_Print(fst->load_benchmark_json_root); - printf("LOAD Raw:\n%s\n", load_json_str); - - char *result_json_str = cJSON_Print(fst->http_plug_test_result_root); - printf("TEST Raw:\n%s\n", result_json_str); - - int min_len = MIN(strlen(load_json_str), strlen(result_json_str)); - for (size_t i = 0; i < min_len; i++) - { - if (load_json_str[i] != result_json_str[i]) - { - printf("######### JSON Diff at len:%d: \n\tLOAD: %.*s\n\tTEST: %.*s\n", (int)i, 16, load_json_str + i, 16, result_json_str + i); - break; - } - } - - free(load_json_str); - free(result_json_str); - - cJSON *t_load = fst->load_benchmark_json_root->child; - cJSON *t_test = fst->http_plug_test_result_root->child; - while (t_load != NULL && t_test != NULL) - { - ret = cJSON_Compare(t_load, t_test, case_sensitive); - if (ret != TRUE) - { - load_json_str = cJSON_Print(t_load); - printf("LOAD Diff:\n%s\n", load_json_str); - free(load_json_str); - result_json_str = cJSON_Print(t_test); - printf("TEST Diff:\n%s\n", result_json_str); - free(result_json_str); - final_result++; - } - t_load = t_load->next; - t_test = t_test->next; - } - } - else - { - DEBUG_PRINT("Compare json result success!\n"); - } - - return final_result; -} - -static char *hdgt_get_file_content(const char *filename) -{ - FILE *fp = fopen(filename, "r"); - if (NULL == fp) - { - DEBUG_PRINT("fopen() fail!\n"); - return NULL; - } - fseek(fp, 0, SEEK_END); - long file_size = ftell(fp); - fseek(fp, 0, SEEK_SET); - char *file_content = MMALLOC(char, file_size + 1); - if (fread(file_content, 1, file_size, fp) != file_size) - { - DEBUG_PRINT("fread() %s fail!\n", filename); - fclose(fp); - MFREE(file_content); - return NULL; - } - fclose(fp); - return file_content; -} - -static struct fake_session *hdgt_session_new(struct fake_stellar *fst) -{ - struct fake_session *fses = MMALLOC(struct fake_session, sizeof(struct fake_session)); - - fses->fst = fst; - fses->tcp_mss = fst->tcp_mss; - // todo : get protocol type from packet, not fixed - fses->type = SESSION_TYPE_TCP; - return fses; -} - -static int hdgt_get_packet_from_pcap(struct fake_stellar *fst, struct fake_packet *fpkt) -{ - struct pcap_pkthdr *pkt_hdr; - const u_char *pkt_data; - int ret = pcap_next_ex(fst->pcap_ins, &pkt_hdr, &pkt_data); - if (1 == ret) - { - fpkt->raw_pkt_data = (char *)pkt_data; - fpkt->raw_pkt_data_len = pkt_hdr->caplen; - DEBUG_PRINT("Warning! this is a rough packet decoder, not support tcp out of order, seq overlap...\n"); - return 1; - } - else if (-2 == ret) - { - DEBUG_PRINT("pcap file over!\n"); - return 0; - } - DEBUG_PRINT("pcap_next_ex() fail: %s!\n", pcap_geterr(fst->pcap_ins)); - return -1; -} - -static int hdgt_get_packet_from_json(struct fake_stellar *fst, struct fake_packet *fpkt) -{ - cJSON *json_root = fst->data_src_json_para.json_root; - cJSON *json_item = cJSON_GetArrayItem(json_root, fst->data_src_json_para.current_json_array_idx); - if (NULL == json_item) - { - DEBUG_PRINT("Not found json object at index %d!\n", fst->data_src_json_para.current_json_array_idx); - return -1; - } - fst->data_src_json_para.current_object = json_item; - fst->data_src_json_para.current_json_array_idx++; - return 1; -} - -static int hdgt_is_reserverd_json_header(const cJSON *json_object) -{ - for (size_t i = 0; g_data_src_json_non_headers[i] != NULL; i++) - { - if (strlen(json_object->string) == strlen(g_data_src_json_non_headers[i]) && (0 == strncmp(json_object->string, g_data_src_json_non_headers[i], strlen(g_data_src_json_non_headers[i])))) - { - return 1; - } - } - - return 0; -} - -static int hdgt_get_packet_dir_from_json(cJSON *json) -{ - cJSON *json_dir = cJSON_GetObjectItem(json, GTEST_HTTP_TRANS_NAME); - if (NULL == json_dir) - { - return -1; - } - if (strncasecmp("request", json_dir->valuestring, strlen("request")) == 0) - { - return PACKET_DIRECTION_C2S; - } - else if (strncasecmp("response", json_dir->valuestring, strlen("response")) == 0) - { - return PACKET_DIRECTION_S2C; - } - else - { - return -1; - } -} - -static void hdgt_get_req_line_from_json(struct data_src_json_para_t *data_src_json_para) -{ - cJSON *json_item = data_src_json_para->current_object; - cJSON *method, *uri, *major_version, *minor_version; - - method = cJSON_GetObjectItem(json_item, "method"); - uri = cJSON_GetObjectItem(json_item, "uri"); - major_version = cJSON_GetObjectItem(json_item, "major_version"); - minor_version = cJSON_GetObjectItem(json_item, "minor_version"); - - if (method && uri && major_version && minor_version) - { - sprintf(data_src_json_para->key_value_buf, "%s %s HTTP/%d.%d\r\n", - method->valuestring, uri->valuestring, major_version->valueint, minor_version->valueint); - } - else - { - DEBUG_PRINT("get request line from json fail!\n"); - } -} - -static void hdgt_get_res_line_from_json(struct data_src_json_para_t *data_src_json_para) -{ - cJSON *json_item = data_src_json_para->current_object; - cJSON *res_status, *status_code, *major_version, *minor_version; - - res_status = cJSON_GetObjectItem(json_item, "res_status"); - status_code = cJSON_GetObjectItem(json_item, "status_code"); - major_version = cJSON_GetObjectItem(json_item, "major_version"); - minor_version = cJSON_GetObjectItem(json_item, "minor_version"); - - if (res_status && status_code && major_version && minor_version) - { - sprintf(data_src_json_para->key_value_buf, "HTTP/%d.%d %d %s\r\n", - major_version->valueint, minor_version->valueint, status_code->valueint, res_status->valuestring); - } - else - { - DEBUG_PRINT("get response line from json fail!\n"); - } -} - -static void hdgt_get_headers_from_json(struct data_src_json_para_t *data_src_json_para) -{ - cJSON *json_item = data_src_json_para->current_object->child; - char *data_ptr = data_src_json_para->key_value_buf + strlen(data_src_json_para->key_value_buf); - int len; - - while (json_item) - { - if (0 == hdgt_is_reserverd_json_header(json_item)) - { - if (cJSON_IsString(json_item)) - { - len = sprintf(data_ptr, "%s: %s\r\n", json_item->string, json_item->valuestring); - } - else if (cJSON_IsNumber(json_item)) - { - len = sprintf(data_ptr, "%s: %d\r\n", json_item->string, json_item->valueint); - } - else if (cJSON_IsBool(json_item)) - { - len = sprintf(data_ptr, "%s: %s\r\n", json_item->string, json_item->valueint ? "true" : "false"); - } - else - { - len = sprintf(data_ptr, "%s: %s\r\n", json_item->string, cJSON_Print(json_item)); - } - data_ptr += len; - } - json_item = json_item->next; - } - sprintf(data_ptr, "\r\n"); // headers EOF -} - -static void hdgt_get_body_from_json(struct data_src_json_para_t *data_src_json_para) -{ - cJSON *json_root = data_src_json_para->current_object; - char *data_ptr = data_src_json_para->key_value_buf + strlen(data_src_json_para->key_value_buf); - - // todo, support gzip, deflate, etc. - // todo, cjson not support binary data, need base64 encode/decode - cJSON *json_body = cJSON_GetObjectItem(json_root, GTEST_HTTP_PAYLOAD_NAME); - if (json_body) - { - int base64_cont_len = strlen(json_body->valuestring); - char *raw_cont_buf = (char *)calloc(1, base64_cont_len + 1); - int raw_cont_len = base64_decode(json_body->valuestring, base64_cont_len, (unsigned char *)raw_cont_buf); - sprintf(data_ptr, "%s", raw_cont_buf); - } -} - -static int hdgt_update_packet_detail_by_json(struct fake_stellar *fst, struct fake_packet *fpkt) -{ - fpkt->dir = hdgt_get_packet_dir_from_json(fst->data_src_json_para.current_object); - if (PACKET_DIRECTION_C2S != fpkt->dir && PACKET_DIRECTION_S2C != fpkt->dir) - { - DEBUG_PRINT("get packet direction from json fail!\n"); - return -1; - } - - if (PACKET_DIRECTION_C2S == fpkt->dir) - { - hdgt_get_req_line_from_json(&fst->data_src_json_para); - } - else - { - hdgt_get_res_line_from_json(&fst->data_src_json_para); - } - hdgt_get_headers_from_json(&fst->data_src_json_para); - - hdgt_get_body_from_json(&fst->data_src_json_para); - - fpkt->payload_data = fst->data_src_json_para.key_value_buf; - fpkt->payload_data_len = strlen(fst->data_src_json_para.key_value_buf); - fpkt->payload_submit_offset = 0; - - return 0; -} - -static int hdgt_get_packet(struct fake_stellar *fst, struct fake_packet *fpkt) -{ - int ret = -1; - memset(fpkt, 0, sizeof(struct fake_packet)); - if (DATA_SOURCE_PCAP == fst->data_source_type) - { - ret = hdgt_get_packet_from_pcap(fst, fpkt); - } - else if (DATA_SOURCE_JSON == fst->data_source_type) - { - ret = hdgt_get_packet_from_json(fst, fpkt); - } - else - { - fprintf(stderr, "hdgt_get_packet(): invalid data source type!\n"); - ret = -1; - } - - return ret; -} - -static int hdgt_has_data_left(struct fake_packet *fpkt) -{ - return fpkt->payload_submit_offset < fpkt->payload_data_len; -} - -static int hdgt_get_packet_dir_of_tcp(const struct tcphdr *th) -{ - int dir; - - if (TH_SYN == th->th_flags) - { - dir = PACKET_DIRECTION_C2S; - } - else if ((TH_SYN | TH_ACK) == th->th_flags) - { - dir = PACKET_DIRECTION_S2C; - } - else - { - if (ntohs(th->th_sport) > ntohs(th->th_dport)) // Unwritten rule, not sure - { - dir = PACKET_DIRECTION_C2S; - } - else - { - dir = PACKET_DIRECTION_S2C; - } - } - - return dir; -} - -static void hdgt_determine_packet_dir(struct fake_session *fses, struct fake_packet *fpkt, const struct tcphdr *th) -{ - if (SESSION_ADDR_TYPE_IPV4_TCP == fses->addr_type) - { - if (th->th_sport == fses->addr->ipv4.sport) - { - fpkt->dir = PACKET_DIRECTION_C2S; - } - else - { - fpkt->dir = PACKET_DIRECTION_S2C; - } - } - else - { - if (th->th_sport == fses->addr->ipv6.sport) - { - fpkt->dir = PACKET_DIRECTION_C2S; - } - else - { - fpkt->dir = PACKET_DIRECTION_S2C; - } - } -} - -static void hdgt_update_packet_payload(struct fake_packet *fpkt, const struct tcphdr *th, int from_tcp_len) -{ - // todo, support UDP? - fpkt->payload_data = (char *)th + th->th_off * 4; -#if 0 - /* for ethernet, maybe end with padding bytes, must not use packet length, use ip header len */ - fpkt->payload_data_len = fpkt->raw_pkt_data_len - ((char *)th - fpkt->raw_pkt_data) - (th->th_off * 4); -#else - fpkt->payload_data_len = from_tcp_len - (th->th_off * 4); -#endif - fpkt->payload_submit_offset = 0; -} - -static int hdgt_update_packet_detail_by_pcap(struct fake_session *fses, struct fake_packet *fpkt) -{ - size_t from_tcp_len = 0; - if (SESSION_ADDR_TYPE_IPV4_TCP == fses->addr_type) - { - struct ip *i4h = (struct ip *)MESA_jump_layer_greedy(fpkt->raw_pkt_data, ADDR_TYPE_MAC, ADDR_TYPE_IPV4); - if (NULL == i4h) - { - DEBUG_PRINT("Not found ipv4 header!\n"); - return -1; - } - from_tcp_len = ntohs(i4h->ip_len) - i4h->ip_hl * 4; - } - else - { - struct ip6_hdr *i6h = (struct ip6_hdr *)MESA_jump_layer_greedy(fpkt->raw_pkt_data, ADDR_TYPE_MAC, ADDR_TYPE_IPV6); - if (NULL == i6h) - { - DEBUG_PRINT("Not found ipv6 header!\n"); - return -1; - } - from_tcp_len = ntohs(i6h->ip6_plen); - } - - struct tcphdr *th = (struct tcphdr *)MESA_jump_layer_greedy(fpkt->raw_pkt_data, ADDR_TYPE_MAC, ADDR_TYPE_TCP); - if (NULL == th) - { - DEBUG_PRINT("Not found tcp header!\n"); - return -1; - } - - hdgt_determine_packet_dir(fses, fpkt, th); - hdgt_update_packet_payload(fpkt, th, from_tcp_len); - return 0; -} - -static int hdgt_update_packet_detail(struct fake_session *fses, struct fake_packet *fpkt) -{ - int ret; - if (DATA_SOURCE_PCAP == fses->fst->data_source_type) - { - ret = hdgt_update_packet_detail_by_pcap(fses, fpkt); - } - else - { - ret = hdgt_update_packet_detail_by_json(fses->fst, fpkt); - } - return ret; -} - -static struct session_addr *hgdt_get_session_addr_by_pcap(struct fake_session *fses, struct fake_packet *fpkt) -{ - if (fses->addr != NULL) - { - return fses->addr; - } - - struct session_addr tmp_addr = {}; - int innermost_l3_layer_type; - - struct tcphdr *th = (struct tcphdr *)MESA_jump_layer_greedy(fpkt->raw_pkt_data, ADDR_TYPE_MAC, ADDR_TYPE_TCP); - if (NULL == th) - { - DEBUG_PRINT("Not found tcp header!\n"); - // todo, support UDP ? - return NULL; - } - fpkt->l4_header = (char *)th; - struct ip *i4h = (struct ip *)MESA_jump_layer_greedy(fpkt->raw_pkt_data, ADDR_TYPE_MAC, ADDR_TYPE_IPV4); - struct ip6_hdr *i6h = (struct ip6_hdr *)MESA_jump_layer_greedy(fpkt->raw_pkt_data, ADDR_TYPE_MAC, ADDR_TYPE_IPV6); - if ((NULL == i6h) && (NULL == i4h)) - { - DEBUG_PRINT("Not found ipv4 or ipv6 header!\n"); - return NULL; - } - - if (i4h && (NULL == i6h)) - { - innermost_l3_layer_type = ADDR_TYPE_IPV4; - } - else if (i6h && (NULL == i4h)) - { - innermost_l3_layer_type = ADDR_TYPE_IPV6; - } - else // both ipv4 and ipv6 exist, maybe 4over6, 6over4, gtp etc. - { - if ((char *)i4h - (char *)i6h > 0) - { - innermost_l3_layer_type = ADDR_TYPE_IPV4; - } - else - { - innermost_l3_layer_type = ADDR_TYPE_IPV6; - } - } - - int cur_pkt_dir = hdgt_get_packet_dir_of_tcp(th); - - if (ADDR_TYPE_IPV4 == innermost_l3_layer_type) - { - fses->addr_type = SESSION_ADDR_TYPE_IPV4_TCP; - if (PACKET_DIRECTION_C2S == cur_pkt_dir) - { - - tmp_addr.ipv4.saddr = i4h->ip_src.s_addr; - tmp_addr.ipv4.daddr = i4h->ip_dst.s_addr; - tmp_addr.ipv4.sport = th->th_sport; - tmp_addr.ipv4.dport = th->th_dport; - } - else - { - tmp_addr.ipv4.saddr = i4h->ip_dst.s_addr; - tmp_addr.ipv4.daddr = i4h->ip_src.s_addr; - tmp_addr.ipv4.sport = th->th_dport; - tmp_addr.ipv4.dport = th->th_sport; - } - } - else - { - fses->addr_type = SESSION_ADDR_TYPE_IPV6_TCP; - if (PACKET_DIRECTION_C2S == cur_pkt_dir) - { - memcpy(tmp_addr.ipv6.saddr, i6h->ip6_src.s6_addr, IPV6_ADDR_LEN); - memcpy(tmp_addr.ipv6.daddr, i6h->ip6_dst.s6_addr, IPV6_ADDR_LEN); - tmp_addr.ipv6.sport = th->th_sport; - tmp_addr.ipv6.dport = th->th_dport; - } - else - { - memcpy(tmp_addr.ipv6.saddr, i6h->ip6_dst.s6_addr, IPV6_ADDR_LEN); - memcpy(tmp_addr.ipv6.daddr, i6h->ip6_src.s6_addr, IPV6_ADDR_LEN); - tmp_addr.ipv6.sport = th->th_dport; - tmp_addr.ipv6.dport = th->th_sport; - } - } - - fses->addr = MMALLOC(struct session_addr, sizeof(struct session_addr)); - memcpy(fses->addr, &tmp_addr, sizeof(struct session_addr)); - - return fses->addr; -} - -/* example: "1.1.1.1.12345>2.2.2.2.80" */ -static void hdgt_json_session_adddr_pton_v4(struct session_addr *addr, const char *tuple4_cstr) -{ - const char *delim = ".>"; - char *dup_str = strdup(tuple4_cstr); - char *sip1 = strtok(dup_str, delim); - char *sip2 = strtok(NULL, delim); - char *sip3 = strtok(NULL, delim); - char *sip4 = strtok(NULL, delim); - char *sport = strtok(NULL, delim); - - char *dip1 = strtok(NULL, delim); - char *dip2 = strtok(NULL, delim); - char *dip3 = strtok(NULL, delim); - char *dip4 = strtok(NULL, delim); - char *dport = strtok(NULL, delim); - - char sip_str[INET_ADDRSTRLEN] = {}; - char dip_str[INET_ADDRSTRLEN] = {}; - sprintf(sip_str, "%s.%s.%s.%s", sip1, sip2, sip3, sip4); - inet_pton(AF_INET, sip_str, &addr->ipv4.saddr); - sprintf(dip_str, "%s.%s.%s.%s", dip1, dip2, dip3, dip4); - inet_pton(AF_INET, dip_str, &addr->ipv4.daddr); - addr->ipv4.sport = htons(atoi(sport)); - addr->ipv4.dport = htons(atoi(dport)); -} - -/* fe80::8c19:7aff:fef2:11e5.12345>fe80::8c19:7aff:fef2:11e5.80 */ -static void hdgt_json_session_adddr_pton_v6(struct session_addr *addr, const char *tuple4_cstr) -{ - char *dup_str = strdup(tuple4_cstr); - char *sip = dup_str; - char *ptr = strchr(dup_str, '.'); - *ptr = '\0'; - ptr++; - char *sport = ptr; - ptr = strchr(sport, '>'); - *ptr = '\0'; - ptr++; - char *dip = ptr; - ptr = strchr(dip, '.'); - *ptr = '\0'; - ptr++; - char *dport = ptr; - - char sip_str[INET6_ADDRSTRLEN] = {}; - char dip_str[INET6_ADDRSTRLEN] = {}; - inet_pton(AF_INET6, sip, addr->ipv6.saddr); - inet_pton(AF_INET6, dip, addr->ipv6.daddr); - addr->ipv6.sport = htons(atoi(sport)); - addr->ipv6.dport = htons(atoi(dport)); -} - -static void hdgt_json_session_adddr_pton(struct fake_session *fses, const char *tuple4_cstr) -{ - struct session_addr *addr = fses->addr; - if (strchr(tuple4_cstr, ':') != NULL) - { - hdgt_json_session_adddr_pton_v6(addr, tuple4_cstr); - fses->addr_type = SESSION_ADDR_TYPE_IPV6_TCP; - return; - } - else - { - hdgt_json_session_adddr_pton_v4(addr, tuple4_cstr); - fses->addr_type = SESSION_ADDR_TYPE_IPV4_TCP; - } -} - -static struct session_addr *hgdt_get_session_addr_by_json(struct fake_session *fses, struct fake_packet *fpkt) -{ - if (fses->addr != NULL) - { - return fses->addr; - } - - cJSON *tuple4_obj = cJSON_GetObjectItem(fses->fst->data_src_json_para.current_object, GTEST_HTTP_TUPLE4_NAME); - if (NULL == tuple4_obj) - { - fprintf(stderr, "Not found tuple4 object!\n"); - return NULL; - } - fses->addr = MMALLOC(struct session_addr, sizeof(struct session_addr)); - hdgt_json_session_adddr_pton(fses, tuple4_obj->valuestring); - return fses->addr; -} - -static struct session_addr *hgdt_get_session_addr(struct fake_session *fses, struct fake_packet *fpkt) -{ - if (fses->fst->data_source_type == DATA_SOURCE_PCAP) - { - return hgdt_get_session_addr_by_pcap(fses, fpkt); - } - return hgdt_get_session_addr_by_json(fses, fpkt); -} - -static void hdgt_session_update(struct fake_stellar *fst, struct fake_session *fses, int event) -{ - fst->http_decoder_entry((struct session *)fses, event, (struct packet *)fses->fpkt, fst->http_decoder_ctx); -} - -int hdgt_data_source_init_by_json_text(struct fake_stellar *fst, const char *json_cont) -{ - fst->data_src_json_para.json_root = cJSON_Parse(json_cont); - if (NULL == fst->data_src_json_para.json_root) - { - fprintf(stderr, "cJSON_Parse() %s fail!\n", json_cont); - return -1; - } - fst->data_src_json_para.json_array_size = cJSON_GetArraySize(fst->data_src_json_para.json_root); - fst->data_src_json_para.current_json_array_idx = 0; - return 0; -} - -int hdgt_data_source_init_by_json_file(struct fake_stellar *fst, const char *json_file) -{ - char *file_cont = hdgt_get_file_content(json_file); - int ret; - if (NULL == file_cont) - { - fprintf(stderr, "Open json file fail: %s\n", json_file); - return -1; - } - ret = hdgt_data_source_init_by_json_text(fst, file_cont); - MFREE(file_cont); - return ret; -} - -int hdgt_data_source_init(struct fake_stellar *fst) -{ - if (DATA_SOURCE_PCAP == fst->data_source_type) - { - char errbuf[PCAP_ERRBUF_SIZE]; - fst->pcap_ins = pcap_open_offline(fst->data_source_file_name, errbuf); - if (NULL == fst->pcap_ins) - { - fprintf(stderr, "pcap_open_offline() fail: %s\n", errbuf); - return -1; - } - } - else if (DATA_SOURCE_JSON == fst->data_source_type) - { - return hdgt_data_source_init_by_json_file(fst, fst->data_source_file_name); - } - else - { - DEBUG_PRINT("Invalid data source type!\n"); - return -1; - } - - return 0; -} - -static void hdgt_prune_non_result_item(cJSON *benchmark_json_root) -{ - int array_size = cJSON_GetArraySize(benchmark_json_root); - - for (int i = 0; i < array_size; i++) - { - cJSON *object_root = cJSON_GetArrayItem(benchmark_json_root, i); - cJSON_DeleteItemFromObject(object_root, GTEST_HTTP_PAYLOAD_NAME); - } -} - -static int hdgt_benchmakr_json_parse(struct fake_stellar *fst) -{ - char *file_cont = hdgt_get_file_content(fst->benchmark_json_file_name); - if (NULL == file_cont) - { - fprintf(stderr, "Open json file fail: %s\n", fst->benchmark_json_file_name); - return -1; - } - fst->load_benchmark_json_root = cJSON_Parse(file_cont); - if (NULL == fst->load_benchmark_json_root) - { - fprintf(stderr, "cJSON_Parse() %s fail!\n", fst->benchmark_json_file_name); - MFREE(file_cont); - return -1; - } - fst->http_plug_test_result_root = cJSON_CreateArray(); - MFREE(file_cont); - - hdgt_prune_non_result_item(fst->load_benchmark_json_root); - return 0; -} - -int hdgt_under_test_module_init(struct fake_stellar *fst, HTTP_DECODER_INIT_FUN_T init_fun, HTTP_DECODER_ENTRY_FUN_T entry_fun) -{ - fst->http_decoder_ctx = init_fun((struct stellar *)fst); - fst->http_decoder_entry = entry_fun; - return 0; -} - -int hdgt_test_plug_init(struct fake_stellar *fst, HTTP_DECODER_INIT_FUN_T init_fun, HTTP_DECODER_PLUG_ENTRY_FUN_T entry_fun) -{ - http_decoder_plug_set_entry_fuc(entry_fun); - fst->http_http_plug_ctx = init_fun((struct stellar *)fst); - return 0; -} - -struct fake_stellar *hdgt_create(void) -{ - struct fake_stellar *fst = MMALLOC(struct fake_stellar, sizeof(struct fake_stellar)); - fst->tcp_mss = 1460; // set default value - return fst; -} - -int hdgt_init_once(struct fake_stellar *fst, int argc, char **argv, - HTTP_DECODER_INIT_FUN_T hd_init_fun, HTTP_DECODER_ENTRY_FUN_T hd_entry_fun, - HTTP_DECODER_INIT_FUN_T hd_plug_init_fun, HTTP_DECODER_PLUG_ENTRY_FUN_T hd_plug_entry_fun) -{ - if (hdgt_parse_cmd_args(fst, argc, argv) < 0) - { - fprintf(stderr, "hdgt_parse_cmd_args() fail!\n"); - goto fail_exit; - } - if (hdgt_data_source_init(fst) < 0) - { - fprintf(stderr, "hdgt_data_source_init() fail!\n"); - goto fail_exit; - } - if (hdgt_benchmakr_json_parse(fst) < 0) - { - fprintf(stderr, "hdgt_benchmakr_json_parse() fail!\n"); - goto fail_exit; - } - if (hdgt_under_test_module_init(fst, hd_init_fun, hd_entry_fun) < 0) - { - fprintf(stderr, "hdgt_under_test_module_init() fail!\n"); - goto fail_exit; - } - if (hdgt_test_plug_init(fst, hd_plug_init_fun, hd_plug_entry_fun) < 0) - { - fprintf(stderr, "hdgt_test_plug_init() fail!\n"); - goto fail_exit; - } - - return 0; - -fail_exit: - return -1; -} - -void hdgt_destroy(struct fake_stellar *fst) -{ - cJSON_free(fst->load_benchmark_json_root); - cJSON_free(fst->http_plug_test_result_root); - if (fst->data_src_json_para.json_root) - { - cJSON_free(fst->data_src_json_para.json_root); - } - if (fst->pcap_ins) - { - pcap_close(fst->pcap_ins); - } - - MFREE(fst); - return; -} - -static void hdgt_session_free(struct fake_session *fses) -{ - const struct fake_exdata_manage *ex_mgr = fses->fst->fake_exdata_mgr; - - for (int i = 0; i < EX_DATA_MAX_SIZE; i++) - { - if (fses->plug_exdata_array[i] != NULL) - { - ex_mgr[i].free_func((struct session *)fses, i, fses->plug_exdata_array[i], ex_mgr[i].arg); - } - } - - if (fses->readable_addr_cstr) - { - MFREE(fses->readable_addr_cstr); - } - - if (fses->addr) - { - MFREE(fses->addr); - } - - MFREE(fses); -} - -void hdgt_main_loop(struct fake_stellar *fst) -{ - struct fake_packet __null_pkt = {}; - struct fake_packet fpkt = {}; - struct fake_session *fses = hdgt_session_new(fst); - - fses->fpkt = &__null_pkt; - hdgt_session_update(fst, fses, SESS_EV_OPENING); - - fses->fpkt = &fpkt; - while (hdgt_get_packet(fst, &fpkt) == 1) - { - if (NULL == hgdt_get_session_addr(fses, &fpkt)) - { - continue; // not tcp, not ip - } - if (hdgt_update_packet_detail(fses, &fpkt) < 0) - { - continue; - } - while (hdgt_has_data_left(&fpkt)) - { - hdgt_session_update(fst, fses, SESS_EV_PACKET); - } - } - - fses->fpkt = &__null_pkt; - hdgt_session_update(fst, fses, SESS_EV_CLOSING); - - hdgt_session_free(fses); -} diff --git a/test/http_decoder_gtest.cpp b/test/http_decoder_gtest.cpp index a853080..a135081 100644 --- a/test/http_decoder_gtest.cpp +++ b/test/http_decoder_gtest.cpp @@ -28,8 +28,8 @@ extern "C" #include "stellar/session_mq.h" #include "md5.h" int commit_test_result_json(cJSON *node, const char *name); - extern int http_decoder_test_entry(struct session *sess, int topic_id, const void *data,void *cb_arg); - static HTTP_DECODER_PLUG_ENTRY_FUN_T g_entry_fun = http_decoder_test_entry; + extern void http_decoder_test_entry(struct session *sess, int topic_id, const void *raw_msg, void *no_use_ctx, void *plugin_env); + static on_msg_cb_func *g_entry_fun = http_decoder_test_entry; } #endif @@ -51,8 +51,9 @@ struct gtest_plug_exdata_t static int g_result_count = 0; static int g_header_count = 1; -static int g_exdata_idx = 0; -static int g_topic_id = 0; +static int g_http_gtest_plugin_id = -1; +static int g_exdata_idx = -1; +static int g_topic_id = -1; @@ -224,7 +225,7 @@ void http_url_add_to_json(cJSON *ctx, struct http_message *msg) // Full duplex static void commit_last_half_flow_data(struct session *sess, struct gtest_plug_exdata_t *gtest_plug_exdata, - struct http_message *msg, enum http_transaction_type type) + struct http_message *msg, enum http_transaction_type type, int final) { char result_name[MAX_KEY_STR_LEN] = {0}; @@ -253,18 +254,20 @@ static void commit_last_half_flow_data(struct session *sess, struct gtest_plug_e g_result_count++; } - gtest_plug_exdata->result_jnode[type] = cJSON_CreateObject(); - if (HTTP_TRANSACTION_REQ == type) - { - cJSON_AddStringToObject(gtest_plug_exdata->result_jnode[type], GTEST_HTTP_TRANS_NAME, "request"); - } - else if (HTTP_TRANSACTION_RES == type) - { - cJSON_AddStringToObject(gtest_plug_exdata->result_jnode[type], GTEST_HTTP_TRANS_NAME, "response"); - } - if (msg) - { - transaction_index_to_json(gtest_plug_exdata->result_jnode[type], http_message_get_transaction_seq(msg)); + if(0 == final){ + gtest_plug_exdata->result_jnode[type] = cJSON_CreateObject(); + if (HTTP_TRANSACTION_REQ == type) + { + cJSON_AddStringToObject(gtest_plug_exdata->result_jnode[type], GTEST_HTTP_TRANS_NAME, "request"); + } + else if (HTTP_TRANSACTION_RES == type) + { + cJSON_AddStringToObject(gtest_plug_exdata->result_jnode[type], GTEST_HTTP_TRANS_NAME, "response"); + } + if (msg) + { + transaction_index_to_json(gtest_plug_exdata->result_jnode[type], http_message_get_transaction_seq(msg)); + } } } @@ -285,22 +288,21 @@ static void http_decoder_test_update_session_tuple4(struct session *sess, struct } } -extern "C" int -http_decoder_test_entry(struct session *sess, int topic_id, const void *data, - void *cb_arg) +extern "C" void http_decoder_test_entry(struct session *sess, int topic_id, const void *raw_msg, void *no_use_ctx, void *plugin_env) +// extern "C" int http_decoder_test_entry(struct session *sess, int topic_id, const void *data, void *cb_arg) { struct http_request_line req_line = {0}; struct http_response_line res_line = {0}; struct http_header header = {0}; struct hstring body = {0}; - struct http_message *msg = (struct http_message *)data; + struct http_message *msg = (struct http_message *)raw_msg; enum http_message_type msg_type = http_message_type(msg); - struct gtest_plug_exdata_t *gtest_plug_exdata = (struct gtest_plug_exdata_t *)session_get_ex_data(sess, g_exdata_idx); + struct gtest_plug_exdata_t *gtest_plug_exdata = (struct gtest_plug_exdata_t *)session_exdata_get(sess, g_exdata_idx); if (NULL == gtest_plug_exdata) { gtest_plug_exdata = (struct gtest_plug_exdata_t *)calloc(1, sizeof(struct gtest_plug_exdata_t)); - session_set_ex_data(sess, g_exdata_idx, gtest_plug_exdata); + session_exdata_set(sess, g_exdata_idx, gtest_plug_exdata); } if (msg_type == HTTP_MESSAGE_REQ_LINE || msg_type == HTTP_MESSAGE_REQ_HEADER || msg_type == HTTP_MESSAGE_REQ_BODY) @@ -317,7 +319,7 @@ http_decoder_test_entry(struct session *sess, int topic_id, const void *data, switch (msg_type) { case HTTP_MESSAGE_REQ_LINE: - commit_last_half_flow_data(sess, gtest_plug_exdata, msg, HTTP_TRANSACTION_REQ); + commit_last_half_flow_data(sess, gtest_plug_exdata, msg, HTTP_TRANSACTION_REQ, 0); http_message_get_request_line(msg, &req_line); req_line_to_json(gtest_plug_exdata->result_jnode[HTTP_TRANSACTION_REQ], &req_line); break; @@ -337,7 +339,7 @@ http_decoder_test_entry(struct session *sess, int topic_id, const void *data, append_http_payload(sess, gtest_plug_exdata, &body, HTTP_TRANSACTION_REQ); break; case HTTP_MESSAGE_RES_LINE: - commit_last_half_flow_data(sess, gtest_plug_exdata, msg, HTTP_TRANSACTION_RES); + commit_last_half_flow_data(sess, gtest_plug_exdata, msg, HTTP_TRANSACTION_RES, 0); http_message_get_response_line(msg, &res_line); res_line_to_json(gtest_plug_exdata->result_jnode[HTTP_TRANSACTION_RES], &res_line); break; @@ -361,22 +363,21 @@ http_decoder_test_entry(struct session *sess, int topic_id, const void *data, break; } - return 0; + return; } -void http_decoder_test_exdata_free(struct session *sess, int idx, void *ex_ptr, - void *arg) +void http_decoder_test_exdata_free(struct session *sess, int idx, void *ex_ptr, void *arg) { if (ex_ptr != NULL) { struct gtest_plug_exdata_t *gtest_plug_exdata = (struct gtest_plug_exdata_t *)ex_ptr; if (gtest_plug_exdata->result_jnode[HTTP_TRANSACTION_REQ]) { - commit_last_half_flow_data(sess, gtest_plug_exdata, NULL, HTTP_TRANSACTION_REQ); + commit_last_half_flow_data(sess, gtest_plug_exdata, NULL, HTTP_TRANSACTION_REQ, 1); } if (gtest_plug_exdata->result_jnode[HTTP_TRANSACTION_RES]) { - commit_last_half_flow_data(sess, gtest_plug_exdata, NULL, HTTP_TRANSACTION_RES); + commit_last_half_flow_data(sess, gtest_plug_exdata, NULL, HTTP_TRANSACTION_RES, 1); } free(ex_ptr); } @@ -384,29 +385,26 @@ void http_decoder_test_exdata_free(struct session *sess, int idx, void *ex_ptr, extern "C" void *http_decoder_test_init(struct stellar *st) { - g_exdata_idx = - stellar_session_get_ex_new_index(st, "HTTP_DECODER_REQ_TEST", + g_http_gtest_plugin_id = stellar_session_plugin_register(st, NULL, NULL, NULL); + g_exdata_idx = stellar_session_exdata_new_index(st, "HTTP_DECODER_REQ_TEST", http_decoder_test_exdata_free, - NULL); + NULL); if (g_exdata_idx < 0) { - printf("[%s:%d]: can't get http_decoder exdata index !!!\n", - __FUNCTION__, __LINE__); - exit(-1); + printf("[%s:%d]: can't get http_decoder exdata index !!!\n", __FUNCTION__, __LINE__); + return NULL; } - g_topic_id = session_mq_get_topic_id(st, "HTTP_DECODER_MESSAGE"); + g_topic_id = stellar_session_mq_get_topic_id(st, HTTP_DECODER_TOPIC); if (g_topic_id < 0) { - printf("[%s:%d]: can't get http_decoder topic id !!!\n", - __FUNCTION__, __LINE__); - exit(-1); + printf("[%s:%d]: can't get http_decoder topic id !!!\n", __FUNCTION__, __LINE__); + return NULL; } + stellar_session_mq_subscribe(st, g_topic_id, g_entry_fun, g_http_gtest_plugin_id); + printf("http_decoder_test_init succ, plugin_id:%d, topic_id:%d\n", g_http_gtest_plugin_id, g_topic_id); - session_mq_subscribe_topic(st, g_topic_id, g_entry_fun, NULL); - // printf("http_decoder_test_init OK!\n"); - - return NULL; + return (void *)strdup("http_decoder_test_ctx"); } extern "C" void http_decoder_test_exit(void *test_ctx) @@ -415,11 +413,10 @@ extern "C" void http_decoder_test_exit(void *test_ctx) { FREE(test_ctx); } - printf("http_decoder_test_exit OK!\n"); } -extern "C" void http_decoder_plug_set_entry_fuc(HTTP_DECODER_PLUG_ENTRY_FUN_T entry_fun) +extern "C" void http_decoder_plug_set_entry_fuc(on_msg_cb_func *entry_fun) { g_entry_fun = entry_fun; }
\ No newline at end of file diff --git a/test/http_decoder_gtest.h b/test/http_decoder_gtest.h index 8e83a70..4bdd840 100644 --- a/test/http_decoder_gtest.h +++ b/test/http_decoder_gtest.h @@ -1,7 +1,8 @@ #pragma once #include "http_decoder.h" -#include "session.h" +#include "stellar/session.h" +#include "stellar/session_mq.h" #include "md5.h" #include <stdint.h> #include <stdlib.h> @@ -42,87 +43,4 @@ #define GTEST_HTTP_TRANS_SEQ_NAME "__X_HTTP_TRANSACTION_SEQ" #define GTEST_HTTP_TUPLE4_NAME "__X_HTTP_TUPLE4" #define GTEST_HTTP_PAYLOAD_NAME "__X_HTTP_PAYLOAD" -#define GTEST_HTTP_PAYLOAD_MD5_NAME "__X_HTTP_PAYLOAD_MD5" - -struct fake_exdata_manage -{ - char *name; - int name_len; - void *arg; - void (*free_func)(struct session *sess, int idx, void *ex_ptr, void *arg); -}; - -struct fake_packet -{ - int dir; - size_t raw_pkt_data_len; - const char *raw_pkt_data; // referred to packet Ethernet MAC header - const char *l4_header; // referred to TCP, UDP header - size_t payload_data_len; - const char *payload_data; // referred to L7 data, such as HTTP, DNS, etc. - size_t payload_submit_offset; -}; - -enum data_source_type_t -{ - __DATA_SOURCE_NULL = 0, - DATA_SOURCE_PCAP, - DATA_SOURCE_JSON, - __DATA_SOURCE_MAX -}; - -struct data_src_json_para_t -{ - cJSON *json_root; - cJSON *current_object; - int json_array_size; - int current_json_array_idx; - char key_value_buf[JSON_KEY_VALUE_STRING_MAX_LEN]; -}; - -struct fake_stellar -{ - struct fake_exdata_manage fake_exdata_mgr[EX_DATA_MAX_SIZE]; - int tcp_mss; - void *http_decoder_ctx; - void *http_http_plug_ctx; - int (*http_decoder_entry)(struct session *sess, int events, - const struct packet *pkt, void *cb_arg); - cJSON *http_plug_test_result_root; - enum data_source_type_t data_source_type; - const char *benchmark_json_file_name; - const char *data_source_file_name; - cJSON *load_benchmark_json_root; - pcap_t *pcap_ins; - - struct data_src_json_para_t data_src_json_para; -}; - -struct fake_session -{ - enum session_type type; - struct fake_stellar *fst; - struct fake_packet *fpkt; - int events; - int tcp_mss; - enum session_addr_type addr_type; - struct session_addr *addr; - char *readable_addr_cstr; - void *plug_exdata_array[EX_DATA_MAX_SIZE]; -}; - -typedef void *(*HTTP_DECODER_INIT_FUN_T)(struct stellar *st); -typedef int (*HTTP_DECODER_ENTRY_FUN_T)(struct session *sess, int events, const struct packet *pkt, void *cb_arg); -typedef int (*HTTP_DECODER_PLUG_ENTRY_FUN_T)(struct session *sess, int topic_id, const void *data, void *cb_arg); -extern struct fake_stellar *hdgt_create(void); -extern int hdgt_init_once(struct fake_stellar *fst, int argc, char **argv, - HTTP_DECODER_INIT_FUN_T hd_init_fun, HTTP_DECODER_ENTRY_FUN_T hd_entry_fun, - HTTP_DECODER_INIT_FUN_T hd_plug_init_fun, HTTP_DECODER_PLUG_ENTRY_FUN_T hd_plug_entry_fun); -extern int hdgt_data_source_init_by_json_text(struct fake_stellar *fst, const char *json_cont); -int hdgt_under_test_module_init(struct fake_stellar *fst, HTTP_DECODER_INIT_FUN_T init_fun, HTTP_DECODER_ENTRY_FUN_T entry_fun); -int hdgt_test_plug_init(struct fake_stellar *fst, HTTP_DECODER_INIT_FUN_T init_fun, HTTP_DECODER_PLUG_ENTRY_FUN_T entry_fun); -extern void hdgt_main_loop(struct fake_stellar *fst); -extern void hdgt_destroy(struct fake_stellar *fst); -extern int hdgt_compare_result(struct fake_stellar *fst); -extern void hdgt_set_data_source_type(fake_stellar *fst, enum data_source_type_t type); -extern "C" void http_decoder_plug_set_entry_fuc(HTTP_DECODER_PLUG_ENTRY_FUN_T entry_fun);
\ No newline at end of file +#define GTEST_HTTP_PAYLOAD_MD5_NAME "__X_HTTP_PAYLOAD_MD5"
\ No newline at end of file diff --git a/test/http_decoder_perf_main.cpp b/test/http_decoder_perf_main.cpp new file mode 100644 index 0000000..93e13ad --- /dev/null +++ b/test/http_decoder_perf_main.cpp @@ -0,0 +1,358 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <assert.h> +#include <time.h> +#include "http_decoder_inc.h" + +#define TIME_MEASURE 1 +#if TIME_MEASURE +#define TIME_START() struct timespec _start_time, _end_time; clock_gettime(CLOCK_REALTIME, &_start_time) +#define TIME_DIFF() \ + long long time_diff_ns;\ + do { \ + clock_gettime(CLOCK_REALTIME, &_end_time); \ + if (likely(_end_time.tv_sec == _start_time.tv_sec))\ + {\ + time_diff_ns = (_end_time.tv_nsec - _start_time.tv_nsec);\ + }else{\ + time_diff_ns = (_end_time.tv_sec * 1000 * 1000 * 1000 + _end_time.tv_nsec) - (_start_time.tv_sec * 1000 * 1000 * 1000 + _start_time.tv_nsec);\ + }\ + }while (0) +#else +#define TIME_START() +#define TIME_DIFF() +#endif + +struct packet{ + const char *payload; + size_t payload_len; + u_int8_t dir; +}; + +struct stellar{ + int plugin_id; + void *plugin_env; + int exdata_id; + void *exdata; + int consumer_topid_id; + int publish_topic_id; + session_exdata_free *free_func; + msg_free_cb_func *publish_msg_free_cb; +}; + +struct session{ + struct stellar *st; + struct session_addr addr; + void *context; + void *exdata; + void *message; + const struct packet *current_payload_st; +}; + +extern "C" void *http_decoder_init(struct stellar *st); +extern "C" void http_decoder_exit(void *plugin_env); +extern "C" void *_httpd_session_ctx_new_cb(struct session *sess, void *plugin_env); +extern "C" void _httpd_ex_data_free_cb(struct session *s, int idx,void *ex_data, void *arg); +extern "C" void http_decoder_tcp_stream_msg_cb(struct session *sess, int topic_id, const void *msg, void *no_use_ctx, void *plugin_env); +extern "C" void http_decoder_perf_entry(struct session *sess, int topic_id, const void *raw_msg, void *per_session_ctx, void *plugin_env); + +static struct fieldstat_easy *fs4_instance; +static struct fieldstat_tag FS4_SIMPLE_HISGRAM_TAG; +static int fs4_simple_id; + +static struct fieldstat_tag FS4_LONG_LONG_URL_HISGRAM_TAG; +static int fs4_long_long_url_id; + +static struct fieldstat_tag FS4_FRAG_HISGRAM_TAG; +static int fs4_frag_id; + +void stellar_session_plugin_dettach_current_session(struct session *sess) +{ + return; +} + +int stellar_session_mq_destroy_topic(struct stellar *st, int topic_id) +{ + return 0; +} +int stellar_get_worker_thread_num(struct stellar *st) +{ + return 1; +} +int stellar_get_current_thread_id(struct stellar *st) +{ + return 0; +} +int stellar_session_plugin_register(struct stellar *st, + session_ctx_new_func session_ctx_new, + session_ctx_free_func session_ctx_free, + void *plugin_env) +{ + return 0; +} +int stellar_session_exdata_new_index(struct stellar *st, const char *name, session_exdata_free *free_func,void *arg) +{ + st->free_func = free_func; + return 0; +} +int session_exdata_set(struct session *sess, int idx, void *ex_ptr) +{ + sess->exdata = ex_ptr; + return 0; +} +void *session_exdata_get(struct session *sess, int idx) +{ + return sess->exdata; +} + +int stellar_session_mq_get_topic_id(struct stellar *st, const char *topic_name) +{ + if(strcmp(topic_name, "HTTP_DECODER_MESSAGE") == 0){ + return st->publish_topic_id; + } + if(strcmp(topic_name, "TCP_STREAM") == 0){ + return st->consumer_topid_id; + } + assert(0); + return -1; +} + +int stellar_session_mq_create_topic(struct stellar *st, const char *topic_name, msg_free_cb_func *msg_free_cb, void *msg_free_arg) +{ + if(strcmp(topic_name, "HTTP_DECODER_MESSAGE") == 0){ + st->publish_topic_id = 1; + st->publish_msg_free_cb = msg_free_cb; + return 1; + } + if(strcmp(topic_name, "TCP_STREAM") == 0){ + st->consumer_topid_id = 2; + return 2; + } + return -1; +} +const char *session_get0_current_payload(struct session *sess, size_t *payload_len) +{ + const struct packet *test_payload = sess->current_payload_st; + *payload_len = test_payload->payload_len; + return test_payload->payload; +} + + +struct session_addr *session_get0_addr(struct session *sess, enum session_addr_type *addr_type) +{ + *addr_type = SESSION_ADDR_TYPE_IPV4_TCP; + return &sess->addr; +} + +int packet_get_direction(const struct packet *pkt) +{ + return pkt->dir; +} + +const struct packet *session_get0_current_packet(struct session *sess) +{ + return sess->current_payload_st; +} +int stellar_session_mq_subscribe(struct stellar *st, int topic_id, on_msg_cb_func *plugin_on_msg_cb, int plugin_id) +{ + return 0; +} +int session_mq_publish_message(struct session *sess, int topic_id, void *msg) +{ + if(topic_id == sess->st->publish_topic_id){ + http_decoder_perf_entry(sess, topic_id, msg, NULL, NULL); + //maybe generate many messages for one packet, so free msg immediately + sess->st->publish_msg_free_cb(msg, NULL); + } + return 0; +} + +static void perf_test_init_per_session(struct session *sess) +{ + sess->context = _httpd_session_ctx_new_cb(sess, sess->st->plugin_env); +} + +static void perf_test_free_per_session(struct session *sess) +{ + sess->st->free_func(sess, sess->st->exdata_id, sess->exdata, NULL); +} + +static void perf_test_loop(struct session *sess, struct packet *test_payload, int size, const struct fieldstat_tag *tag, int fs4_metric_id) +{ + TIME_START(); + sess->current_payload_st = &test_payload[0]; + perf_test_init_per_session(sess); + + for(int i = 0; i < size; i++) + { + sess->current_payload_st = &test_payload[i]; + http_decoder_tcp_stream_msg_cb(sess, sess->st->consumer_topid_id, test_payload[i].payload, NULL, sess->st->plugin_env); + } + perf_test_free_per_session(sess); + TIME_DIFF(); + // printf("time diff: %lld ns\n", time_diff_ns); + fieldstat_easy_histogram_record(fs4_instance, 0, fs4_metric_id, tag, 1, time_diff_ns); +} + +static void perf_test_load_plug(struct stellar *st) +{ + st->plugin_env = http_decoder_init(st); + assert(st->plugin_env != NULL); + return; +} + +static void perf_test_init(struct stellar *st, struct session *sess) +{ + memset(st, 0, sizeof(struct stellar)); + memset(sess, 0, sizeof(struct session)); + st->plugin_id = 0; + st->exdata_id = 0; + st->publish_topic_id = -1; //init + st->consumer_topid_id = 2; //init + perf_test_load_plug(st); + + sess->st = st; + sess->addr.ipv4.saddr = 0x01020304; + sess->addr.ipv4.daddr = 0x05060708; + sess->addr.ipv4.sport = 12345; + sess->addr.ipv4.dport = 80; +} + +#define SET_DATA_LENGTH_DIR(pkt_payload, cstr_in_heap, cur_dir, tmp_index) \ + pkt_payload.payload = cstr_in_heap; \ + pkt_payload.payload_len = strlen(cstr_in_heap); \ + pkt_payload.dir = cur_dir;\ + tmp_index++; + +static void init_test_data_simple(struct packet *test_payload, int *index) +{ + int tmp_index = 0; + const char *c2s_payload = "GET / HTTP/1.1\r\nHost: www.simple.com\r\nConnection: keep-alive\r\nCache-Control: max-age=0\r\nUpgrade-Insecure-Requests: 1\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8\r\nAccept-Encoding: gzip, deflate\r\nAccept-Language: zh-CN,zh;q=0.9\r\n\r\n"; + SET_DATA_LENGTH_DIR(test_payload[tmp_index], c2s_payload, PACKET_DIRECTION_C2S, tmp_index); + + const char *content = "Hello, http decoder perf test simple!!!"; + int content_length = strlen(content); + char *s2c_payload = (char *)malloc(1024); + snprintf(s2c_payload, 1024, "HTTP/1.1 200 OK\r\nServer: Apache-Coyote/1.1\r\nConnection: keep-alive\r\nDate: Sat, 01 May 2024 01:36:57 GMT\r\nContent-Type: text/html;charset=UTF-8\r\nContent-Length: %d\r\n\r\n%s", content_length, content); + + SET_DATA_LENGTH_DIR(test_payload[tmp_index], s2c_payload, PACKET_DIRECTION_S2C, tmp_index); + + *index = tmp_index; +} + +static void init_test_data_frag(struct packet *test_payload, int *index) +{ + int tmp_index = 0; + /* c2s */ + SET_DATA_LENGTH_DIR(test_payload[tmp_index], "GET / HTTP/1.1\r\n", PACKET_DIRECTION_C2S, tmp_index); + SET_DATA_LENGTH_DIR(test_payload[tmp_index], "Host: www.fragment.com\r\n", PACKET_DIRECTION_C2S, tmp_index); + SET_DATA_LENGTH_DIR(test_payload[tmp_index], "Cache-Control: max-age=0\r\n", PACKET_DIRECTION_C2S, tmp_index); + SET_DATA_LENGTH_DIR(test_payload[tmp_index], "Connection: keep-alive\r\n", PACKET_DIRECTION_C2S, tmp_index); + SET_DATA_LENGTH_DIR(test_payload[tmp_index], "Referer: http://fragment.com/register.jsp?redirect:http://aa.bb.cc.dd.com/?\r\n", PACKET_DIRECTION_C2S, tmp_index); + SET_DATA_LENGTH_DIR(test_payload[tmp_index], "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299\r\n", PACKET_DIRECTION_C2S, tmp_index); + SET_DATA_LENGTH_DIR(test_payload[tmp_index], "Cookie: JSESSIONID=385C79E211D561C0CA13D90F150F603D34875GH87FSHG8S7RTHG74875GHS8R7THG87SRTH\r\n", PACKET_DIRECTION_C2S, tmp_index); + SET_DATA_LENGTH_DIR(test_payload[tmp_index], "Accept: */*\r\n", PACKET_DIRECTION_C2S, tmp_index); + SET_DATA_LENGTH_DIR(test_payload[tmp_index], "Accept-Encoding: gzip, deflate\r\n", PACKET_DIRECTION_C2S, tmp_index); + SET_DATA_LENGTH_DIR(test_payload[tmp_index], "\r\n", PACKET_DIRECTION_C2S, tmp_index); //header EOF + + /* s2c */ + SET_DATA_LENGTH_DIR(test_payload[tmp_index], "HTTP/1.1 200 OK\r\n", PACKET_DIRECTION_S2C, tmp_index); + SET_DATA_LENGTH_DIR(test_payload[tmp_index], "Server: Apache-Coyote/1.1\r\n", PACKET_DIRECTION_S2C, tmp_index); + SET_DATA_LENGTH_DIR(test_payload[tmp_index], "Connection: keep-alive\r\n", PACKET_DIRECTION_S2C, tmp_index); + SET_DATA_LENGTH_DIR(test_payload[tmp_index], "Content-Type: text/html;charset=UTF-8\r\n", PACKET_DIRECTION_S2C, tmp_index); + SET_DATA_LENGTH_DIR(test_payload[tmp_index], "Date: Sat, 01 May 2024 01:36:57 GMT\r\n", PACKET_DIRECTION_S2C, tmp_index); + + char *cont_len_buf = (char *)malloc(1024); + const char *s2c_payload = "Hello, http decoder perf test fragment!!!"; + int content_length = strlen(s2c_payload); + snprintf(cont_len_buf, 1024, "Content-Length: %d\r\n\r\n", content_length); + SET_DATA_LENGTH_DIR(test_payload[tmp_index], cont_len_buf, PACKET_DIRECTION_S2C, tmp_index); + + SET_DATA_LENGTH_DIR(test_payload[tmp_index], "\r\n", PACKET_DIRECTION_S2C, tmp_index); //header EOF + + SET_DATA_LENGTH_DIR(test_payload[tmp_index], s2c_payload, PACKET_DIRECTION_S2C, tmp_index); + + *index = tmp_index; +} + +static void init_test_data_long_long_url(struct packet *test_payload, int *index) +{ + int tmp_index = 0; + + const char *request_line_frag1 = "GET /long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/\ +/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/\ +/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/\ +/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/\ +/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/\ +/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/\ +/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/\ +/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/"; + SET_DATA_LENGTH_DIR(test_payload[tmp_index], request_line_frag1, PACKET_DIRECTION_C2S, tmp_index); + + const char *request_line_frag2 = "long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/\ +/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/\ +/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long.index.html HTTP/1.1\r\n"; + SET_DATA_LENGTH_DIR(test_payload[tmp_index], request_line_frag2, PACKET_DIRECTION_C2S, tmp_index); + + const char *request_line_frag3 = "Host: www.long-long-url.com\r\nConnection: keep-alive\r\nCache-Control: max-age=0\r\nUpgrade-Insecure-Requests: 1\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8\r\nAccept-Encoding: gzip, deflate\r\nAccept-Language: zh-CN,zh;q=0.9\r\n\r\n"; + SET_DATA_LENGTH_DIR(test_payload[tmp_index], request_line_frag3, PACKET_DIRECTION_C2S, tmp_index); + + const char *content = "Hello, http decoder perf test long long url!!!"; + int content_length = strlen(content); + char *s2c_payload = (char *)malloc(1024); + snprintf(s2c_payload, 1024, "HTTP/1.1 200 OK\r\nServer: Apache-Coyote/1.1\r\nConnection: keep-alive\r\nDate: Sat, 01 May 2024 01:36:57 GMT\r\nContent-Type: text/html;charset=UTF-8\r\nContent-Length: %d\r\n\r\n%s", content_length, content); + + SET_DATA_LENGTH_DIR(test_payload[tmp_index], s2c_payload, PACKET_DIRECTION_S2C, tmp_index); + + *index = tmp_index; +} + +static void perf_stat_init(void) +{ + fs4_instance = fieldstat_easy_new(1, "http_decoder_test", NULL, 0); + fieldstat_easy_enable_auto_output(fs4_instance, "./httpd_fs4.json", 1); + + FS4_SIMPLE_HISGRAM_TAG.key = "simple"; + FS4_SIMPLE_HISGRAM_TAG.type = TAG_DOUBLE; + FS4_SIMPLE_HISGRAM_TAG.value_double = 0.00001; + fs4_simple_id = fieldstat_easy_register_histogram(fs4_instance, "simple", 1, 99999999, 5); + + FS4_FRAG_HISGRAM_TAG.key = "frag"; + FS4_FRAG_HISGRAM_TAG.type = TAG_DOUBLE; + FS4_FRAG_HISGRAM_TAG.value_double = 0.00001; + fs4_frag_id = fieldstat_easy_register_histogram(fs4_instance, "frag", 1, 99999999, 5); + + FS4_LONG_LONG_URL_HISGRAM_TAG.key = "long-url"; + FS4_LONG_LONG_URL_HISGRAM_TAG.type = TAG_DOUBLE; + FS4_LONG_LONG_URL_HISGRAM_TAG.value_double = 0.00001; + fs4_long_long_url_id = fieldstat_easy_register_histogram(fs4_instance, "long-url", 1, 99999999, 5); +} + +int main(int argc, char const *argv[]) +{ + struct stellar st; + struct session sess; + struct packet test_payload_simple [4] = {}; + int payload_index_simple = 0; + + struct packet test_payload_long_long_url [8] = {}; + int payload_index_long_long_url = 0; + + struct packet test_payload_frag [32] = {}; + int payload_index_frag = 0; + + perf_test_init(&st, &sess); + perf_stat_init(); + + init_test_data_simple(test_payload_simple, &payload_index_simple); + init_test_data_long_long_url(test_payload_long_long_url, &payload_index_long_long_url); + init_test_data_frag(test_payload_frag, &payload_index_frag); + + while(1){ + perf_test_loop(&sess, test_payload_simple, payload_index_simple, &FS4_SIMPLE_HISGRAM_TAG, fs4_simple_id); + perf_test_loop(&sess, test_payload_long_long_url, payload_index_long_long_url, &FS4_LONG_LONG_URL_HISGRAM_TAG, fs4_long_long_url_id); + perf_test_loop(&sess, test_payload_frag, payload_index_frag, &FS4_FRAG_HISGRAM_TAG, fs4_frag_id); + } + return 0; +} diff --git a/test/http_decoder_perf.cpp b/test/http_decoder_perf_plug.cpp index 767de46..295e733 100644 --- a/test/http_decoder_perf.cpp +++ b/test/http_decoder_perf_plug.cpp @@ -5,19 +5,13 @@ #include <assert.h> #include <string.h> -#include "../include/http_decoder.h" + #ifdef __cplusplus extern "C" { - +#include "http_decoder_inc.h" #include "cJSON.h" -#include "http_decoder_gtest.h" -#include "stellar/utils.h" -#include "stellar/stellar.h" -#include "stellar/session_exdata.h" -#include "stellar/session_mq.h" -#include "md5.h" } #endif @@ -25,26 +19,34 @@ extern "C" static int g_result_count = 0; static int g_header_count = 1; -static int g_exdata_idx = 0; -static int g_topic_id = 0; +static int g_exdata_idx = -1; +static int g_topic_id = -1; +static int g_plugin_id = -1; -extern "C" int http_decoder_perf_entry(struct session *sess, int topic_id, const void *data, void *cb_arg) +#define DEBUG_PRINT(fmt, ...) ///printf(fmt, ##__VA_ARGS__) + +extern "C" void http_decoder_perf_entry(struct session *sess, int topic_id, const void *raw_msg, void *per_session_ctx, void *plugin_env) +// extern "C" int http_decoder_perf_entry(struct session *sess, int topic_id, const void *data, void *cb_arg) { struct http_request_line req_line = {0}; struct http_response_line res_line = {0}; struct http_header header = {0}; + struct hstring url = {0}; struct hstring body = {0}; - struct http_message *msg = (struct http_message *)data; + struct http_message *msg = (struct http_message *)raw_msg; enum http_message_type msg_type = http_message_type(msg); void *ret1, *ret2; switch (msg_type) { case HTTP_MESSAGE_REQ_LINE: + DEBUG_PRINT("---------------------------------------------------------------\n"); http_message_get_request_line(msg, &req_line); if (req_line.uri.str) { - ret1 = memmem(req_line.uri.str, req_line.uri.str_len, "index", 5); + DEBUG_PRINT("req_line.method.str: %.*s\n", req_line.method.str_len, req_line.method.str); + ret1 = memmem(req_line.method.str, req_line.method.str_len, "PUT", 3); + DEBUG_PRINT("req_line.version.str: %.*s\n", req_line.version.str_len, req_line.version.str); } break; case HTTP_MESSAGE_REQ_HEADER: @@ -52,6 +54,10 @@ extern "C" int http_decoder_perf_entry(struct session *sess, int topic_id, const { ret1 = memmem(header.key.str, header.key.str_len, "key", 3); ret2 = memmem(header.val.str, header.val.str_len, "val", 3); + DEBUG_PRINT("REQ header: %.*s : %.*s\n", (int)header.key.str_len, header.key.str, (int)header.val.str_len, header.val.str); + } + if(http_message_get_url(msg, &url) >= 0){ + DEBUG_PRINT("URL: %.*s\n", url.str_len, url.str); } break; case HTTP_MESSAGE_REQ_BODY: @@ -64,34 +70,35 @@ extern "C" int http_decoder_perf_entry(struct session *sess, int topic_id, const case HTTP_MESSAGE_RES_LINE: http_message_get_response_line(msg, &res_line); ret1 = memmem(res_line.status.str, res_line.status.str_len, "OK", 2); + DEBUG_PRINT("res_line.status.str: %.*s\n", (int)res_line.status.str_len, res_line.status.str); break; case HTTP_MESSAGE_RES_HEADER: while (http_message_header_next(msg, &header) >= 0) { ret1 = memmem(header.key.str, header.key.str_len, "key", 3); ret2 = memmem(header.val.str, header.val.str_len, "val", 3); + DEBUG_PRINT("RES header: %.*s : %.*s\n", (int)header.key.str_len, header.key.str, (int)header.val.str_len, header.val.str); } break; case HTTP_MESSAGE_RES_BODY: - // http_message_get_response_raw_body(msg, &body); + http_message_get_raw_body(msg, &body); + DEBUG_PRINT("res raw body: %.*s\n", body.str_len, body.str); // output_http_body(&body, 0); http_message_get_decompress_body(msg, &body); // output_http_body(&body, 1); ret1 = memmem(body.str, body.str_len, "</html>", 7); + DEBUG_PRINT("res unzip body: %.*s\n", body.str_len, body.str); + DEBUG_PRINT("---------------------------------------------------------------\n"); break; // to do: check payload default: break; } - - if(ret1 && ret2){ - return 1; - } - return 0; + return; } -static int (*g_entry_fun)(struct session *sess, int topic_id, const void *data, void *cb_arg) = &http_decoder_perf_entry; +static on_msg_cb_func *g_entry_fun = &http_decoder_perf_entry; static void http_decoder_test_exdata_free(struct session *sess, int idx, void *ex_ptr, void *arg) { @@ -100,26 +107,24 @@ static void http_decoder_test_exdata_free(struct session *sess, int idx, void *e extern "C" void *http_decoder_perf_init(struct stellar *st) { - g_exdata_idx = - stellar_session_get_ex_new_index(st, "HTTP_DECODER_REQ_TEST", + g_plugin_id = stellar_session_plugin_register(st, NULL, NULL, NULL); + g_exdata_idx = stellar_session_exdata_new_index(st, "HTTP_DECODER_REQ_TEST", http_decoder_test_exdata_free, - NULL); + NULL); if (g_exdata_idx < 0) { - printf("[%s:%d]: can't get http_decoder exdata index !!!\n", - __FUNCTION__, __LINE__); + printf("[%s:%d]: can't get http_decoder exdata index !!!\n", __FUNCTION__, __LINE__); exit(-1); } - g_topic_id = session_mq_get_topic_id(st, "HTTP_DECODER_MESSAGE"); + g_topic_id = stellar_session_mq_get_topic_id(st, "HTTP_DECODER_MESSAGE"); if (g_topic_id < 0) { - printf("[%s:%d]: can't get http_decoder topic id !!!\n", - __FUNCTION__, __LINE__); + printf("[%s:%d]: can't get http_decoder topic id !!!\n", __FUNCTION__, __LINE__); exit(-1); } - session_mq_subscribe_topic(st, g_topic_id, g_entry_fun, NULL); + stellar_session_mq_subscribe(st, g_topic_id, g_entry_fun, g_plugin_id); // printf("http_decoder_test_init OK!\n"); return NULL; @@ -131,11 +136,10 @@ extern "C" void http_decoder_perf_exit(void *test_ctx) { FREE(test_ctx); } - printf("http_decoder_perf plug exit OK!\n"); } -extern "C" void http_decoder_plug_set_entry_fuc(HTTP_DECODER_PLUG_ENTRY_FUN_T entry_fun) +extern "C" void http_decoder_plug_set_entry_fuc(on_msg_cb_func *entry_fun) { g_entry_fun = entry_fun; }
\ No newline at end of file diff --git a/test/http_decoder_stub.cpp b/test/http_decoder_stub.cpp deleted file mode 100644 index e719ebe..0000000 --- a/test/http_decoder_stub.cpp +++ /dev/null @@ -1,254 +0,0 @@ -/* - Http Decoder Google Test stub module -*/ -#include <stdio.h> -#include <time.h> -#include <unistd.h> -#include <assert.h> -#include <string.h> -#include "http_decoder.h" - - - -#ifdef __cplusplus -extern "C" -{ -#endif -#include "session.h" -#include "session_exdata.h" -#include "session_mq.h" -#include "stellar.h" -#include "http_decoder_gtest.h" -#include "MESA_jump_layer.h" -extern struct fake_stellar *g_fake_stellar; - - static int g_topic_id = -1; - static msg_free_cb_func *g_msg_free_cb = NULL; - static void *g_msg_free_cb_arg = NULL; - static on_msg_cb_func *g_topic_sub_cb = NULL; - static void *g_topic_sub_cb_arg = NULL; - - int commit_test_result_json(cJSON *node, const char *name) - { - assert(node != NULL || name != NULL); - if (g_fake_stellar->http_plug_test_result_root) - { - // cJSON_AddStringToObject(node, "__X_HTTP_RESULT_INDEX", name); - cJSON_AddItemToArray(g_fake_stellar->http_plug_test_result_root, node); - return 0; - } - return -1; - } - - int packet_get_direction(const struct packet *pkt) - { - struct fake_packet *fpkt = (struct fake_packet *)pkt; - return fpkt->dir; - } - - int session_event_assign(struct session_event *ev, struct stellar *st, struct session *sess, int events, session_event_cb_func *cb, void *cb_arg) - { - DEBUG_PRINT("todo: fake session_event_assign()\n"); - return 0; - } - - const char *session_get0_readable_addr(struct session *sess) - { - struct fake_session *fses = (struct fake_session *)sess; - - if (fses->readable_addr_cstr) - { - return fses->readable_addr_cstr; - } - - char ip_src_buf[INET6_ADDRSTRLEN] = {}; - char ip_dst_buf[INET6_ADDRSTRLEN] = {}; - char port_src_buf[16] = {}; - char port_dst_buf[16] = {}; - char tuple4_buf[256] = {}; - - if (SESSION_ADDR_TYPE_IPV4_TCP == fses->addr_type) - { - inet_ntop(AF_INET, &fses->addr->ipv4.saddr, ip_src_buf, INET_ADDRSTRLEN); - inet_ntop(AF_INET, &fses->addr->ipv4.daddr, ip_dst_buf, INET_ADDRSTRLEN); - sprintf(port_src_buf, "%u", ntohs(fses->addr->ipv4.sport)); - sprintf(port_dst_buf, "%u", ntohs(fses->addr->ipv4.dport)); - } - else - { - inet_ntop(AF_INET6, fses->addr->ipv6.saddr, ip_src_buf, INET6_ADDRSTRLEN); - inet_ntop(AF_INET6, fses->addr->ipv6.daddr, ip_dst_buf, INET6_ADDRSTRLEN); - sprintf(port_src_buf, "%u", ntohs(fses->addr->ipv6.sport)); - sprintf(port_dst_buf, "%u", ntohs(fses->addr->ipv6.dport)); - } - - snprintf(tuple4_buf, sizeof(tuple4_buf), "%s.%s>%s.%s", ip_src_buf, port_src_buf, ip_dst_buf, port_dst_buf); - fses->readable_addr_cstr = MMALLOC(char, strlen(tuple4_buf) + 1); - memcpy(fses->readable_addr_cstr, tuple4_buf, strlen(tuple4_buf)); - - return fses->readable_addr_cstr; - } - - struct session_addr *session_get0_addr(struct session *sess, enum session_addr_type *addr_type) - { - struct fake_session *fses = (struct fake_session *)sess; - *addr_type = fses->addr_type; - return fses->addr; - } - - static int __find_ex_data(struct fake_stellar *fst, const char *name) - { - int find_name_len = strlen(name); - - for (int i = 0; i < EX_DATA_MAX_SIZE; i++) - { - if ((fst->fake_exdata_mgr[i].name != NULL) && (strncasecmp(name, fst->fake_exdata_mgr[i].name, find_name_len) == 0) && (find_name_len == fst->fake_exdata_mgr[i].name_len)) - { - return i; - } - } - - return -1; - } - - static int __save_ex_data(struct fake_stellar *fst, const char *name, session_ex_free *free_func, void *arg) - { - for (int i = 0; i < EX_DATA_MAX_SIZE; i++) - { - if (fst->fake_exdata_mgr[i].name == NULL && fst->fake_exdata_mgr[i].name_len == 0) - { - fst->fake_exdata_mgr[i].name = MMALLOC(char, strlen(name) + 1); - fst->fake_exdata_mgr[i].name_len = strlen(name) + 1; - memcpy(fst->fake_exdata_mgr[i].name, name, strlen(name)); - fst->fake_exdata_mgr[i].free_func = free_func; - fst->fake_exdata_mgr[i].arg = arg; - return i; - } - } - - return -1; - } - - int stellar_session_get_ex_new_index(struct stellar *st, const char *name, session_ex_free *free_func, void *arg) - { - int ex_id = __find_ex_data((struct fake_stellar *)st, name); - if (-1 == ex_id) - { - ex_id = __save_ex_data((struct fake_stellar *)st, name, free_func, arg); - } - - return ex_id; - } - - int session_mq_get_topic_id(struct stellar *st, const char *topic_name) - { - return g_topic_id; - } - - int session_get_current_thread_id(struct session *sess) - { - return 0; - } - - int session_mq_destroy_topic(struct stellar *st, int topic_id) - { - return 0; - } - - int session_set_ex_data(struct session *sess, int idx, void *ex_ptr) - { - struct fake_session *fses = (struct fake_session *)sess; - fses->plug_exdata_array[idx] = ex_ptr; - - return 0; - } - - void *session_get_ex_data(struct session *sess, int idx) - { - struct fake_session *fses = (struct fake_session *)sess; - return fses->plug_exdata_array[idx]; - } - - void hdd_session_free_exdata(struct fake_session *fake_ses) - { - for (int i = 0; i < EX_DATA_MAX_SIZE; i++) - { - if (fake_ses->plug_exdata_array[i] != NULL) - { - fake_ses->fst->fake_exdata_mgr[i].free_func((struct session *)fake_ses, i, fake_ses->plug_exdata_array[i], NULL); - } - } - } - - int stellar_plugin_register(struct stellar *st, int events, session_event_cb_func *cb, void *cb_arg) - { - return 0; // fix plugin id - } - - extern int http_decoder_test_entry(struct session *sess, int topic_id, const void *data, void *cb_arg); - int session_mq_publish_message(struct session *sess, int topic_id, void *data) - { - g_topic_sub_cb(sess, topic_id, data, g_topic_sub_cb_arg); - g_msg_free_cb(data, g_msg_free_cb_arg); - return 0; - } - - int stellar_get_worker_thread_num(struct stellar *st) - { - return 1; - } - - int session_mq_create_topic(struct stellar *st, const char *topic_name, msg_free_cb_func *free_cb, void *cb_arg) - { - g_msg_free_cb = free_cb; - g_msg_free_cb_arg = cb_arg; - - g_topic_id = 0; // KISS, use fix value - return g_topic_id; - } - - const char *session_get0_current_payload(struct session *sess, size_t *payload_len) - { - struct fake_session *fses = (struct fake_session *)sess; - struct fake_packet *fpkt = fses->fpkt; - const char *payload_ptr = NULL; - - if (!fpkt || !fpkt->payload_data || fpkt->payload_data_len == 0) - { - return NULL; - } - - int submit_len = MIN(fses->tcp_mss, fpkt->payload_data_len - fpkt->payload_submit_offset); - if (submit_len <= 0) - { - *payload_len = 0; - return NULL; - } - payload_ptr = fpkt->payload_data + fpkt->payload_submit_offset; - *payload_len = submit_len; - fpkt->payload_submit_offset += submit_len; - - return payload_ptr; - } - - struct session_event *session_get_intrinsic_event(struct session *sess, int plugin_id) - { - return NULL; - } - - int session_is_inner_most(struct session *sess, uint64_t *flag) - { - return 1; // no tunnel - } - - int session_mq_subscribe_topic(struct stellar *st, int topic_id, on_msg_cb_func *sub_cb, void *cb_arg) - { - //todo, support multiple topic? - g_topic_sub_cb = sub_cb; - g_topic_sub_cb_arg = cb_arg; - return 0; - } - -#ifdef __cplusplus -} -#endif
\ No newline at end of file diff --git a/test/http_gtest_main.cpp b/test/http_gtest_main.cpp deleted file mode 100644 index 5b7aee5..0000000 --- a/test/http_gtest_main.cpp +++ /dev/null @@ -1,44 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <time.h> -#include <unistd.h> -#include <assert.h> -#include <getopt.h> -#include <gtest/gtest.h> -#include "http_decoder_gtest.h" - -#ifdef __cplusplus -extern "C" -{ -struct fake_stellar *g_fake_stellar; //export symbol for commit_test_result_json() -extern int http_decoder_entry(struct session *sess, int events,const struct packet *pkt, void *cb_arg); -extern int http_decoder_test_entry(struct session *sess, int topic_id, const void *data, void *cb_arg); -extern void *http_decoder_init(struct stellar *st); -extern void *http_decoder_test_init(struct stellar *st); -} -#endif - -TEST(HTTP_DECODER, GTEST) -{ - ASSERT_EQ(0, hdgt_compare_result(g_fake_stellar)); -} - -int main(int argc, char **argv) -{ - g_fake_stellar = hdgt_create(); - - if(hdgt_init_once(g_fake_stellar, argc, argv, http_decoder_init, http_decoder_entry, http_decoder_test_init, http_decoder_test_entry) < 0) - { - fprintf(stderr, "hdgt_init_once() fail!\n"); - exit(1); - } - - hdgt_main_loop(g_fake_stellar); - - ::testing::InitGoogleTest(&argc, argv); - int ret = RUN_ALL_TESTS(); - - hdgt_destroy(g_fake_stellar); - - return ret; -}
\ No newline at end of file diff --git a/test/http_gtest_unit.cpp b/test/http_gtest_unit.cpp deleted file mode 100644 index 8b35d0c..0000000 --- a/test/http_gtest_unit.cpp +++ /dev/null @@ -1,569 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <time.h> -#include <unistd.h> -#include <assert.h> -#include <getopt.h> -#include <gtest/gtest.h> -#include "http_decoder_gtest.h" - -#ifdef __cplusplus -extern "C" -{ - struct fake_stellar *g_fake_stellar; // export symbol for commit_test_result_json() - extern int http_decoder_entry(struct session *sess, int events, const struct packet *pkt, void *cb_arg); - extern int http_decoder_test_entry(struct session *sess, int topic_id, const void *data, void *cb_arg); - extern void *http_decoder_init(struct stellar *st); - extern void *http_decoder_test_init(struct stellar *st); -} -#endif - -#define UNIT_TEST_SUCC_SSTRING "http unit test succ!" -#define UNIT_TEST_FAIL_SSTRING "http unit test fail!" - -#define PRINT_TEST_RESULT(ret) \ - do \ - { \ - if (0 == ret) \ - { \ - fprintf(stderr, "%s\n", UNIT_TEST_SUCC_SSTRING); \ - exit(200); \ - } \ - else \ - { \ - fprintf(stderr, "%s\n", UNIT_TEST_FAIL_SSTRING); \ - exit(404); \ - } \ - } while (0) - -static int hgut_compare_hstring(const struct hstring *hs1, const struct hstring *hs2) -{ - if (hs1->str_len != hs2->str_len) - { - return -1; - } - if (strncmp(hs1->str, hs2->str, hs1->str_len) != 0) - { - return -1; - } - return 0; -} - -static int hgut_compare_req_line(const struct http_request_line *req_line1, const struct http_request_line *req_line2) -{ - if (hgut_compare_hstring(&req_line1->method, &req_line2->method) != 0) - { - return -1; - } - if (hgut_compare_hstring(&req_line1->uri, &req_line2->uri) != 0) - { - return -1; - } - if (hgut_compare_hstring(&req_line1->version, &req_line2->version) != 0) - { - return -1; - } - if (req_line1->major_version != req_line2->major_version) - { - return -1; - } - if (req_line1->minor_version != req_line2->minor_version) - { - return -1; - } - - return 0; -} - -static int hgut_compare_res_line(const struct http_response_line *res_line1, const struct http_response_line *res_line2) -{ - if (hgut_compare_hstring(&res_line1->version, &res_line2->version) != 0) - { - return -1; - } - if (hgut_compare_hstring(&res_line1->status, &res_line2->status) != 0) - { - return -1; - } - if (res_line1->major_version != res_line2->major_version) - { - return -1; - } - if (res_line1->minor_version != res_line2->minor_version) - { - return -1; - } - if (res_line1->status_code != res_line2->status_code) - { - return -1; - } - - return 0; -} - -static int hgut_compare_header(const struct http_header *hdr1, const struct http_header *hdr2) -{ - if (hdr1->key.str_len != hdr2->key.str_len) - { - return -1; - } - if (hdr1->val.str_len != hdr2->val.str_len) - { - return -1; - } - if (strncmp(hdr1->key.str, hdr2->key.str, hdr1->key.str_len) != 0) - { - return -1; - } - if (strncmp(hdr1->val.str, hdr2->val.str, hdr1->val.str_len) != 0) - { - return -1; - } - - return 0; -} - -extern "C" int ut_get_req_line_entry(struct session *sess, int topic_id, const void *data, void *cb_arg) -{ - int ret; - struct http_request_line expect_req_line = {0}; - struct http_request_line req_line = {0}; - struct http_message *msg = (struct http_message *)data; - enum http_message_type msg_type = http_message_type(msg); - - expect_req_line.method.str = (char *)"GET"; - expect_req_line.method.str_len = 3; - expect_req_line.uri.str = (char *)"/test_req_line/index.html"; - expect_req_line.uri.str_len = strlen("/test_req_line/index.html"); - expect_req_line.version.str = (char *)"1.1"; - expect_req_line.version.str_len = 3; - expect_req_line.major_version = 1; - expect_req_line.minor_version = 1; - - if (HTTP_MESSAGE_REQ_LINE == msg_type) - { - EXPECT_EQ(0, http_message_get_request_line(msg, &req_line)); - ret = hgut_compare_req_line(&expect_req_line, &req_line); - PRINT_TEST_RESULT(ret); - } - - return 0; -} - -extern "C" int ut_get_url_entry(struct session *sess, int topic_id, const void *data, void *cb_arg) -{ - int ret; - struct hstring expect_url = {0}; - struct hstring get_url = {0}; - struct http_message *msg = (struct http_message *)data; - enum http_message_type msg_type = http_message_type(msg); - - expect_url.str = (char *)"get_url_test.com/test_url/index.html"; - expect_url.str_len = strlen(expect_url.str); - - if (HTTP_MESSAGE_REQ_LINE == msg_type) - { - EXPECT_EQ(-1, http_message_get_url(msg, &get_url)); - } - - if (HTTP_MESSAGE_REQ_HEADER == msg_type || HTTP_MESSAGE_REQ_BODY == msg_type || HTTP_MESSAGE_RES_LINE == msg_type || HTTP_MESSAGE_RES_HEADER == msg_type || HTTP_MESSAGE_RES_BODY == msg_type) - { - EXPECT_EQ(0, http_message_get_url(msg, &get_url)); - ret = hgut_compare_hstring(&expect_url, &get_url); - if (ret != 0) - { - fprintf(stderr, "http_message_get_url value is diff! expect:%.*s, but actual:%.*s\n", - expect_url.str_len, - expect_url.str, - get_url.str_len, - get_url.str); - } - PRINT_TEST_RESULT(ret); - } - - return 0; -} - -extern "C" int ut_get_res_line_entry(struct session *sess, int topic_id, const void *data, void *cb_arg) -{ - int ret; - struct http_response_line expect_res_line = {0}; - struct http_response_line res_line = {0}; - struct http_message *msg = (struct http_message *)data; - enum http_message_type msg_type = http_message_type(msg); - - expect_res_line.version.str = (char *)"1.1"; - expect_res_line.version.str_len = 3; - expect_res_line.status.str = (char *)"OK"; - expect_res_line.status.str_len = 2; - expect_res_line.status_code = 200; - expect_res_line.major_version = 1; - expect_res_line.minor_version = 1; - - if (HTTP_MESSAGE_REQ_LINE == msg_type || HTTP_MESSAGE_REQ_HEADER == msg_type || HTTP_MESSAGE_REQ_BODY == msg_type) - { - EXPECT_EQ(-1, http_message_get_response_line(msg, &res_line)); - } - - if (HTTP_MESSAGE_RES_LINE == msg_type) - { - EXPECT_EQ(0, http_message_get_response_line(msg, &res_line)); - ret = hgut_compare_res_line(&expect_res_line, &res_line); - PRINT_TEST_RESULT(ret); - } - - return 0; -} - -extern "C" int ut_get_req_header(struct session *sess, int topic_id, const void *data, void *cb_arg) -{ - int ret; - struct http_header expect_hdr = {0}; - struct http_header req_hdr = {0}; - struct http_message *msg = (struct http_message *)data; - enum http_message_type msg_type = http_message_type(msg); - - expect_hdr.key.str = (char *)"Host"; - expect_hdr.key.str_len = strlen("Host"); - expect_hdr.val.str = (char *)"192.168.40.137"; - expect_hdr.val.str_len = strlen("192.168.40.137"); - - struct hstring fetch_key = expect_hdr.key; - - if (HTTP_MESSAGE_REQ_LINE == msg_type) - { - EXPECT_EQ(-1, http_message_get_header(msg, &fetch_key, &req_hdr)); - } - - if (HTTP_MESSAGE_REQ_HEADER == msg_type) - { - if (0 == http_message_get_header(msg, &fetch_key, &req_hdr)) - { - ret = hgut_compare_header(&expect_hdr, &req_hdr); - PRINT_TEST_RESULT(ret); - } - } - - return 0; -} - -extern "C" int ut_get_res_header(struct session *sess, int topic_id, const void *data, void *cb_arg) -{ - int ret; - struct http_header expect_hdr = {0}; - struct http_header req_hdr = {0}; - struct http_message *msg = (struct http_message *)data; - enum http_message_type msg_type = http_message_type(msg); - - expect_hdr.key.str = (char *)"Server"; - expect_hdr.key.str_len = strlen("Server"); - expect_hdr.val.str = (char *)"SimpleHTTP/0.6 Python/2.7.5"; - expect_hdr.val.str_len = strlen("SimpleHTTP/0.6 Python/2.7.5"); - - struct hstring fetch_key = expect_hdr.key; - - if (HTTP_MESSAGE_REQ_LINE == msg_type || HTTP_MESSAGE_REQ_HEADER == msg_type || HTTP_MESSAGE_REQ_BODY == msg_type) - { - EXPECT_EQ(-1, http_message_get_header(msg, &fetch_key, &req_hdr)); - } - - if (HTTP_MESSAGE_RES_HEADER == msg_type) - { - if (0 == http_message_get_header(msg, &fetch_key, &req_hdr)) - { - ret = hgut_compare_header(&expect_hdr, &req_hdr); - PRINT_TEST_RESULT(ret); - } - } - - return 0; -} - -extern "C" int ut_iterate_req_headers(struct session *sess, int topic_id, const void *data, void *cb_arg) -{ - int ret; - struct http_header expect_hdr_array[16] = {0}; - struct http_header req_hdr_array[16] = {0}; - struct http_message *msg = (struct http_message *)data; - enum http_message_type msg_type = http_message_type(msg); - static int hdr_count = 0; - - if (HTTP_MESSAGE_REQ_LINE == msg_type) - { - EXPECT_EQ(-1, http_message_header_next(msg, &req_hdr_array[0])); - } - - expect_hdr_array[0].key.str = (char *)"Host"; - expect_hdr_array[0].key.str_len = strlen("Host"); - expect_hdr_array[0].val.str = (char *)"192.168.40.137"; - expect_hdr_array[0].val.str_len = strlen("192.168.40.137"); - - expect_hdr_array[1].key.str = (char *)"User-Agent"; - expect_hdr_array[1].key.str_len = strlen("User-Agent"); - expect_hdr_array[1].val.str = (char *)"curl/7.79.1"; - expect_hdr_array[1].val.str_len = strlen("curl/7.79.1"); - - expect_hdr_array[2].key.str = (char *)"Accept"; - expect_hdr_array[2].key.str_len = strlen("Accept"); - expect_hdr_array[2].val.str = (char *)"*/*"; - expect_hdr_array[2].val.str_len = strlen("*/*"); - - if (HTTP_MESSAGE_REQ_HEADER == msg_type) - { - while (0 == http_message_header_next(msg, &req_hdr_array[hdr_count])) - { - ret = hgut_compare_header(&expect_hdr_array[hdr_count], &req_hdr_array[hdr_count]); - if (0 != ret) - { - fprintf(stderr, "header value is diff!\n"); - PRINT_TEST_RESULT(ret); - } - hdr_count++; - } - - hdr_count = 0; - http_message_reset_header_iter(msg); - // retry after reset iter - - while (0 == http_message_header_next(msg, &req_hdr_array[hdr_count])) - { - ret = hgut_compare_header(&expect_hdr_array[hdr_count], &req_hdr_array[hdr_count]); - if (0 != ret) - { - fprintf(stderr, "header value is diff!\n"); - PRINT_TEST_RESULT(ret); - } - hdr_count++; - } - } - - if (HTTP_MESSAGE_REQ_BODY == msg_type || HTTP_MESSAGE_RES_LINE == msg_type || HTTP_MESSAGE_RES_HEADER == msg_type || HTTP_MESSAGE_RES_BODY == msg_type) - { - ret = hdr_count == 3 ? 0 : -1; - PRINT_TEST_RESULT(ret); - } - - return 0; -} - -extern "C" int ut_iterate_res_headers(struct session *sess, int topic_id, const void *data, void *cb_arg) -{ - int ret; - struct http_header expect_hdr_array[16] = {0}; - struct http_header res_hdr_array[16] = {0}; - struct http_message *msg = (struct http_message *)data; - enum http_message_type msg_type = http_message_type(msg); - static int hdr_count = 0; - - if (HTTP_MESSAGE_REQ_LINE == msg_type || HTTP_MESSAGE_REQ_HEADER == msg_type || HTTP_MESSAGE_REQ_BODY == msg_type) - { - EXPECT_EQ(-1, http_message_header_next(msg, &res_hdr_array[0])); - } - - expect_hdr_array[0].key.str = (char *)"Server"; - expect_hdr_array[0].key.str_len = strlen("Server"); - expect_hdr_array[0].val.str = (char *)"SimpleHTTP/0.6 Python/2.7.5"; - expect_hdr_array[0].val.str_len = strlen("SimpleHTTP/0.6 Python/2.7.5"); - - expect_hdr_array[1].key.str = (char *)"Date"; - expect_hdr_array[1].key.str_len = strlen("Date"); - expect_hdr_array[1].val.str = (char *)"Thu, 30 Nov 2023 08:42:24 GMT"; - expect_hdr_array[1].val.str_len = strlen("Thu, 30 Nov 2023 08:42:24 GMT"); - - expect_hdr_array[2].key.str = (char *)"Content-type"; - expect_hdr_array[2].key.str_len = strlen("Content-type"); - expect_hdr_array[2].val.str = (char *)"text/html"; - expect_hdr_array[2].val.str_len = strlen("text/html"); - - expect_hdr_array[3].key.str = (char *)"Content-Length"; - expect_hdr_array[3].key.str_len = strlen("Content-Length"); - expect_hdr_array[3].val.str = (char *)"144"; - expect_hdr_array[3].val.str_len = strlen("144"); - - expect_hdr_array[4].key.str = (char *)"Last-Modified"; - expect_hdr_array[4].key.str_len = strlen("Last-Modified"); - expect_hdr_array[4].val.str = (char *)"Thu, 30 Nov 2023 08:38:54 GMT"; - expect_hdr_array[4].val.str_len = strlen("Thu, 30 Nov 2023 08:38:54 GMT"); - - if (HTTP_MESSAGE_RES_HEADER == msg_type) - { - while (0 == http_message_header_next(msg, &res_hdr_array[hdr_count])) - { - ret = hgut_compare_header(&expect_hdr_array[hdr_count], &res_hdr_array[hdr_count]); - if (0 != ret) - { - fprintf(stderr, "header value is diff! expect:%.*s, but actual:%.*s\n", - expect_hdr_array[hdr_count].key.str_len, - expect_hdr_array[hdr_count].key.str, - res_hdr_array[hdr_count].key.str_len, - res_hdr_array[hdr_count].key.str); - PRINT_TEST_RESULT(ret); - } - hdr_count++; - } - - hdr_count = 0; - http_message_reset_header_iter(msg); - // retry after reset iter - - while (0 == http_message_header_next(msg, &res_hdr_array[hdr_count])) - { - ret = hgut_compare_header(&expect_hdr_array[hdr_count], &res_hdr_array[hdr_count]); - if (0 != ret) - { - fprintf(stderr, "after reset iter, header value is diff! expect:%.*s, but actual:%.*s\n", - expect_hdr_array[hdr_count].key.str_len, - expect_hdr_array[hdr_count].key.str, - res_hdr_array[hdr_count].key.str_len, - res_hdr_array[hdr_count].key.str); - PRINT_TEST_RESULT(ret); - } - hdr_count++; - } - - ret = hdr_count == 5 ? 0 : -1; - PRINT_TEST_RESULT(ret); - } - - return 0; -} - - -extern "C" int ut_get_raw_body(struct session *sess, int topic_id, const void *data, void *cb_arg) -{ - int ret; - struct hstring expect_body = {0}; - struct hstring get_body = {0}; - struct http_message *msg = (struct http_message *)data; - enum http_message_type msg_type = http_message_type(msg); - static int hdr_count = 0; - - /* - Raw body is html, including \r\n, is not easy to copy, so uses md5sum validation - */ - expect_body.str = (char *)"3e11876cd3a234541ae37d833c088a76"; - expect_body.str_len = strlen(expect_body.str); - - if (HTTP_MESSAGE_REQ_LINE == msg_type || HTTP_MESSAGE_REQ_HEADER == msg_type || HTTP_MESSAGE_RES_LINE == msg_type || HTTP_MESSAGE_RES_HEADER == msg_type) - { - EXPECT_EQ(-1, http_message_get_raw_body(msg, &get_body)); - } - - if(HTTP_MESSAGE_RES_BODY == msg_type) - { - EXPECT_EQ(0, http_message_get_raw_body(msg, &get_body)); - char md5_result_string[33]; - MESA_MD5_sum_str((unsigned char *)get_body.str, (unsigned int)get_body.str_len, md5_result_string); - ret = strcmp(expect_body.str, md5_result_string); - PRINT_TEST_RESULT(ret); - } - - return 0; -} - -TEST(HTTP_DECODER_UNIT, GET_REQ_LINE) -{ - // go https://www.bejson.com to format JSON - const char *test_json = "[{\"__X_HTTP_TUPLE4\":\"192.168.38.73.50806>192.168.40.137.80\"},{\"__X_HTTP_TRANSACTION\":\"request\",\"__X_HTTP_TRANSACTION_SEQ\":0,\"method\":\"GET\",\"uri\":\"/test_req_line/index.html\",\"req_version\":\"1.1\",\"major_version\":1,\"minor_version\":1,\"Host\":\"192.168.40.137\",\"User-Agent\":\"curl/7.79.1\",\"Accept\":\"*/*\",\"__X_HTTP_URL\":\"192.168.40.137/index.html\"}]"; - struct fake_stellar *fst = hdgt_create(); - hdgt_set_data_source_type(fst, DATA_SOURCE_JSON); - EXPECT_EQ(0, hdgt_data_source_init_by_json_text(fst, test_json)); - EXPECT_EQ(0, hdgt_under_test_module_init(fst, http_decoder_init, http_decoder_entry)); - EXPECT_EQ(0, hdgt_test_plug_init(fst, http_decoder_test_init, ut_get_req_line_entry)); - EXPECT_EXIT(hdgt_main_loop(fst), testing::ExitedWithCode(200), UNIT_TEST_SUCC_SSTRING); -} - -TEST(HTTP_DECODER_UNIT, GET_URL) -{ - // go https://www.bejson.com to format JSON - const char *test_json = "[{\"__X_HTTP_TUPLE4\":\"192.168.38.73.50806>192.168.40.137.80\"},{\"__X_HTTP_TRANSACTION\":\"request\",\"__X_HTTP_TRANSACTION_SEQ\":0,\"method\":\"GET\",\"uri\":\"/test_url/index.html\",\"req_version\":\"1.1\",\"major_version\":1,\"minor_version\":1,\"Host\":\"get_url_test.com\",\"User-Agent\":\"curl/7.79.1\",\"Accept\":\"*/*\",\"__X_HTTP_URL\":\"192.168.40.137/index.html\"}]"; - struct fake_stellar *fst = hdgt_create(); - hdgt_set_data_source_type(fst, DATA_SOURCE_JSON); - EXPECT_EQ(0, hdgt_data_source_init_by_json_text(fst, test_json)); - EXPECT_EQ(0, hdgt_under_test_module_init(fst, http_decoder_init, http_decoder_entry)); - EXPECT_EQ(0, hdgt_test_plug_init(fst, http_decoder_test_init, ut_get_url_entry)); - EXPECT_EXIT(hdgt_main_loop(fst), testing::ExitedWithCode(200), UNIT_TEST_SUCC_SSTRING); -} - -TEST(HTTP_DECODER_UNIT, GET_RES_LINE) -{ - // go https://www.bejson.com to format JSON - const char *test_json = "[{\"__X_HTTP_TUPLE4\":\"192.168.38.73.50806>192.168.40.137.80\"},{\"__X_HTTP_TRANSACTION\":\"request\",\"__X_HTTP_TRANSACTION_SEQ\":0,\"method\":\"GET\",\"uri\":\"/index.html\",\"req_version\":\"1.1\",\"major_version\":1,\"minor_version\":1,\"Host\":\"192.168.40.137\",\"User-Agent\":\"curl/7.79.1\",\"Accept\":\"*/*\",\"__X_HTTP_URL\":\"192.168.40.137/index.html\"},{\"__X_HTTP_TRANSACTION\":\"response\",\"__X_HTTP_TRANSACTION_SEQ\":0,\"res_version\":\"1.1\",\"res_status\":\"OK\",\"major_version\":1,\"minor_version\":1,\"status_code\":200,\"Server\":\"SimpleHTTP/0.6 Python/2.7.5\",\"Date\":\"Thu, 30 Nov 2023 08:42:24 GMT\",\"Content-type\":\"text/html\",\"Content-Length\":\"144\",\"Last-Modified\":\"Thu, 30 Nov 2023 08:38:54 GMT\",\"__X_HTTP_PAYLOAD_MD5\":\"3e11876cd3a234541ae37d833c088a76\",\"__X_HTTP_PAYLOAD\":\"PCFET0NUWVBFIGh0bWw+CjxodG1sPgo8aGVhZD4KPHRpdGxlPlBhZ2UgVGl0bGU8L3RpdGxlPgo8L2hlYWQ+Cjxib2R5PgoKPGgxPlRoaXMgaXMgYSBIZWFkaW5nPC9oMT4KPHA+VGhpcyBpcyBhIHBhcmFncmFwaC48L3A+Cgo8L2JvZHk+CjwvaHRtbD4K\"}]"; - struct fake_stellar *fst = hdgt_create(); - hdgt_set_data_source_type(fst, DATA_SOURCE_JSON); - EXPECT_EQ(0, hdgt_data_source_init_by_json_text(fst, test_json)); - EXPECT_EQ(0, hdgt_under_test_module_init(fst, http_decoder_init, http_decoder_entry)); - EXPECT_EQ(0, hdgt_test_plug_init(fst, http_decoder_test_init, ut_get_res_line_entry)); - EXPECT_EXIT(hdgt_main_loop(fst), testing::ExitedWithCode(200), UNIT_TEST_SUCC_SSTRING); -} - -TEST(HTTP_DECODER_UNIT, GET_REQ_HEADER) -{ - // go https://www.bejson.com to format JSON - const char *test_json = "[{\"__X_HTTP_TUPLE4\":\"192.168.38.73.50806>192.168.40.137.80\"},{\"__X_HTTP_TRANSACTION\":\"request\",\"__X_HTTP_TRANSACTION_SEQ\":0,\"method\":\"GET\",\"uri\":\"/index.html\",\"req_version\":\"1.1\",\"major_version\":1,\"minor_version\":1,\"Host\":\"192.168.40.137\",\"User-Agent\":\"curl/7.79.1\",\"Accept\":\"*/*\",\"__X_HTTP_URL\":\"192.168.40.137/index.html\"},{\"__X_HTTP_TRANSACTION\":\"response\",\"__X_HTTP_TRANSACTION_SEQ\":0,\"res_version\":\"1.1\",\"res_status\":\"OK\",\"major_version\":1,\"minor_version\":1,\"status_code\":200,\"Server\":\"SimpleHTTP/0.6 Python/2.7.5\",\"Date\":\"Thu, 30 Nov 2023 08:42:24 GMT\",\"Content-type\":\"text/html\",\"Content-Length\":\"144\",\"Last-Modified\":\"Thu, 30 Nov 2023 08:38:54 GMT\",\"__X_HTTP_PAYLOAD_MD5\":\"3e11876cd3a234541ae37d833c088a76\",\"__X_HTTP_PAYLOAD\":\"PCFET0NUWVBFIGh0bWw+CjxodG1sPgo8aGVhZD4KPHRpdGxlPlBhZ2UgVGl0bGU8L3RpdGxlPgo8L2hlYWQ+Cjxib2R5PgoKPGgxPlRoaXMgaXMgYSBIZWFkaW5nPC9oMT4KPHA+VGhpcyBpcyBhIHBhcmFncmFwaC48L3A+Cgo8L2JvZHk+CjwvaHRtbD4K\"}]"; - struct fake_stellar *fst = hdgt_create(); - hdgt_set_data_source_type(fst, DATA_SOURCE_JSON); - EXPECT_EQ(0, hdgt_data_source_init_by_json_text(fst, test_json)); - EXPECT_EQ(0, hdgt_under_test_module_init(fst, http_decoder_init, http_decoder_entry)); - EXPECT_EQ(0, hdgt_test_plug_init(fst, http_decoder_test_init, ut_get_req_header)); - EXPECT_EXIT(hdgt_main_loop(fst), testing::ExitedWithCode(200), UNIT_TEST_SUCC_SSTRING); -} - -TEST(HTTP_DECODER_UNIT, GET_RES_HEADER) -{ - // go https://www.bejson.com to format JSON - const char *test_json = "[{\"__X_HTTP_TUPLE4\":\"192.168.38.73.50806>192.168.40.137.80\"},{\"__X_HTTP_TRANSACTION\":\"request\",\"__X_HTTP_TRANSACTION_SEQ\":0,\"method\":\"GET\",\"uri\":\"/index.html\",\"req_version\":\"1.1\",\"major_version\":1,\"minor_version\":1,\"Host\":\"192.168.40.137\",\"User-Agent\":\"curl/7.79.1\",\"Accept\":\"*/*\",\"__X_HTTP_URL\":\"192.168.40.137/index.html\"},{\"__X_HTTP_TRANSACTION\":\"response\",\"__X_HTTP_TRANSACTION_SEQ\":0,\"res_version\":\"1.1\",\"res_status\":\"OK\",\"major_version\":1,\"minor_version\":1,\"status_code\":200,\"Server\":\"SimpleHTTP/0.6 Python/2.7.5\",\"Date\":\"Thu, 30 Nov 2023 08:42:24 GMT\",\"Content-type\":\"text/html\",\"Content-Length\":\"144\",\"Last-Modified\":\"Thu, 30 Nov 2023 08:38:54 GMT\",\"__X_HTTP_PAYLOAD_MD5\":\"3e11876cd3a234541ae37d833c088a76\",\"__X_HTTP_PAYLOAD\":\"PCFET0NUWVBFIGh0bWw+CjxodG1sPgo8aGVhZD4KPHRpdGxlPlBhZ2UgVGl0bGU8L3RpdGxlPgo8L2hlYWQ+Cjxib2R5PgoKPGgxPlRoaXMgaXMgYSBIZWFkaW5nPC9oMT4KPHA+VGhpcyBpcyBhIHBhcmFncmFwaC48L3A+Cgo8L2JvZHk+CjwvaHRtbD4K\"}]"; - struct fake_stellar *fst = hdgt_create(); - hdgt_set_data_source_type(fst, DATA_SOURCE_JSON); - EXPECT_EQ(0, hdgt_data_source_init_by_json_text(fst, test_json)); - EXPECT_EQ(0, hdgt_under_test_module_init(fst, http_decoder_init, http_decoder_entry)); - EXPECT_EQ(0, hdgt_test_plug_init(fst, http_decoder_test_init, ut_get_res_header)); - EXPECT_EXIT(hdgt_main_loop(fst), testing::ExitedWithCode(200), UNIT_TEST_SUCC_SSTRING); -} - -TEST(HTTP_DECODER_UNIT, ITERATE_REQ_HEADERS) -{ - // go https://www.bejson.com to format JSON - const char *test_json = "[{\"__X_HTTP_TUPLE4\":\"192.168.38.73.50806>192.168.40.137.80\"},{\"__X_HTTP_TRANSACTION\":\"request\",\"__X_HTTP_TRANSACTION_SEQ\":0,\"method\":\"GET\",\"uri\":\"/index.html\",\"req_version\":\"1.1\",\"major_version\":1,\"minor_version\":1,\"Host\":\"192.168.40.137\",\"User-Agent\":\"curl/7.79.1\",\"Accept\":\"*/*\",\"__X_HTTP_URL\":\"192.168.40.137/index.html\"},{\"__X_HTTP_TRANSACTION\":\"response\",\"__X_HTTP_TRANSACTION_SEQ\":0,\"res_version\":\"1.1\",\"res_status\":\"OK\",\"major_version\":1,\"minor_version\":1,\"status_code\":200,\"Server\":\"SimpleHTTP/0.6 Python/2.7.5\",\"Date\":\"Thu, 30 Nov 2023 08:42:24 GMT\",\"Content-type\":\"text/html\",\"Content-Length\":\"144\",\"Last-Modified\":\"Thu, 30 Nov 2023 08:38:54 GMT\",\"__X_HTTP_PAYLOAD_MD5\":\"3e11876cd3a234541ae37d833c088a76\",\"__X_HTTP_PAYLOAD\":\"PCFET0NUWVBFIGh0bWw+CjxodG1sPgo8aGVhZD4KPHRpdGxlPlBhZ2UgVGl0bGU8L3RpdGxlPgo8L2hlYWQ+Cjxib2R5PgoKPGgxPlRoaXMgaXMgYSBIZWFkaW5nPC9oMT4KPHA+VGhpcyBpcyBhIHBhcmFncmFwaC48L3A+Cgo8L2JvZHk+CjwvaHRtbD4K\"}]"; - struct fake_stellar *fst = hdgt_create(); - hdgt_set_data_source_type(fst, DATA_SOURCE_JSON); - EXPECT_EQ(0, hdgt_data_source_init_by_json_text(fst, test_json)); - EXPECT_EQ(0, hdgt_under_test_module_init(fst, http_decoder_init, http_decoder_entry)); - EXPECT_EQ(0, hdgt_test_plug_init(fst, http_decoder_test_init, ut_iterate_req_headers)); - // hdgt_main_loop(fst); - EXPECT_EXIT(hdgt_main_loop(fst), testing::ExitedWithCode(200), UNIT_TEST_SUCC_SSTRING); -} - -TEST(HTTP_DECODER_UNIT, ITERATE_RES_HEADERS) -{ - // go https://www.bejson.com to format JSON - const char *test_json = "[{\"__X_HTTP_TUPLE4\":\"192.168.38.73.50806>192.168.40.137.80\"},{\"__X_HTTP_TRANSACTION\":\"request\",\"__X_HTTP_TRANSACTION_SEQ\":0,\"method\":\"GET\",\"uri\":\"/index.html\",\"req_version\":\"1.1\",\"major_version\":1,\"minor_version\":1,\"Host\":\"192.168.40.137\",\"User-Agent\":\"curl/7.79.1\",\"Accept\":\"*/*\",\"__X_HTTP_URL\":\"192.168.40.137/index.html\"},{\"__X_HTTP_TRANSACTION\":\"response\",\"__X_HTTP_TRANSACTION_SEQ\":0,\"res_version\":\"1.1\",\"res_status\":\"OK\",\"major_version\":1,\"minor_version\":1,\"status_code\":200,\"Server\":\"SimpleHTTP/0.6 Python/2.7.5\",\"Date\":\"Thu, 30 Nov 2023 08:42:24 GMT\",\"Content-type\":\"text/html\",\"Content-Length\":\"144\",\"Last-Modified\":\"Thu, 30 Nov 2023 08:38:54 GMT\",\"__X_HTTP_PAYLOAD_MD5\":\"3e11876cd3a234541ae37d833c088a76\",\"__X_HTTP_PAYLOAD\":\"PCFET0NUWVBFIGh0bWw+CjxodG1sPgo8aGVhZD4KPHRpdGxlPlBhZ2UgVGl0bGU8L3RpdGxlPgo8L2hlYWQ+Cjxib2R5PgoKPGgxPlRoaXMgaXMgYSBIZWFkaW5nPC9oMT4KPHA+VGhpcyBpcyBhIHBhcmFncmFwaC48L3A+Cgo8L2JvZHk+CjwvaHRtbD4K\"}]"; - struct fake_stellar *fst = hdgt_create(); - hdgt_set_data_source_type(fst, DATA_SOURCE_JSON); - EXPECT_EQ(0, hdgt_data_source_init_by_json_text(fst, test_json)); - EXPECT_EQ(0, hdgt_under_test_module_init(fst, http_decoder_init, http_decoder_entry)); - EXPECT_EQ(0, hdgt_test_plug_init(fst, http_decoder_test_init, ut_iterate_res_headers)); - // hdgt_main_loop(fst); - EXPECT_EXIT(hdgt_main_loop(fst), testing::ExitedWithCode(200), UNIT_TEST_SUCC_SSTRING); -} - -TEST(HTTP_DECODER_UNIT, GET_RAW_BODY) -{ - // go https://www.bejson.com to format JSON - const char *test_json = "[{\"__X_HTTP_TUPLE4\":\"192.168.38.73.50806>192.168.40.137.80\"},{\"__X_HTTP_TRANSACTION\":\"request\",\"__X_HTTP_TRANSACTION_SEQ\":0,\"method\":\"GET\",\"uri\":\"/index.html\",\"req_version\":\"1.1\",\"major_version\":1,\"minor_version\":1,\"Host\":\"192.168.40.137\",\"User-Agent\":\"curl/7.79.1\",\"Accept\":\"*/*\",\"__X_HTTP_URL\":\"192.168.40.137/index.html\"},{\"__X_HTTP_TRANSACTION\":\"response\",\"__X_HTTP_TRANSACTION_SEQ\":0,\"res_version\":\"1.1\",\"res_status\":\"OK\",\"major_version\":1,\"minor_version\":1,\"status_code\":200,\"Server\":\"SimpleHTTP/0.6 Python/2.7.5\",\"Date\":\"Thu, 30 Nov 2023 08:42:24 GMT\",\"Content-type\":\"text/html\",\"Content-Length\":\"144\",\"Last-Modified\":\"Thu, 30 Nov 2023 08:38:54 GMT\",\"__X_HTTP_PAYLOAD_MD5\":\"3e11876cd3a234541ae37d833c088a76\",\"__X_HTTP_PAYLOAD\":\"PCFET0NUWVBFIGh0bWw+CjxodG1sPgo8aGVhZD4KPHRpdGxlPlBhZ2UgVGl0bGU8L3RpdGxlPgo8L2hlYWQ+Cjxib2R5PgoKPGgxPlRoaXMgaXMgYSBIZWFkaW5nPC9oMT4KPHA+VGhpcyBpcyBhIHBhcmFncmFwaC48L3A+Cgo8L2JvZHk+CjwvaHRtbD4K\"}]"; - struct fake_stellar *fst = hdgt_create(); - hdgt_set_data_source_type(fst, DATA_SOURCE_JSON); - EXPECT_EQ(0, hdgt_data_source_init_by_json_text(fst, test_json)); - EXPECT_EQ(0, hdgt_under_test_module_init(fst, http_decoder_init, http_decoder_entry)); - EXPECT_EQ(0, hdgt_test_plug_init(fst, http_decoder_test_init, ut_get_raw_body)); - // hdgt_main_loop(fst); - EXPECT_EXIT(hdgt_main_loop(fst), testing::ExitedWithCode(200), UNIT_TEST_SUCC_SSTRING); -} - -int main(int argc, char **argv) -{ - ::testing::InitGoogleTest(&argc, argv); - ::testing::FLAGS_gtest_death_test_style = "threadsafe"; - int ret = RUN_ALL_TESTS(); - return ret; -}
\ No newline at end of file diff --git a/test/test_result_json/http_get_malformed.json b/test/test_result_json/http_get_malformed.json index dacb51f..3a04d38 100644 --- a/test/test_result_json/http_get_malformed.json +++ b/test/test_result_json/http_get_malformed.json @@ -1,28 +1,2 @@ [ - { - "__X_HTTP_TUPLE4": "192.168.4.2.36598>108.61.176.217.80" - }, - { - "__X_HTTP_TRANSACTION": "request", - "__X_HTTP_TRANSACTION_SEQ": 0, - "method": "GET", - "uri": "/", - "req_version": "1.1", - "major_version": 1, - "minor_version": 1 - }, - { - "__X_HTTP_TRANSACTION": "response", - "__X_HTTP_TRANSACTION_SEQ": 0, - "res_version": "1.0", - "res_status": "OK", - "major_version": 1, - "minor_version": 0, - "status_code": 200, - "Server": "FakeNet/1.3", - "Date": "Wed, 12 Sep 2018 19:45:55 GMT", - "Content-Type": "text/html", - "Content-Length": "1547", - "__X_HTTP_PAYLOAD_MD5": "1807c0ebdda65240e058706d9626d2af" - } ]
\ No newline at end of file |
