summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/CMakeLists.txt174
-rw-r--r--test/http_decoder_driver.cpp981
-rw-r--r--test/http_decoder_gtest.cpp228
-rw-r--r--test/http_decoder_gtest.h93
-rw-r--r--test/http_decoder_perf_main.cpp363
-rw-r--r--test/http_decoder_perf_plug.cpp (renamed from test/http_decoder_perf.cpp)73
-rw-r--r--test/http_decoder_stub.cpp254
-rw-r--r--test/http_gtest_main.cpp44
-rw-r--r--test/http_gtest_unit.cpp569
-rw-r--r--test/http_pcap/http_pipeline_C2S.pcapbin0 -> 3240 bytes
-rw-r--r--test/http_pcap/http_pipeline_S2C.pcapbin0 -> 3616 bytes
-rw-r--r--test/http_pcap/http_post.pcapbin0 -> 1478 bytes
-rw-r--r--test/http_pcap/http_post_c2s.pcapbin0 -> 634 bytes
-rw-r--r--test/http_pcap/http_post_s2c.pcapbin0 -> 868 bytes
-rw-r--r--test/test_result_json/http_get_malformed.json26
-rw-r--r--test/test_result_json/http_msg_type_state.json18
-rw-r--r--test/test_result_json/http_msg_type_state_c2s.json12
-rw-r--r--test/test_result_json/http_msg_type_state_pipeline.json60
-rw-r--r--test/test_result_json/http_msg_type_state_s2c.json12
19 files changed, 683 insertions, 2224 deletions
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index 4869a90..2445ef2 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -1,174 +1,32 @@
set(DECODER_NAME http_decoder)
-add_library(${DECODER_NAME}_test SHARED http_decoder_gtest.cpp md5.c)
+aux_source_directory(${PROJECT_SOURCE_DIR}/deps/toml DEPS_SRC)
+
+add_library(${DECODER_NAME}_test SHARED http_decoder_gtest.cpp md5.c ${DEPS_SRC})
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)
-
-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)
-
-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})
+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_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})
+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_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") \ 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..3956a28 100644
--- a/test/http_decoder_gtest.cpp
+++ b/test/http_decoder_gtest.cpp
@@ -1,39 +1,39 @@
-/*
-**********************************************************************************************
-* File: http_decoder_gtest.cpp
-* Description:
-* Authors: Liu WenTan <[email protected]>
-* Date: 2023-12-15
-* Copyright: (c) Since 2023 Geedge Networks, Ltd. All rights reserved.
-***********************************************************************************************
-*/
-
#include <stdio.h>
#include <time.h>
#include <unistd.h>
#include <assert.h>
#include <string.h>
-#include "../include/http_decoder.h"
+#include "http_decoder_inc.h"
#ifdef __cplusplus
extern "C"
{
-
#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"
+#include "toml/toml.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);
+ extern void http_decoder_test_state_entry(struct session *sess, int topic_id, const void *raw_msg, void *no_use_ctx, void *plugin_env);
+ static on_session_msg_cb_func *g_entry_fun = http_decoder_test_entry;
}
#endif
#define MAX_KEY_STR_LEN 2048
+#define GTEST_PLUG_ENTRY_CFG "./etc/http/gtest_entry.toml"
+
+struct plug_entry_t{
+ const char *name;
+ on_session_msg_cb_func *entry;
+};
+
+static struct plug_entry_t g_entry_tbl[] = {
+ {"http_decoder_test_entry", http_decoder_test_entry},
+ {"http_decoder_test_state_entry", http_decoder_test_state_entry},
+ {NULL, NULL}
+};
enum http_transaction_type
{
@@ -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;
@@ -207,7 +208,8 @@ void http_url_add_to_json(cJSON *ctx, struct http_message *msg)
return;
}
- if (http_message_get_url(msg, &url_result) < 0)
+ http_message_get_url(msg, &url_result);
+ if(url_result.str == NULL)
{
// printf("url:%s\n", url_result.str);
return;
@@ -224,7 +226,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 +255,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,25 +289,74 @@ 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)
+static int get_gtest_plug_entry(const char *cfg_path, char *entry_name, int max_len)
+{
+ FILE *fp = fopen(cfg_path, "r");
+ if (NULL == fp)
+ {
+ fprintf(stderr, "[%s:%d]Can't open config file:%s",
+ __FUNCTION__, __LINE__, cfg_path);
+ return -1;
+ }
+
+ int ret = 0;
+ char errbuf[256] = {0};
+
+ toml_table_t *root = toml_parse_file(fp, errbuf, sizeof(errbuf));
+ fclose(fp);
+
+ toml_table_t *basic_sec_tbl = toml_table_in(root, "entry");
+ if (NULL == basic_sec_tbl)
+ {
+ fprintf(stderr, "[%s:%d]config file:%s has no key: [entry]",
+ __FUNCTION__, __LINE__, cfg_path);
+ toml_free(root);
+ return -1;
+ }
+
+ toml_datum_t str_val = toml_string_in(basic_sec_tbl, "name");
+ if (str_val.ok != 0)
+ {
+ strncpy(entry_name, str_val.u.s, max_len);
+ free(str_val.u.s);
+ }
+ toml_free(root);
+ return 0;
+}
+
+static void set_gtest_plug_entry(const char *entry_name)
+{
+ if(NULL == entry_name){
+ g_entry_fun = http_decoder_test_entry; //set default
+ return;
+ }
+ for (size_t i = 0; g_entry_tbl[i].name != NULL; i++)
+ {
+ if(strcmp(entry_name, g_entry_tbl[i].name) == 0){
+ g_entry_fun = g_entry_tbl[i].entry;
+ return;
+ }
+ }
+ g_entry_fun = http_decoder_test_entry; //set default
+}
+
+extern "C" void http_decoder_test_entry(struct session *sess, int topic_id, const void *raw_msg, void *no_use_ctx, void *plugin_env)
{
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;
- enum http_message_type msg_type = http_message_type(msg);
+ struct http_message *msg = (struct http_message *)raw_msg;
+ enum http_message_type msg_type = http_message_type_get(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)
+ if (http_message_type_is_req(sess, msg_type))
{
cJSON *json = gtest_plug_exdata->result_jnode[HTTP_TRANSACTION_REQ];
}
@@ -317,7 +370,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 +390,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,52 +414,96 @@ 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);
}
}
+static int update_config_file(const char *filename, const char *key, const char *value)
+{
+ char cmd_buf[1024] = {};
+ snprintf(cmd_buf, 1024, "sed 's/^[ \t]*%s=.*/%s=%s/g' -i %s", key, key, value, filename);
+ int ret = system(cmd_buf);
+ return ret;
+}
+
+extern "C" void http_decoder_test_state_entry(struct session *sess, int topic_id, const void *raw_msg, void *no_use_ctx, void *plugin_env)
+{
+ static int msg_index = 0;
+ char msg_index_name[64] = {};
+ char msg_index_value[64] = {};
+ cJSON *json_object = NULL;
+ enum http_message_type msg_type = http_message_type_get((struct http_message *)raw_msg);
+
+ 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));
+ gtest_plug_exdata->result_jnode[HTTP_TRANSACTION_REQ] = cJSON_CreateObject();
+ gtest_plug_exdata->result_jnode[HTTP_TRANSACTION_RES] = cJSON_CreateObject();
+ session_exdata_set(sess, g_exdata_idx, gtest_plug_exdata);
+ }
+
+ if (http_message_type_is_req(sess, msg_type)){
+ json_object = gtest_plug_exdata->result_jnode[HTTP_TRANSACTION_REQ];
+ }else{
+ json_object = gtest_plug_exdata->result_jnode[HTTP_TRANSACTION_RES];
+ }
+
+ int cur_transaction_id = http_message_get_transaction_seq((const http_message* )raw_msg);
+
+ if(HTTP_TRANSACTION_NEW ==msg_type || HTTP_TRANSACTION_FREE == msg_type){
+ snprintf(msg_index_name, sizeof(msg_index_name), "msg_%d", msg_index++);
+ snprintf(msg_index_value, sizeof(msg_index_value), "%s_transaction_%d", http_message_type_to_string(msg_type), cur_transaction_id);
+ cJSON_AddStringToObject(json_object, msg_index_name, msg_index_value);
+ }else{
+ snprintf(msg_index_name, sizeof(msg_index_name), "msg_%d", msg_index++);
+ cJSON_AddStringToObject(json_object, msg_index_name, http_message_type_to_string(msg_type));
+ }
+ return;
+}
+
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;
}
- session_mq_subscribe_topic(st, g_topic_id, g_entry_fun, NULL);
- // printf("http_decoder_test_init OK!\n");
+ char entry_name[64] = "";
+ get_gtest_plug_entry(GTEST_PLUG_ENTRY_CFG, entry_name, sizeof(entry_name)-1);
+ set_gtest_plug_entry(entry_name);
+ 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);
- return NULL;
+ return (void *)strdup("http_decoder_test_ctx");
}
extern "C" void http_decoder_test_exit(void *test_ctx)
@@ -415,11 +512,6 @@ extern "C" void http_decoder_test_exit(void *test_ctx)
{
FREE(test_ctx);
}
-
+ // update_config_file(GTEST_PLUG_ENTRY_CFG, "name", "\\x22http_decoder_test_entry\\x22");
printf("http_decoder_test_exit OK!\n");
-}
-
-extern "C" void http_decoder_plug_set_entry_fuc(HTTP_DECODER_PLUG_ENTRY_FUN_T 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..c413d08 100644
--- a/test/http_decoder_gtest.h
+++ b/test/http_decoder_gtest.h
@@ -1,7 +1,7 @@
#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>
@@ -14,8 +14,12 @@
#define JSON_KEY_VALUE_STRING_MAX_LEN (4096)
+#ifndef MAX
#define MAX(a, b) ((a) >= (b) ? (a) : (b))
+#endif
+#ifndef MIN
#define MIN(a, b) ((a) >= (b) ? (b) : (a))
+#endif
#define MMALLOC(type, size) ((type *)calloc(1, size))
#define MFREE(p) \
@@ -42,87 +46,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..1dd7734
--- /dev/null
+++ b/test/http_decoder_perf_main.cpp
@@ -0,0 +1,363 @@
+#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;
+ session_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, session_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_session_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(sess, msg, NULL);
+ }
+ return 0;
+}
+
+int session_is_symmetric(struct session *sess, unsigned char *flag)
+{
+ *flag = (SESSION_SEEN_C2S_FLOW | SESSION_SEEN_S2C_FLOW);
+ return 1;
+}
+
+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 test_payload_index_max, 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 < test_payload_index_max; 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);
+ TIME_DIFF();
+ fieldstat_easy_histogram_record(fs4_instance, 0, fs4_metric_id, tag, 1, time_diff_ns);
+ }
+ perf_test_free_per_session(sess);
+}
+
+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..f588683 100644
--- a/test/http_decoder_perf.cpp
+++ b/test/http_decoder_perf_plug.cpp
@@ -1,23 +1,14 @@
-
#include <stdio.h>
#include <time.h>
#include <unistd.h>
#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 +16,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;
- enum http_message_type msg_type = http_message_type(msg);
+ struct http_message *msg = (struct http_message *)raw_msg;
+ enum http_message_type msg_type = http_message_type_get(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 +51,11 @@ 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);
+ }
+ http_message_get_url(msg, &url);
+ if(url.str && url.str_len){
+ DEBUG_PRINT("URL: %.*s\n", url.str_len, url.str);
}
break;
case HTTP_MESSAGE_REQ_BODY:
@@ -64,34 +68,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_session_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 +105,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 +134,5 @@ 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)
-{
- 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/http_pcap/http_pipeline_C2S.pcap b/test/http_pcap/http_pipeline_C2S.pcap
new file mode 100644
index 0000000..360e0ed
--- /dev/null
+++ b/test/http_pcap/http_pipeline_C2S.pcap
Binary files differ
diff --git a/test/http_pcap/http_pipeline_S2C.pcap b/test/http_pcap/http_pipeline_S2C.pcap
new file mode 100644
index 0000000..a7d473f
--- /dev/null
+++ b/test/http_pcap/http_pipeline_S2C.pcap
Binary files differ
diff --git a/test/http_pcap/http_post.pcap b/test/http_pcap/http_post.pcap
new file mode 100644
index 0000000..cb5843e
--- /dev/null
+++ b/test/http_pcap/http_post.pcap
Binary files differ
diff --git a/test/http_pcap/http_post_c2s.pcap b/test/http_pcap/http_post_c2s.pcap
new file mode 100644
index 0000000..973a5fb
--- /dev/null
+++ b/test/http_pcap/http_post_c2s.pcap
Binary files differ
diff --git a/test/http_pcap/http_post_s2c.pcap b/test/http_pcap/http_post_s2c.pcap
new file mode 100644
index 0000000..0be23a8
--- /dev/null
+++ b/test/http_pcap/http_post_s2c.pcap
Binary files differ
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
diff --git a/test/test_result_json/http_msg_type_state.json b/test/test_result_json/http_msg_type_state.json
new file mode 100644
index 0000000..8fae48a
--- /dev/null
+++ b/test/test_result_json/http_msg_type_state.json
@@ -0,0 +1,18 @@
+[
+ {
+ "msg_0": "HTTP_TRANSACTION_NEW_transaction_0",
+ "msg_1": "HTTP_MESSAGE_REQ_LINE",
+ "msg_2": "HTTP_MESSAGE_REQ_HEADER",
+ "msg_3": "HTTP_MESSAGE_REQ_HEADER_END",
+ "msg_4": "HTTP_MESSAGE_REQ_BODY",
+ "msg_5": "HTTP_MESSAGE_REQ_BODY_END"
+ },
+ {
+ "msg_6": "HTTP_MESSAGE_RES_LINE",
+ "msg_7": "HTTP_MESSAGE_RES_HEADER",
+ "msg_8": "HTTP_MESSAGE_RES_HEADER_END",
+ "msg_9": "HTTP_MESSAGE_RES_BODY",
+ "msg_10": "HTTP_MESSAGE_RES_BODY_END",
+ "msg_11": "HTTP_TRANSACTION_FREE_transaction_0"
+ }
+] \ No newline at end of file
diff --git a/test/test_result_json/http_msg_type_state_c2s.json b/test/test_result_json/http_msg_type_state_c2s.json
new file mode 100644
index 0000000..05ed4f1
--- /dev/null
+++ b/test/test_result_json/http_msg_type_state_c2s.json
@@ -0,0 +1,12 @@
+[
+ {
+ "msg_0": "HTTP_TRANSACTION_NEW_transaction_0",
+ "msg_1": "HTTP_MESSAGE_REQ_LINE",
+ "msg_2": "HTTP_MESSAGE_REQ_HEADER",
+ "msg_3": "HTTP_MESSAGE_REQ_HEADER_END",
+ "msg_4": "HTTP_MESSAGE_REQ_BODY",
+ "msg_5": "HTTP_MESSAGE_REQ_BODY_END",
+ "msg_6": "HTTP_TRANSACTION_FREE_transaction_0"
+ },
+ {}
+] \ No newline at end of file
diff --git a/test/test_result_json/http_msg_type_state_pipeline.json b/test/test_result_json/http_msg_type_state_pipeline.json
new file mode 100644
index 0000000..5384420
--- /dev/null
+++ b/test/test_result_json/http_msg_type_state_pipeline.json
@@ -0,0 +1,60 @@
+[
+ {
+ "msg_0": "HTTP_TRANSACTION_NEW_transaction_0",
+ "msg_1": "HTTP_MESSAGE_REQ_LINE",
+ "msg_2": "HTTP_MESSAGE_REQ_HEADER",
+ "msg_3": "HTTP_MESSAGE_REQ_HEADER_END",
+ "msg_8": "HTTP_TRANSACTION_NEW_transaction_1",
+ "msg_9": "HTTP_MESSAGE_REQ_LINE",
+ "msg_10": "HTTP_MESSAGE_REQ_HEADER",
+ "msg_11": "HTTP_MESSAGE_REQ_HEADER_END",
+ "msg_16": "HTTP_TRANSACTION_NEW_transaction_2",
+ "msg_17": "HTTP_MESSAGE_REQ_LINE",
+ "msg_18": "HTTP_MESSAGE_REQ_HEADER",
+ "msg_19": "HTTP_MESSAGE_REQ_HEADER_END",
+ "msg_24": "HTTP_TRANSACTION_NEW_transaction_3",
+ "msg_25": "HTTP_MESSAGE_REQ_LINE",
+ "msg_26": "HTTP_MESSAGE_REQ_HEADER",
+ "msg_27": "HTTP_MESSAGE_REQ_HEADER_END"
+ },
+ {
+ "msg_4": "HTTP_MESSAGE_RES_LINE",
+ "msg_5": "HTTP_MESSAGE_RES_HEADER",
+ "msg_6": "HTTP_MESSAGE_RES_HEADER_END",
+ "msg_7": "HTTP_TRANSACTION_FREE_transaction_0",
+ "msg_12": "HTTP_MESSAGE_RES_LINE",
+ "msg_13": "HTTP_MESSAGE_RES_HEADER",
+ "msg_14": "HTTP_MESSAGE_RES_HEADER_END",
+ "msg_15": "HTTP_TRANSACTION_FREE_transaction_1",
+ "msg_20": "HTTP_MESSAGE_RES_LINE",
+ "msg_21": "HTTP_MESSAGE_RES_HEADER",
+ "msg_22": "HTTP_MESSAGE_RES_HEADER_END",
+ "msg_23": "HTTP_TRANSACTION_FREE_transaction_2",
+ "msg_28": "HTTP_MESSAGE_RES_LINE",
+ "msg_29": "HTTP_MESSAGE_RES_HEADER",
+ "msg_30": "HTTP_MESSAGE_RES_HEADER_END",
+ "msg_31": "HTTP_MESSAGE_RES_BODY",
+ "msg_32": "HTTP_MESSAGE_RES_BODY",
+ "msg_33": "HTTP_MESSAGE_RES_BODY",
+ "msg_34": "HTTP_MESSAGE_RES_BODY",
+ "msg_35": "HTTP_MESSAGE_RES_BODY",
+ "msg_36": "HTTP_MESSAGE_RES_BODY",
+ "msg_37": "HTTP_MESSAGE_RES_BODY",
+ "msg_38": "HTTP_MESSAGE_RES_BODY",
+ "msg_39": "HTTP_MESSAGE_RES_BODY",
+ "msg_40": "HTTP_MESSAGE_RES_BODY",
+ "msg_41": "HTTP_MESSAGE_RES_BODY",
+ "msg_42": "HTTP_MESSAGE_RES_BODY",
+ "msg_43": "HTTP_MESSAGE_RES_BODY",
+ "msg_44": "HTTP_MESSAGE_RES_BODY",
+ "msg_45": "HTTP_MESSAGE_RES_BODY",
+ "msg_46": "HTTP_MESSAGE_RES_BODY",
+ "msg_47": "HTTP_MESSAGE_RES_BODY",
+ "msg_48": "HTTP_MESSAGE_RES_BODY",
+ "msg_49": "HTTP_MESSAGE_RES_BODY",
+ "msg_50": "HTTP_MESSAGE_RES_BODY",
+ "msg_51": "HTTP_MESSAGE_RES_BODY",
+ "msg_52": "HTTP_MESSAGE_RES_BODY_END",
+ "msg_53": "HTTP_TRANSACTION_FREE_transaction_3"
+ }
+] \ No newline at end of file
diff --git a/test/test_result_json/http_msg_type_state_s2c.json b/test/test_result_json/http_msg_type_state_s2c.json
new file mode 100644
index 0000000..8a05b49
--- /dev/null
+++ b/test/test_result_json/http_msg_type_state_s2c.json
@@ -0,0 +1,12 @@
+[
+ {},
+ {
+ "msg_0": "HTTP_TRANSACTION_NEW_transaction_0",
+ "msg_1": "HTTP_MESSAGE_RES_LINE",
+ "msg_2": "HTTP_MESSAGE_RES_HEADER",
+ "msg_3": "HTTP_MESSAGE_RES_HEADER_END",
+ "msg_4": "HTTP_MESSAGE_RES_BODY",
+ "msg_5": "HTTP_MESSAGE_RES_BODY_END",
+ "msg_6": "HTTP_TRANSACTION_FREE_transaction_0"
+ }
+] \ No newline at end of file