summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
author李佳 <[email protected]>2024-04-12 11:41:14 +0000
committer李佳 <[email protected]>2024-04-12 11:41:14 +0000
commitf40db506ee7570e836ac97b7806a679bc36da155 (patch)
treee4483ca1d2a28079c57ab6f0ac055dfe08c47915 /test
parent55ac6e270ae37299e2bce3a47a3d784e29dcae14 (diff)
parent094d0f8e45931b195e358989d2843a298e9fd567 (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.txt15
-rw-r--r--test/http_decoder_driver.cpp133
-rw-r--r--test/http_decoder_gtest.cpp17
-rw-r--r--test/http_decoder_gtest.h16
-rw-r--r--test/http_decoder_stub.cpp16
-rw-r--r--test/http_gtest_main.cpp44
-rw-r--r--test/http_gtest_unit.cpp569
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