summaryrefslogtreecommitdiff
path: root/test/http_decoder_perf_main.cpp
diff options
context:
space:
mode:
authorlijia <[email protected]>2024-05-24 22:47:32 +0800
committerlijia <[email protected]>2024-05-26 19:45:15 +0800
commit50a9fea27ca30d532bf89bc8fd7e6025a240e9e4 (patch)
treee066e771c8a4abb3f1997ea3e0aebcb2d259f85e /test/http_decoder_perf_main.cpp
parent22d071e23ff423242f51dce2eab1477b5fb9d106 (diff)
Adapt to stellar v2.0v2.0.1
Diffstat (limited to 'test/http_decoder_perf_main.cpp')
-rw-r--r--test/http_decoder_perf_main.cpp358
1 files changed, 358 insertions, 0 deletions
diff --git a/test/http_decoder_perf_main.cpp b/test/http_decoder_perf_main.cpp
new file mode 100644
index 0000000..93e13ad
--- /dev/null
+++ b/test/http_decoder_perf_main.cpp
@@ -0,0 +1,358 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <time.h>
+#include "http_decoder_inc.h"
+
+#define TIME_MEASURE 1
+#if TIME_MEASURE
+#define TIME_START() struct timespec _start_time, _end_time; clock_gettime(CLOCK_REALTIME, &_start_time)
+#define TIME_DIFF() \
+ long long time_diff_ns;\
+ do { \
+ clock_gettime(CLOCK_REALTIME, &_end_time); \
+ if (likely(_end_time.tv_sec == _start_time.tv_sec))\
+ {\
+ time_diff_ns = (_end_time.tv_nsec - _start_time.tv_nsec);\
+ }else{\
+ time_diff_ns = (_end_time.tv_sec * 1000 * 1000 * 1000 + _end_time.tv_nsec) - (_start_time.tv_sec * 1000 * 1000 * 1000 + _start_time.tv_nsec);\
+ }\
+ }while (0)
+#else
+#define TIME_START()
+#define TIME_DIFF()
+#endif
+
+struct packet{
+ const char *payload;
+ size_t payload_len;
+ u_int8_t dir;
+};
+
+struct stellar{
+ int plugin_id;
+ void *plugin_env;
+ int exdata_id;
+ void *exdata;
+ int consumer_topid_id;
+ int publish_topic_id;
+ session_exdata_free *free_func;
+ msg_free_cb_func *publish_msg_free_cb;
+};
+
+struct session{
+ struct stellar *st;
+ struct session_addr addr;
+ void *context;
+ void *exdata;
+ void *message;
+ const struct packet *current_payload_st;
+};
+
+extern "C" void *http_decoder_init(struct stellar *st);
+extern "C" void http_decoder_exit(void *plugin_env);
+extern "C" void *_httpd_session_ctx_new_cb(struct session *sess, void *plugin_env);
+extern "C" void _httpd_ex_data_free_cb(struct session *s, int idx,void *ex_data, void *arg);
+extern "C" void http_decoder_tcp_stream_msg_cb(struct session *sess, int topic_id, const void *msg, void *no_use_ctx, void *plugin_env);
+extern "C" void http_decoder_perf_entry(struct session *sess, int topic_id, const void *raw_msg, void *per_session_ctx, void *plugin_env);
+
+static struct fieldstat_easy *fs4_instance;
+static struct fieldstat_tag FS4_SIMPLE_HISGRAM_TAG;
+static int fs4_simple_id;
+
+static struct fieldstat_tag FS4_LONG_LONG_URL_HISGRAM_TAG;
+static int fs4_long_long_url_id;
+
+static struct fieldstat_tag FS4_FRAG_HISGRAM_TAG;
+static int fs4_frag_id;
+
+void stellar_session_plugin_dettach_current_session(struct session *sess)
+{
+ return;
+}
+
+int stellar_session_mq_destroy_topic(struct stellar *st, int topic_id)
+{
+ return 0;
+}
+int stellar_get_worker_thread_num(struct stellar *st)
+{
+ return 1;
+}
+int stellar_get_current_thread_id(struct stellar *st)
+{
+ return 0;
+}
+int stellar_session_plugin_register(struct stellar *st,
+ session_ctx_new_func session_ctx_new,
+ session_ctx_free_func session_ctx_free,
+ void *plugin_env)
+{
+ return 0;
+}
+int stellar_session_exdata_new_index(struct stellar *st, const char *name, session_exdata_free *free_func,void *arg)
+{
+ st->free_func = free_func;
+ return 0;
+}
+int session_exdata_set(struct session *sess, int idx, void *ex_ptr)
+{
+ sess->exdata = ex_ptr;
+ return 0;
+}
+void *session_exdata_get(struct session *sess, int idx)
+{
+ return sess->exdata;
+}
+
+int stellar_session_mq_get_topic_id(struct stellar *st, const char *topic_name)
+{
+ if(strcmp(topic_name, "HTTP_DECODER_MESSAGE") == 0){
+ return st->publish_topic_id;
+ }
+ if(strcmp(topic_name, "TCP_STREAM") == 0){
+ return st->consumer_topid_id;
+ }
+ assert(0);
+ return -1;
+}
+
+int stellar_session_mq_create_topic(struct stellar *st, const char *topic_name, msg_free_cb_func *msg_free_cb, void *msg_free_arg)
+{
+ if(strcmp(topic_name, "HTTP_DECODER_MESSAGE") == 0){
+ st->publish_topic_id = 1;
+ st->publish_msg_free_cb = msg_free_cb;
+ return 1;
+ }
+ if(strcmp(topic_name, "TCP_STREAM") == 0){
+ st->consumer_topid_id = 2;
+ return 2;
+ }
+ return -1;
+}
+const char *session_get0_current_payload(struct session *sess, size_t *payload_len)
+{
+ const struct packet *test_payload = sess->current_payload_st;
+ *payload_len = test_payload->payload_len;
+ return test_payload->payload;
+}
+
+
+struct session_addr *session_get0_addr(struct session *sess, enum session_addr_type *addr_type)
+{
+ *addr_type = SESSION_ADDR_TYPE_IPV4_TCP;
+ return &sess->addr;
+}
+
+int packet_get_direction(const struct packet *pkt)
+{
+ return pkt->dir;
+}
+
+const struct packet *session_get0_current_packet(struct session *sess)
+{
+ return sess->current_payload_st;
+}
+int stellar_session_mq_subscribe(struct stellar *st, int topic_id, on_msg_cb_func *plugin_on_msg_cb, int plugin_id)
+{
+ return 0;
+}
+int session_mq_publish_message(struct session *sess, int topic_id, void *msg)
+{
+ if(topic_id == sess->st->publish_topic_id){
+ http_decoder_perf_entry(sess, topic_id, msg, NULL, NULL);
+ //maybe generate many messages for one packet, so free msg immediately
+ sess->st->publish_msg_free_cb(msg, NULL);
+ }
+ return 0;
+}
+
+static void perf_test_init_per_session(struct session *sess)
+{
+ sess->context = _httpd_session_ctx_new_cb(sess, sess->st->plugin_env);
+}
+
+static void perf_test_free_per_session(struct session *sess)
+{
+ sess->st->free_func(sess, sess->st->exdata_id, sess->exdata, NULL);
+}
+
+static void perf_test_loop(struct session *sess, struct packet *test_payload, int size, const struct fieldstat_tag *tag, int fs4_metric_id)
+{
+ TIME_START();
+ sess->current_payload_st = &test_payload[0];
+ perf_test_init_per_session(sess);
+
+ for(int i = 0; i < size; i++)
+ {
+ sess->current_payload_st = &test_payload[i];
+ http_decoder_tcp_stream_msg_cb(sess, sess->st->consumer_topid_id, test_payload[i].payload, NULL, sess->st->plugin_env);
+ }
+ perf_test_free_per_session(sess);
+ TIME_DIFF();
+ // printf("time diff: %lld ns\n", time_diff_ns);
+ fieldstat_easy_histogram_record(fs4_instance, 0, fs4_metric_id, tag, 1, time_diff_ns);
+}
+
+static void perf_test_load_plug(struct stellar *st)
+{
+ st->plugin_env = http_decoder_init(st);
+ assert(st->plugin_env != NULL);
+ return;
+}
+
+static void perf_test_init(struct stellar *st, struct session *sess)
+{
+ memset(st, 0, sizeof(struct stellar));
+ memset(sess, 0, sizeof(struct session));
+ st->plugin_id = 0;
+ st->exdata_id = 0;
+ st->publish_topic_id = -1; //init
+ st->consumer_topid_id = 2; //init
+ perf_test_load_plug(st);
+
+ sess->st = st;
+ sess->addr.ipv4.saddr = 0x01020304;
+ sess->addr.ipv4.daddr = 0x05060708;
+ sess->addr.ipv4.sport = 12345;
+ sess->addr.ipv4.dport = 80;
+}
+
+#define SET_DATA_LENGTH_DIR(pkt_payload, cstr_in_heap, cur_dir, tmp_index) \
+ pkt_payload.payload = cstr_in_heap; \
+ pkt_payload.payload_len = strlen(cstr_in_heap); \
+ pkt_payload.dir = cur_dir;\
+ tmp_index++;
+
+static void init_test_data_simple(struct packet *test_payload, int *index)
+{
+ int tmp_index = 0;
+ const char *c2s_payload = "GET / HTTP/1.1\r\nHost: www.simple.com\r\nConnection: keep-alive\r\nCache-Control: max-age=0\r\nUpgrade-Insecure-Requests: 1\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8\r\nAccept-Encoding: gzip, deflate\r\nAccept-Language: zh-CN,zh;q=0.9\r\n\r\n";
+ SET_DATA_LENGTH_DIR(test_payload[tmp_index], c2s_payload, PACKET_DIRECTION_C2S, tmp_index);
+
+ const char *content = "Hello, http decoder perf test simple!!!";
+ int content_length = strlen(content);
+ char *s2c_payload = (char *)malloc(1024);
+ snprintf(s2c_payload, 1024, "HTTP/1.1 200 OK\r\nServer: Apache-Coyote/1.1\r\nConnection: keep-alive\r\nDate: Sat, 01 May 2024 01:36:57 GMT\r\nContent-Type: text/html;charset=UTF-8\r\nContent-Length: %d\r\n\r\n%s", content_length, content);
+
+ SET_DATA_LENGTH_DIR(test_payload[tmp_index], s2c_payload, PACKET_DIRECTION_S2C, tmp_index);
+
+ *index = tmp_index;
+}
+
+static void init_test_data_frag(struct packet *test_payload, int *index)
+{
+ int tmp_index = 0;
+ /* c2s */
+ SET_DATA_LENGTH_DIR(test_payload[tmp_index], "GET / HTTP/1.1\r\n", PACKET_DIRECTION_C2S, tmp_index);
+ SET_DATA_LENGTH_DIR(test_payload[tmp_index], "Host: www.fragment.com\r\n", PACKET_DIRECTION_C2S, tmp_index);
+ SET_DATA_LENGTH_DIR(test_payload[tmp_index], "Cache-Control: max-age=0\r\n", PACKET_DIRECTION_C2S, tmp_index);
+ SET_DATA_LENGTH_DIR(test_payload[tmp_index], "Connection: keep-alive\r\n", PACKET_DIRECTION_C2S, tmp_index);
+ SET_DATA_LENGTH_DIR(test_payload[tmp_index], "Referer: http://fragment.com/register.jsp?redirect:http://aa.bb.cc.dd.com/?\r\n", PACKET_DIRECTION_C2S, tmp_index);
+ SET_DATA_LENGTH_DIR(test_payload[tmp_index], "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299\r\n", PACKET_DIRECTION_C2S, tmp_index);
+ SET_DATA_LENGTH_DIR(test_payload[tmp_index], "Cookie: JSESSIONID=385C79E211D561C0CA13D90F150F603D34875GH87FSHG8S7RTHG74875GHS8R7THG87SRTH\r\n", PACKET_DIRECTION_C2S, tmp_index);
+ SET_DATA_LENGTH_DIR(test_payload[tmp_index], "Accept: */*\r\n", PACKET_DIRECTION_C2S, tmp_index);
+ SET_DATA_LENGTH_DIR(test_payload[tmp_index], "Accept-Encoding: gzip, deflate\r\n", PACKET_DIRECTION_C2S, tmp_index);
+ SET_DATA_LENGTH_DIR(test_payload[tmp_index], "\r\n", PACKET_DIRECTION_C2S, tmp_index); //header EOF
+
+ /* s2c */
+ SET_DATA_LENGTH_DIR(test_payload[tmp_index], "HTTP/1.1 200 OK\r\n", PACKET_DIRECTION_S2C, tmp_index);
+ SET_DATA_LENGTH_DIR(test_payload[tmp_index], "Server: Apache-Coyote/1.1\r\n", PACKET_DIRECTION_S2C, tmp_index);
+ SET_DATA_LENGTH_DIR(test_payload[tmp_index], "Connection: keep-alive\r\n", PACKET_DIRECTION_S2C, tmp_index);
+ SET_DATA_LENGTH_DIR(test_payload[tmp_index], "Content-Type: text/html;charset=UTF-8\r\n", PACKET_DIRECTION_S2C, tmp_index);
+ SET_DATA_LENGTH_DIR(test_payload[tmp_index], "Date: Sat, 01 May 2024 01:36:57 GMT\r\n", PACKET_DIRECTION_S2C, tmp_index);
+
+ char *cont_len_buf = (char *)malloc(1024);
+ const char *s2c_payload = "Hello, http decoder perf test fragment!!!";
+ int content_length = strlen(s2c_payload);
+ snprintf(cont_len_buf, 1024, "Content-Length: %d\r\n\r\n", content_length);
+ SET_DATA_LENGTH_DIR(test_payload[tmp_index], cont_len_buf, PACKET_DIRECTION_S2C, tmp_index);
+
+ SET_DATA_LENGTH_DIR(test_payload[tmp_index], "\r\n", PACKET_DIRECTION_S2C, tmp_index); //header EOF
+
+ SET_DATA_LENGTH_DIR(test_payload[tmp_index], s2c_payload, PACKET_DIRECTION_S2C, tmp_index);
+
+ *index = tmp_index;
+}
+
+static void init_test_data_long_long_url(struct packet *test_payload, int *index)
+{
+ int tmp_index = 0;
+
+ const char *request_line_frag1 = "GET /long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/\
+/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/\
+/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/\
+/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/\
+/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/\
+/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/\
+/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/\
+/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/";
+ SET_DATA_LENGTH_DIR(test_payload[tmp_index], request_line_frag1, PACKET_DIRECTION_C2S, tmp_index);
+
+ const char *request_line_frag2 = "long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/\
+/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/\
+/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long/long.index.html HTTP/1.1\r\n";
+ SET_DATA_LENGTH_DIR(test_payload[tmp_index], request_line_frag2, PACKET_DIRECTION_C2S, tmp_index);
+
+ const char *request_line_frag3 = "Host: www.long-long-url.com\r\nConnection: keep-alive\r\nCache-Control: max-age=0\r\nUpgrade-Insecure-Requests: 1\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8\r\nAccept-Encoding: gzip, deflate\r\nAccept-Language: zh-CN,zh;q=0.9\r\n\r\n";
+ SET_DATA_LENGTH_DIR(test_payload[tmp_index], request_line_frag3, PACKET_DIRECTION_C2S, tmp_index);
+
+ const char *content = "Hello, http decoder perf test long long url!!!";
+ int content_length = strlen(content);
+ char *s2c_payload = (char *)malloc(1024);
+ snprintf(s2c_payload, 1024, "HTTP/1.1 200 OK\r\nServer: Apache-Coyote/1.1\r\nConnection: keep-alive\r\nDate: Sat, 01 May 2024 01:36:57 GMT\r\nContent-Type: text/html;charset=UTF-8\r\nContent-Length: %d\r\n\r\n%s", content_length, content);
+
+ SET_DATA_LENGTH_DIR(test_payload[tmp_index], s2c_payload, PACKET_DIRECTION_S2C, tmp_index);
+
+ *index = tmp_index;
+}
+
+static void perf_stat_init(void)
+{
+ fs4_instance = fieldstat_easy_new(1, "http_decoder_test", NULL, 0);
+ fieldstat_easy_enable_auto_output(fs4_instance, "./httpd_fs4.json", 1);
+
+ FS4_SIMPLE_HISGRAM_TAG.key = "simple";
+ FS4_SIMPLE_HISGRAM_TAG.type = TAG_DOUBLE;
+ FS4_SIMPLE_HISGRAM_TAG.value_double = 0.00001;
+ fs4_simple_id = fieldstat_easy_register_histogram(fs4_instance, "simple", 1, 99999999, 5);
+
+ FS4_FRAG_HISGRAM_TAG.key = "frag";
+ FS4_FRAG_HISGRAM_TAG.type = TAG_DOUBLE;
+ FS4_FRAG_HISGRAM_TAG.value_double = 0.00001;
+ fs4_frag_id = fieldstat_easy_register_histogram(fs4_instance, "frag", 1, 99999999, 5);
+
+ FS4_LONG_LONG_URL_HISGRAM_TAG.key = "long-url";
+ FS4_LONG_LONG_URL_HISGRAM_TAG.type = TAG_DOUBLE;
+ FS4_LONG_LONG_URL_HISGRAM_TAG.value_double = 0.00001;
+ fs4_long_long_url_id = fieldstat_easy_register_histogram(fs4_instance, "long-url", 1, 99999999, 5);
+}
+
+int main(int argc, char const *argv[])
+{
+ struct stellar st;
+ struct session sess;
+ struct packet test_payload_simple [4] = {};
+ int payload_index_simple = 0;
+
+ struct packet test_payload_long_long_url [8] = {};
+ int payload_index_long_long_url = 0;
+
+ struct packet test_payload_frag [32] = {};
+ int payload_index_frag = 0;
+
+ perf_test_init(&st, &sess);
+ perf_stat_init();
+
+ init_test_data_simple(test_payload_simple, &payload_index_simple);
+ init_test_data_long_long_url(test_payload_long_long_url, &payload_index_long_long_url);
+ init_test_data_frag(test_payload_frag, &payload_index_frag);
+
+ while(1){
+ perf_test_loop(&sess, test_payload_simple, payload_index_simple, &FS4_SIMPLE_HISGRAM_TAG, fs4_simple_id);
+ perf_test_loop(&sess, test_payload_long_long_url, payload_index_long_long_url, &FS4_LONG_LONG_URL_HISGRAM_TAG, fs4_long_long_url_id);
+ perf_test_loop(&sess, test_payload_frag, payload_index_frag, &FS4_FRAG_HISGRAM_TAG, fs4_frag_id);
+ }
+ return 0;
+}