summaryrefslogtreecommitdiff
path: root/test/ftp_decoder_test_plug.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'test/ftp_decoder_test_plug.cpp')
-rw-r--r--test/ftp_decoder_test_plug.cpp117
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