feat: adapt to stellar-2.0

This commit is contained in:
lijia
2024-06-07 19:03:56 +08:00
parent 1ab2559887
commit 82cd2ced07
17 changed files with 605 additions and 723 deletions

View File

@@ -1,6 +1,5 @@
cmake_minimum_required (VERSION 2.8...3.10)
set(lib_name quic)
project(${lib_name}_test)
include(ExternalProject)
@@ -9,18 +8,14 @@ include(ExternalProject)
ExternalProject_Add(ProtoTest PREFIX ProtoTest
URL ${CMAKE_CURRENT_SOURCE_DIR}/test_protocol_run.zip
URL_MD5 71d8284b59af0286b5f31f0a3160bc44
URL_MD5 4b181e88dccdd1ec59a22a16ab8c5051
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=<INSTALL_DIR> -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
CONFIGURE_COMMAND ""
BUILD_COMMAND ""
INSTALL_COMMAND ""
COMMAND ${CMAKE_COMMAND} -E make_directory <SOURCE_DIR>/conf/${lib_name}/
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_SOURCE_DIR}/bin/${lib_name}.conf <SOURCE_DIR>/conf/${lib_name}/
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/conflist.inf <SOURCE_DIR>/plug/
COMMAND ${CMAKE_COMMAND} -E make_directory <SOURCE_DIR>/plug/protocol/${lib_name}/
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_SOURCE_DIR}/bin/${lib_name}.inf <SOURCE_DIR>/plug/protocol/${lib_name}/
COMMAND ${CMAKE_COMMAND} -E make_directory <SOURCE_DIR>/plug/business/${lib_name}_test_plug/
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_SOURCE_DIR}/test/${lib_name}_test_plug.inf <SOURCE_DIR>/plug/business/${lib_name}_test_plug/)
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_SOURCE_DIR}/bin/main.conf <SOURCE_DIR>/conf/${lib_name}/main.conf
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_SOURCE_DIR}/bin/${lib_name}.conf <SOURCE_DIR>/conf/${lib_name})
ExternalProject_Get_Property(ProtoTest INSTALL_DIR)
ExternalProject_Get_Property(ProtoTest SOURCE_DIR)
@@ -30,13 +25,16 @@ add_executable(proto_test_main IMPORTED GLOBAL)
add_dependencies(proto_test_main ProtoTest)
set_property(TARGET proto_test_main PROPERTY IMPORTED_LOCATION ${SOURCE_DIR}/test_protocol_plug_main)
add_library(${lib_name}_test_plug SHARED ${lib_name}_test_plug.cpp)
target_link_libraries(${lib_name}_test_plug MESA_prof_load cjson)
set_target_properties(${lib_name}_test_plug PROPERTIES PREFIX "")
add_test(NAME COPY_QUIC_SO COMMAND sh -c "cp ${CMAKE_BINARY_DIR}/${lib_name}.so ${PROTO_TEST_RUN_DIR}/plug/protocol/${lib_name}/${lib_name}.so")
add_test(NAME COPY_TEST_SO COMMAND sh -c "cp ${CMAKE_CURRENT_BINARY_DIR}/${lib_name}_test_plug.so ${PROTO_TEST_RUN_DIR}/plug/business/${lib_name}_test_plug/${lib_name}_test_plug.so")
add_test(NAME COPY_QUIC_SO COMMAND sh -c "cp ${CMAKE_BINARY_DIR}/src/${lib_name}.so ${PROTO_TEST_RUN_DIR}/stellar_plugin/${lib_name}.so")
add_test(NAME COPY_TEST_SO COMMAND sh -c "cp ${CMAKE_CURRENT_BINARY_DIR}/${lib_name}_test_plug.so ${PROTO_TEST_RUN_DIR}/stellar_plugin/${lib_name}_test_plug.so")
set_tests_properties(COPY_QUIC_SO COPY_TEST_SO
PROPERTIES FIXTURES_SETUP TestFixture)
add_test(NAME IQUIC_29_TEST COMMAND proto_test_main ${CMAKE_CURRENT_SOURCE_DIR}/pcap/iquic/29//${lib_name}_result.json -f "find ${CMAKE_CURRENT_SOURCE_DIR}/pcap/iquic/29/ -name *.pcap|sort -V" WORKING_DIRECTORY ${PROTO_TEST_RUN_DIR})
add_test(NAME GQUIC_23_TEST COMMAND proto_test_main ${CMAKE_CURRENT_SOURCE_DIR}/pcap/gquic/23/${lib_name}_result.json -f "find ${CMAKE_CURRENT_SOURCE_DIR}/pcap/gquic/23/ -name *.pcap|sort -V" WORKING_DIRECTORY ${PROTO_TEST_RUN_DIR})
add_test(NAME GQUIC_25_TEST COMMAND proto_test_main ${CMAKE_CURRENT_SOURCE_DIR}/pcap/gquic/25/${lib_name}_result.json -f "find ${CMAKE_CURRENT_SOURCE_DIR}/pcap/gquic/25/ -name *.pcap|sort -V" WORKING_DIRECTORY ${PROTO_TEST_RUN_DIR})
@@ -59,3 +57,28 @@ add_test(NAME QUIC_RFC9000_FRAGMENT COMMAND proto_test_main ${CMAKE_CURRENT_SOUR
add_test(NAME QUIC_RFC9000_SPECIAL COMMAND proto_test_main ${CMAKE_CURRENT_SOURCE_DIR}/pcap/rfc9000-special/${lib_name}_result.json -f "find ${CMAKE_CURRENT_SOURCE_DIR}/pcap/rfc9000-special/ -name *.pcap|sort -V" WORKING_DIRECTORY ${PROTO_TEST_RUN_DIR})
add_test(NAME QUIC_AIRPORT COMMAND proto_test_main ${CMAKE_CURRENT_SOURCE_DIR}/pcap/airport/${lib_name}_result.json -f "find ${CMAKE_CURRENT_SOURCE_DIR}/pcap/airport -name *.pcap|sort -V" WORKING_DIRECTORY ${PROTO_TEST_RUN_DIR})
add_test(NAME QUIC_SPECIAL COMMAND proto_test_main ${CMAKE_CURRENT_SOURCE_DIR}/pcap/special/${lib_name}_result.json -f "find ${CMAKE_CURRENT_SOURCE_DIR}/pcap/special/ -name *.pcap|sort -V" WORKING_DIRECTORY ${PROTO_TEST_RUN_DIR})
set_tests_properties(IQUIC_29_TEST
GQUIC_23_TEST
GQUIC_25_TEST
GQUIC_33_TEST
GQUIC_34_TEST
GQUIC_35_TEST
GQUIC_37_TEST
GQUIC_39_TEST
GQUIC_41_TEST
GQUIC_43_TEST
GQUIC_44_TEST
GQUIC_46_TEST
GQUIC_50_TEST
MVFST_01_TEST
MVFST_01_TEST
MVFST_02_TEST
TQUIC_TEST
IQUIC_PORT_8443_TEST
QUIC_RFC9000
QUIC_RFC9000_FRAGMENT
QUIC_RFC9000_SPECIAL
QUIC_AIRPORT
QUIC_SPECIAL
PROPERTIES FIXTURES_REQUIRED TestFixture)

View File

@@ -3,101 +3,135 @@
* create time:2021-8-21
*
*/
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <assert.h>
#include "cJSON.h"
#ifdef __cplusplus
extern "C"
{
#endif
#include "quic.h"
#include "MESA_prof_load.h"
#include <MESA/stream.h>
#include <stellar/stellar.h>
#include <stellar/session.h>
#include <stellar/session_mq.h>
#include <stellar/session_exdata.h>
extern "C" int commit_test_result_json(cJSON *node, const char *name);
extern "C" int quic_version_int2string(unsigned int version, char *buff, int buff_len);
static int g_result_count = 1;
extern "C" unsigned char QUIC_TEST_PLUG_ENTRY(stSessionInfo *session_info, void **pme,
int thread_seq, struct streaminfo *a_tcp, void *a_packet)
#if 0
#define DEBUG_PRINT(fmt, args...) fprintf(stderr, fmt, ##args)
#else
#define DEBUG_PRINT(fmt, args...)
#endif
struct quic_gtest_context
{
assert(NULL != session_info || pme != NULL);
cJSON *ctx = (cJSON *)*pme;
struct quic_info *quic_info=NULL;
char version_str[128]={0};
unsigned int version = 0;
if (session_info->session_state & SESSION_STATE_PENDING)
{
if (*pme == NULL)
{
ctx = cJSON_CreateObject();
*pme = (void *)ctx;
cJSON_AddStringToObject(ctx, "Tuple4", printaddr(&a_tcp->addr, a_tcp->threadnum));
}
}
switch (session_info->prot_flag)
{
case QUIC_CLIENT_HELLO:
if (session_info == NULL || session_info->app_info == NULL)
{
break;
}
quic_info = (struct quic_info *)session_info->app_info;
if(quic_info->client_hello==NULL)
{
break;
}
if(quic_info->client_hello->sni!=NULL)
{
cJSON_AddStringToObject(ctx, "SNI", (char *)(quic_info->client_hello->sni));
}
if(quic_info->client_hello->user_agent!=NULL)
{
cJSON_AddStringToObject(ctx, "UA", (char *)(quic_info->client_hello->user_agent));
}
quic_version_int2string((unsigned int)(quic_info->quic_version), version_str, sizeof(version_str));
cJSON_AddStringToObject(ctx, "VERSION", version_str);
break;
case QUIC_USEING_VERSION:
version = *(unsigned int *)(session_info->buf);
quic_version_int2string(version, version_str, sizeof(version_str));
cJSON_AddStringToObject(ctx, "VERSION", version_str);
break;
default:
break;
}
if(session_info->session_state&SESSION_STATE_CLOSE)
{
if(ctx)
{
char result_name[16]="";
sprintf(result_name,"QUIC_RESULT_%d", g_result_count);
commit_test_result_json(ctx, result_name);
g_result_count+=1;
}
*pme = NULL;
return PROT_STATE_DROPME;
}
return PROT_STATE_GIVEME;
cJSON *json_root;
};
static void cJSON_Add_QStringToObject(cJSON * object, const char *name, const struct qstring * qstring)
{
char *tmp = (char *)calloc(1, qstring->str_len + 1);
memcpy(tmp, qstring->str, qstring->str_len);
cJSON_AddStringToObject(object, name, tmp);
}
extern "C" int QUIC_TEST_PLUG_INIT()
extern "C" void QUIC_TEST_PLUG_ENTRY(struct session *sess, int topic_id, const void *msg, void *per_session_ctx, void *plugin_env)
{
return 0;
struct quic_gtest_context *qctx = (struct quic_gtest_context *)per_session_ctx;
struct quic_message *qmsg = (struct quic_message *)msg;
enum quic_message_type mtype = quic_message_type_get(qmsg);
DEBUG_PRINT("### QUIC_TEST_PLUG_ENTRY: mtype=%d\n", (int)mtype);
switch(mtype){
case QUIC_NEW:
qctx->json_root = cJSON_CreateObject();
cJSON_AddStringToObject(qctx->json_root, "Tuple4", session_get0_readable_addr(sess));
break;
case QUIC_VERSION:
{
unsigned int version_int = 0;
char version_str[128]={0};
quic_message_get_version(qmsg, &version_int);
assert(version_int != 0);
quic_version_int2string(version_int, version_str, sizeof(version_str));
cJSON_AddStringToObject(qctx->json_root, "VERSION", version_str);
DEBUG_PRINT("### QUIC_TEST_PLUG_ENTRY: version=%x, str_version=%s\n", version_int, version_str);
}
break;
case QUIC_SNI:
{
struct qstring result = {};
quic_message_get_sni(qmsg, &result);
cJSON_Add_QStringToObject(qctx->json_root, "SNI", &result);
DEBUG_PRINT("### QUIC_TEST_PLUG_ENTRY: len=%d, SNI=%p, %.*s\n", (int)result.str_len, result.str, (int)result.str_len, result.str);
}
break;
case QUIC_USER_AGENT:
{
struct qstring result = {};
quic_message_get_user_agent(qmsg, &result);
cJSON_Add_QStringToObject(qctx->json_root, "UA", &result);
DEBUG_PRINT("### QUIC_TEST_PLUG_ENTRY: len=%d, UA=%p, %.*s\n", (int)result.str_len, result.str, (int)result.str_len, result.str);
}
break;
case QUIC_FREE:
{
char result_name[16]="";
sprintf(result_name,"QUIC_RESULT_%d", g_result_count);
commit_test_result_json(qctx->json_root, result_name);
g_result_count+=1;
}
break;
default:
break;
}
return ;
}
extern "C" void QUIC_TEST_PLUG_DESTROY(void)
extern "C" void *quic_gtest_plug_session_ctx_new_cb(struct session *sess, void *plugin_env)
{
struct quic_gtest_context *ctx = (struct quic_gtest_context *)calloc(1, sizeof(struct quic_gtest_context));
return ctx;
}
extern "C" void quic_gtest_session_ctx_free_cb(struct session *sess, void *session_ctx, void *plugin_env)
{
free(session_ctx);
}
extern "C" void *QUIC_TEST_PLUG_INIT(struct stellar *st)
{
void *fake_quic_gtest_plugin_env = (void *)"_fake_plugin_env_";
int quic_gtest_plug_id = stellar_session_plugin_register(st, quic_gtest_plug_session_ctx_new_cb, quic_gtest_session_ctx_free_cb, fake_quic_gtest_plugin_env);
int quic_topic_id = stellar_session_mq_get_topic_id(st, QUIC_DECODER_TOPIC);
assert(quic_topic_id >= 0);
stellar_session_mq_subscribe(st, quic_topic_id, QUIC_TEST_PLUG_ENTRY, quic_gtest_plug_id);
return fake_quic_gtest_plugin_env;
}
extern "C" void QUIC_TEST_PLUG_DESTROY(void *plugin_env)
{
return ;
}
#ifdef __cplusplus
}
#endif

Binary file not shown.