diff options
| author | 李佳 <[email protected]> | 2024-04-12 11:41:14 +0000 |
|---|---|---|
| committer | 李佳 <[email protected]> | 2024-04-12 11:41:14 +0000 |
| commit | f40db506ee7570e836ac97b7806a679bc36da155 (patch) | |
| tree | e4483ca1d2a28079c57ab6f0ac055dfe08c47915 /test | |
| parent | 55ac6e270ae37299e2bce3a47a3d784e29dcae14 (diff) | |
| parent | 094d0f8e45931b195e358989d2843a298e9fd567 (diff) | |
Merge branch 'api-unit-test' into 'develop'
Add unit tests.
See merge request stellar/http_decoder!5
Diffstat (limited to 'test')
| -rw-r--r-- | test/CMakeLists.txt | 15 | ||||
| -rw-r--r-- | test/http_decoder_driver.cpp | 133 | ||||
| -rw-r--r-- | test/http_decoder_gtest.cpp | 17 | ||||
| -rw-r--r-- | test/http_decoder_gtest.h | 16 | ||||
| -rw-r--r-- | test/http_decoder_stub.cpp | 16 | ||||
| -rw-r--r-- | test/http_gtest_main.cpp | 44 | ||||
| -rw-r--r-- | test/http_gtest_unit.cpp | 569 |
7 files changed, 727 insertions, 83 deletions
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 7388239..c326838 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -13,21 +13,27 @@ include_directories(/opt/tsg/framework/include/stellar) include_directories(/opt/tsg/framework/include/) include_directories(/opt/MESA/include/MESA) -add_executable(gtest_http_decoder http_decoder_driver.cpp http_decoder_stub.cpp http_decoder_gtest.cpp md5.c base64.c) +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_HTTP_DECODER_CONF +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}) @@ -128,8 +134,9 @@ add_test(NAME HTTP_SELF_CONSISTENT_V4_TEST COMMAND ${TEST_MAIN} -b ${CMAKE_CURR add_test(NAME HTTP_SELF_CONSISTENT_V6_TEST COMMAND ${TEST_MAIN} -b ${CMAKE_CURRENT_SOURCE_DIR}/test_result_json/http_6over4_single_trans.json -s ${CMAKE_CURRENT_SOURCE_DIR}/test_result_json/http_6over4_single_trans.json WORKING_DIRECTORY ${TEST_RUN_DIR}) -set_tests_properties(HTTP_GET_SINGLE_TRANS_TEST - HTTP_GET_SINGLE_TRANS_MSS1_TEST +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 diff --git a/test/http_decoder_driver.cpp b/test/http_decoder_driver.cpp index 14156e4..be10f97 100644 --- a/test/http_decoder_driver.cpp +++ b/test/http_decoder_driver.cpp @@ -30,7 +30,6 @@ extern "C" int http_decoder_entry(struct session *sess, int events, 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); -struct fake_stellar *g_fake_stellar; // used for plugin commit_test_result_json() static const char *hdgt_cla_short_options = "hb:p:s:m:"; static const struct option hdgt_cla_long_options[] = @@ -69,12 +68,15 @@ static void hdgt_cmd_usage(int argc, char **argv) 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; - fst->tcp_mss = 1460; // set default value - while (1) { c = getopt_long(argc, argv, hdgt_cla_short_options, hdgt_cla_long_options, NULL); @@ -93,11 +95,11 @@ static int hdgt_parse_cmd_args(fake_stellar *fst, int argc, char **argv) fst->benchmark_json_file_name = optarg; break; case 'p': - fst->data_source_type = DATA_SOURCE_PCAP; + hdgt_set_data_source_type(fst, DATA_SOURCE_PCAP); fst->data_source_file_name = optarg; break; case 's': - fst->data_source_type = DATA_SOURCE_JSON; + hdgt_set_data_source_type(fst, DATA_SOURCE_JSON); fst->data_source_file_name = optarg; break; case 'm': @@ -115,12 +117,12 @@ static int hdgt_parse_cmd_args(fake_stellar *fst, int argc, char **argv) } // 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 (!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) { @@ -132,7 +134,7 @@ static int hdgt_parse_cmd_args(fake_stellar *fst, int argc, char **argv) return ret; } -static int hdgt_compare_result(struct fake_stellar *fst) +int hdgt_compare_result(struct fake_stellar *fst) { int final_result = 0; cJSON_bool case_sensitive = FLASE; @@ -441,7 +443,7 @@ static int hdgt_get_packet(struct fake_stellar *fst, struct fake_packet *fpkt) } else { - DEBUG_PRINT("Invalid data source type!\n"); + fprintf(stderr, "hdgt_get_packet(): invalid data source type!\n"); ret = -1; } @@ -762,7 +764,34 @@ static void hdgt_session_update(struct fake_stellar *fst, struct fake_session *f fst->http_decoder_entry((struct session *)fses, event, (struct packet *)fses->fpkt, fst->http_decoder_ctx); } -static int hdgt_data_source_init(struct fake_stellar *fst) +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) { @@ -776,22 +805,7 @@ static int hdgt_data_source_init(struct fake_stellar *fst) } else if (DATA_SOURCE_JSON == fst->data_source_type) { - char *file_cont = hdgt_get_file_content(fst->data_source_file_name); - if (NULL == file_cont) - { - fprintf(stderr, "Open json file fail: %s\n", fst->data_source_file_name); - return -1; - } - fst->data_src_json_para.json_root = cJSON_Parse(file_cont); - if (NULL == fst->data_src_json_para.json_root) - { - fprintf(stderr, "cJSON_Parse() %s fail!\n", fst->data_source_file_name); - MFREE(file_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; - MFREE(file_cont); + return hdgt_data_source_init_by_json_file(fst, fst->data_source_file_name); } else { @@ -835,24 +849,31 @@ static int hdgt_benchmakr_json_parse(struct fake_stellar *fst) return 0; } -static int hdgt_under_test_module_init(struct fake_stellar *fst) +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 = http_decoder_init((struct stellar *)fst); - fst->http_decoder_entry = http_decoder_entry; - + fst->http_decoder_ctx = init_fun((struct stellar *)fst); + fst->http_decoder_entry = entry_fun; return 0; } -static int hdgt_test_plug_init(struct fake_stellar *fst) +int hdgt_test_plug_init(struct fake_stellar *fst, HTTP_DECODER_INIT_FUN_T init_fun, HTTP_DECODER_PLUG_ENTRY_FUN_T entry_fun) { - fst->http_http_plug_ctx = http_decoder_test_init((struct stellar *)fst); + http_decoder_plug_set_entry_fuc(entry_fun); + fst->http_http_plug_ctx = init_fun((struct stellar *)fst); return 0; } -static struct fake_stellar *hdgt_init(int argc, char **argv) +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"); @@ -868,26 +889,24 @@ static struct fake_stellar *hdgt_init(int argc, char **argv) fprintf(stderr, "hdgt_benchmakr_json_parse() fail!\n"); goto fail_exit; } - if (hdgt_under_test_module_init(fst) < 0) + 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) < 0) + 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; } - g_fake_stellar = fst; - return fst; + return 0; fail_exit: - MFREE(fst); - return NULL; + return -1; } -static void hdgt_exit(struct fake_stellar *fst) +void hdgt_destroy(struct fake_stellar *fst) { cJSON_free(fst->load_benchmark_json_root); cJSON_free(fst->http_plug_test_result_root); @@ -929,7 +948,7 @@ static void hdgt_session_free(struct fake_session *fses) MFREE(fses); } -static void hdgt_main_loop(struct fake_stellar *fst) +void hdgt_main_loop(struct fake_stellar *fst) { struct fake_packet __null_pkt = {}; struct fake_packet fpkt = {}; @@ -960,27 +979,3 @@ static void hdgt_main_loop(struct fake_stellar *fst) hdgt_session_free(fses); } - -TEST(HTTP_DECODER, GTEST) -{ - ASSERT_EQ(0, hdgt_compare_result(g_fake_stellar)); -} - -int main(int argc, char **argv) -{ - struct fake_stellar *fake_st = hdgt_init(argc, argv); - if (NULL == fake_st) - { - fprintf(stderr, "hdgt_init() fail!\n"); - exit(1); - } - - hdgt_main_loop(fake_st); - - ::testing::InitGoogleTest(&argc, argv); - int ret = RUN_ALL_TESTS(); - - hdgt_exit(fake_st); - - return ret; -} diff --git a/test/http_decoder_gtest.cpp b/test/http_decoder_gtest.cpp index 5eaf1db..a853080 100644 --- a/test/http_decoder_gtest.cpp +++ b/test/http_decoder_gtest.cpp @@ -28,6 +28,8 @@ extern "C" #include "stellar/session_mq.h" #include "md5.h" int commit_test_result_json(cJSON *node, const char *name); + extern int http_decoder_test_entry(struct session *sess, int topic_id, const void *data,void *cb_arg); + static HTTP_DECODER_PLUG_ENTRY_FUN_T g_entry_fun = http_decoder_test_entry; } #endif @@ -52,6 +54,8 @@ static int g_header_count = 1; static int g_exdata_idx = 0; static int g_topic_id = 0; + + #if 0 void output_http_req_line(struct http_request_line *req_line) { @@ -318,7 +322,7 @@ http_decoder_test_entry(struct session *sess, int topic_id, const void *data, req_line_to_json(gtest_plug_exdata->result_jnode[HTTP_TRANSACTION_REQ], &req_line); break; case HTTP_MESSAGE_REQ_HEADER: - while (http_message_header_next(msg, &header) > 0) + while (http_message_header_next(msg, &header) >= 0) { http_header_to_json(gtest_plug_exdata->result_jnode[HTTP_TRANSACTION_REQ], &header); } @@ -338,7 +342,7 @@ http_decoder_test_entry(struct session *sess, int topic_id, const void *data, res_line_to_json(gtest_plug_exdata->result_jnode[HTTP_TRANSACTION_RES], &res_line); break; case HTTP_MESSAGE_RES_HEADER: - while (http_message_header_next(msg, &header) > 0) + while (http_message_header_next(msg, &header) >= 0) { http_header_to_json(gtest_plug_exdata->result_jnode[HTTP_TRANSACTION_RES], &header); } @@ -399,8 +403,8 @@ extern "C" void *http_decoder_test_init(struct stellar *st) exit(-1); } - session_mq_subscribe_topic(st, g_topic_id, http_decoder_test_entry, NULL); - printf("http_decoder_test_init OK!\n"); + session_mq_subscribe_topic(st, g_topic_id, g_entry_fun, NULL); + // printf("http_decoder_test_init OK!\n"); return NULL; } @@ -413,4 +417,9 @@ extern "C" void http_decoder_test_exit(void *test_ctx) } printf("http_decoder_test_exit OK!\n"); +} + +extern "C" void http_decoder_plug_set_entry_fuc(HTTP_DECODER_PLUG_ENTRY_FUN_T entry_fun) +{ + 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 b58def3..8e83a70 100644 --- a/test/http_decoder_gtest.h +++ b/test/http_decoder_gtest.h @@ -110,3 +110,19 @@ struct fake_session 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 diff --git a/test/http_decoder_stub.cpp b/test/http_decoder_stub.cpp index 77a1483..e719ebe 100644 --- a/test/http_decoder_stub.cpp +++ b/test/http_decoder_stub.cpp @@ -8,6 +8,8 @@ #include <string.h> #include "http_decoder.h" + + #ifdef __cplusplus extern "C" { @@ -18,12 +20,13 @@ extern "C" #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; - - extern struct fake_stellar *g_fake_stellar; + 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) { @@ -185,8 +188,7 @@ extern "C" 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) { - http_decoder_test_entry(sess, topic_id, data, NULL); - + 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; } @@ -217,7 +219,7 @@ extern "C" } int submit_len = MIN(fses->tcp_mss, fpkt->payload_data_len - fpkt->payload_submit_offset); - if(submit_len <= 0) + if (submit_len <= 0) { *payload_len = 0; return NULL; @@ -241,7 +243,9 @@ extern "C" int session_mq_subscribe_topic(struct stellar *st, int topic_id, on_msg_cb_func *sub_cb, void *cb_arg) { - // to do + //todo, support multiple topic? + g_topic_sub_cb = sub_cb; + g_topic_sub_cb_arg = cb_arg; return 0; } diff --git a/test/http_gtest_main.cpp b/test/http_gtest_main.cpp new file mode 100644 index 0000000..5b7aee5 --- /dev/null +++ b/test/http_gtest_main.cpp @@ -0,0 +1,44 @@ +#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 new file mode 100644 index 0000000..8b35d0c --- /dev/null +++ b/test/http_gtest_unit.cpp @@ -0,0 +1,569 @@ +#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 |
