diff options
Diffstat (limited to 'test/ftp_decoder_test_plug.cpp')
| -rw-r--r-- | test/ftp_decoder_test_plug.cpp | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/test/ftp_decoder_test_plug.cpp b/test/ftp_decoder_test_plug.cpp new file mode 100644 index 0000000..7e51544 --- /dev/null +++ b/test/ftp_decoder_test_plug.cpp @@ -0,0 +1,117 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <assert.h> +#include "cJSON.h" + +#ifdef __cplusplus +extern "C" +{ +#endif +#include "ftp_decoder.h" +#include <stellar/stellar.h> +#include <stellar/session.h> +#include <stellar/session_mq.h> +#include <stellar/session_exdata.h> +extern int commit_test_result_json(cJSON *node, const char *name); +#ifdef __cplusplus +} +#endif + +static int g_result_count = 0; +struct ftp_test_context +{ + cJSON *json_root; + size_t tot_file_len; + int cmd_index; +}; + +void ftp_iovec_add_to_json(cJSON *object, const char *key, const struct iovec *fmsg_value, int cmd_index) +{ + char *tmp = (char *)calloc(1, fmsg_value->iov_len + 1); + memcpy(tmp, fmsg_value->iov_base, fmsg_value->iov_len); + char key_with_index[128] = {}; + snprintf(key_with_index, sizeof(key_with_index), "%s_%d", key, cmd_index); + cJSON_AddStringToObject(object, key_with_index, tmp); + free(tmp); + return ; +} + +extern "C" void *ftp_test_plug_session_ctx_new_cb(struct session *sess, void *plugin_env) +{ + struct ftp_test_context *fctx = (struct ftp_test_context *)calloc(1, sizeof(struct ftp_test_context)); + fctx->json_root = cJSON_CreateObject(); + return fctx; +} + +extern "C" void ftp_test_session_ctx_free_cb(struct session *sess, void *session_ctx, void *plugin_env) +{ + struct ftp_test_context *fctx = (struct ftp_test_context *)session_ctx; + if(fctx->tot_file_len > 0){ + cJSON_AddNumberToObject(fctx->json_root, "total-payload-len", fctx->tot_file_len); + } + char result_name[16]=""; + sprintf(result_name,"FTP_RESULT_%d", g_result_count); + commit_test_result_json(fctx->json_root, result_name); + g_result_count+=1; + free(session_ctx); +} + +extern "C" void FTP_TEST_PLUG_DATA_ENTRY(struct session *sess, int topic_id, const void *msg, void *per_session_ctx, void *plugin_env) +{ + struct ftp_test_context *fctx = (struct ftp_test_context *)per_session_ctx; + struct ftp_message *fmsg = (struct ftp_message *)msg; + enum session_state sstate = session_get_current_state(sess); + if(SESSION_STATE_OPENING == sstate){ + cJSON_AddStringToObject(fctx->json_root, "FTP_LINK_TYPE", "DATA"); + cJSON_AddStringToObject(fctx->json_root, "TUPLE4", session_get0_readable_addr(sess)); + } + enum ftp_msg_type fmsg_type; + struct iovec fmsg_value; + while(ftp_message_iterate(fmsg, &fmsg_type, &fmsg_value)){ + if(fmsg_type == FTP_INVENTORY || fmsg_type == FTP_FILE_CONTENT){ + fctx->tot_file_len += fmsg_value.iov_len; + }else{ + // printf("### ftp data plug: len=%d, %.*s\n", (int)fmsg_value.iov_len, (int)fmsg_value.iov_len, (char *)fmsg_value.iov_base); + ftp_iovec_add_to_json(fctx->json_root, ftp_message_type_to_string(fmsg_type), &fmsg_value, ++fctx->cmd_index); + } + } +} +extern "C" void FTP_TEST_PLUG_CTRL_ENTRY(struct session *sess, int topic_id, const void *msg, void *per_session_ctx, void *plugin_env) +{ + struct ftp_test_context *fctx = (struct ftp_test_context *)per_session_ctx; + struct ftp_message *fmsg = (struct ftp_message *)msg; + enum session_state sstate = session_get_current_state(sess); + if(SESSION_STATE_OPENING == sstate){ + cJSON_AddStringToObject(fctx->json_root, "FTP_LINK_TYPE", "CTRL"); + cJSON_AddStringToObject(fctx->json_root, "TUPLE4", session_get0_readable_addr(sess)); + } + enum ftp_msg_type fmsg_type; + struct iovec fmsg_value; + while(ftp_message_iterate(fmsg, &fmsg_type, &fmsg_value)){ + // printf("### ftp ctrl plug: len=%d, %.*s\n", (int)fmsg_value.iov_len, (int)fmsg_value.iov_len, (char *)fmsg_value.iov_base); + ftp_iovec_add_to_json(fctx->json_root, ftp_message_type_to_string(fmsg_type), &fmsg_value, ++fctx->cmd_index); + } +} + +extern "C" void *FTP_TEST_PLUG_INIT(struct stellar *st) +{ + void *fake_ftp_test_plugin_env = (void *)"_fake_plugin_env_"; + int ftp_test_plug_id = stellar_session_plugin_register(st, ftp_test_plug_session_ctx_new_cb, ftp_test_session_ctx_free_cb, fake_ftp_test_plugin_env); + int ftp_ctrl_topic_id = stellar_session_mq_get_topic_id(st, FTP_DECODER_CTRL_TOPIC); + assert(ftp_ctrl_topic_id >= 0); + int ftp_data_topic_id = stellar_session_mq_get_topic_id(st, FTP_DECODER_DATA_TOPIC); + assert(ftp_data_topic_id >= 0); + + stellar_session_mq_subscribe(st, ftp_ctrl_topic_id, FTP_TEST_PLUG_CTRL_ENTRY, ftp_test_plug_id); + stellar_session_mq_subscribe(st, ftp_data_topic_id, FTP_TEST_PLUG_DATA_ENTRY, ftp_test_plug_id); + + return fake_ftp_test_plugin_env; +} + +extern "C" void FTP_TEST_PLUG_DESTROY(void *plugin_env) +{ + //do nothing + return ; +}
\ No newline at end of file |
