TSG-13520,TSG-13356: 支持通过tsg_pull_shaping_result函数获取命中的shaping策略,增加common_shaping_rule_ids日志字段,支持通过bridge接口及时通知命中的shaping策略,增加gtest测试用例
This commit is contained in:
@@ -1,36 +1,30 @@
|
||||
cmake_minimum_required(VERSION 2.8)
|
||||
|
||||
set(SRC ../src/tsg_entry.cpp ../src/tsg_rule.cpp ../src/tsg_ssl_utils.cpp ../src/tsg_send_log.cpp ../src/tsg_statistic.cpp ../src/tsg_ssh_utils.cpp ../src/tsg_gtp_signaling.cpp ../src/tsg_action.cpp ../src/tsg_leaky_bucket.cpp ../src/tsg_dns.cpp ../src/tsg_icmp.cpp ../src/tsg_tamper.cpp tsg_master_gtest_protocol.cpp tsg_master_gtest_entry.cpp)
|
||||
|
||||
include_directories(${CMAKE_SOURCE_DIR}/inc)
|
||||
include_directories(/opt/MESA/include/MESA/)
|
||||
include_directories(/opt/MESA/include)
|
||||
include_directories(/usr/include/)
|
||||
|
||||
set(TSG_MASTER_DEPEND_DYN_LIB MESA_handle_logger MESA_prof_load maatframe pthread MESA_field_stat2 rdkafka cjson MESA_jump_layer)
|
||||
|
||||
set(CMAKE_INSTALL_PREFIX /home/mesasoft/sapp_run)
|
||||
|
||||
add_library(tsg_master_gtest SHARED ${SRC})
|
||||
set_target_properties(tsg_master_gtest PROPERTIES LINK_FLAGS "-Wl,--version-script=${PROJECT_SOURCE_DIR}/src/version.map")
|
||||
target_link_libraries(tsg_master_gtest ${TSG_MASTER_DEPEND_DYN_LIB} ctemplate-static)
|
||||
set_target_properties(tsg_master_gtest PROPERTIES PREFIX "")
|
||||
|
||||
install(TARGETS tsg_master_gtest LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/plug/platform/tsg_master_gtest COMPONENT LIBRARIES)
|
||||
install(FILES ../bin/tsg_master.inf DESTINATION ${CMAKE_INSTALL_PREFIX}/plug/platform/tsg_master_gtest COMPONENT PROFILE)
|
||||
|
||||
include_directories(${PROJECT_SOURCE_DIR}/src/)
|
||||
|
||||
add_definitions(-std=c++11)
|
||||
LINK_DIRECTORIES(/opt/MESA/lib)
|
||||
|
||||
file(GLOB TEST_CASE "tsg_master_gtest_main.cpp")
|
||||
|
||||
add_executable(master_gtest ${TEST_CASE})
|
||||
target_compile_options(master_gtest PUBLIC ${MEM_POOL_DEFINITIONS})
|
||||
target_link_libraries(master_gtest nsl pthread dl m pcap systemd cjson MESA_prof_load MESA_htable MESA_handle_logger MESA_jump_layer breakpad_mini MESA_field_stat2 rdkafka)
|
||||
target_link_libraries(master_gtest /home/mesasoft/sapp_run/lib/libsapp_devel.so)
|
||||
target_link_libraries(master_gtest gtest-static ctemplate-static)
|
||||
|
||||
install(TARGETS master_gtest DESTINATION ${CMAKE_INSTALL_PREFIX}/ COMPONENT EXECUTABLE)
|
||||
add_executable(gtest_rule ${PROJECT_SOURCE_DIR}/src/tsg_rule.cpp gtest_common.cpp gtest_rule.cpp)
|
||||
target_link_libraries(gtest_rule gtest-static ctemplate-static cjson MESA_prof_load MESA_handle_logger MESA_jump_layer MESA_field_stat2 maatframe)
|
||||
|
||||
set(TSG_MASTER_SRC ${PROJECT_SOURCE_DIR}/src/tsg_entry.cpp
|
||||
${PROJECT_SOURCE_DIR}/src/tsg_rule.cpp
|
||||
${PROJECT_SOURCE_DIR}/src/tsg_ssl_utils.cpp
|
||||
${PROJECT_SOURCE_DIR}/src/tsg_send_log.cpp
|
||||
${PROJECT_SOURCE_DIR}/src/tsg_statistic.cpp
|
||||
${PROJECT_SOURCE_DIR}/src/tsg_ssh_utils.cpp
|
||||
${PROJECT_SOURCE_DIR}/src/tsg_gtp_signaling.cpp
|
||||
${PROJECT_SOURCE_DIR}/src/tsg_action.cpp
|
||||
${PROJECT_SOURCE_DIR}/src/tsg_leaky_bucket.cpp
|
||||
${PROJECT_SOURCE_DIR}/src/tsg_dns.cpp
|
||||
${PROJECT_SOURCE_DIR}/src/tsg_icmp.cpp
|
||||
${PROJECT_SOURCE_DIR}/src/tsg_tamper.cpp
|
||||
)
|
||||
|
||||
add_executable(gtest_master ${TSG_MASTER_SRC} gtest_common.cpp gtest_master.cpp)
|
||||
target_link_libraries(gtest_master gtest-static ctemplate-static cjson MESA_prof_load MESA_handle_logger MESA_jump_layer MESA_field_stat2 maatframe rdkafka MESA_htable)
|
||||
|
||||
239
test/src/gtest_common.cpp
Normal file
239
test/src/gtest_common.cpp
Normal file
@@ -0,0 +1,239 @@
|
||||
#include <MESA/stream.h>
|
||||
#include "tsg_entry.h"
|
||||
|
||||
const char *gtest_addrlist="127.0.0.1.37690>127.0.0.1.443";
|
||||
|
||||
void dictator_free(int thread_seq, void * pbuf)
|
||||
{
|
||||
free(pbuf);
|
||||
pbuf=NULL;
|
||||
}
|
||||
|
||||
void *dictator_malloc(int thread_seq,size_t size)
|
||||
{
|
||||
return calloc(1, size);
|
||||
}
|
||||
|
||||
const char *printaddr (const struct layer_addr *paddrinfo, int threadindex)
|
||||
{
|
||||
return gtest_addrlist;
|
||||
}
|
||||
|
||||
int get_thread_count(void)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
int MESA_rst_tcp(struct streaminfo * stream, struct rst_tcp_para * paras, int para_len)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
int sapp_inject_pkt(struct streaminfo * stream, enum sapp_inject_opt sio, const void * payload, int payload_len, unsigned char snd_routedir)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
unsigned char MESA_dir_reverse(unsigned char raw_route_dir)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
extern "C" int MESA_get_dev_ipv4(const char * device, int * ip_add)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
extern "C" int sendpacket_do_checksum(unsigned char *buf, int protocol, int len)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
char *layer_addr_ntop_r(const struct streaminfo * pstream, char * out_buf, int out_buf_len)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
const char *layer_addr_prefix_ntop(const struct streaminfo * pstream)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int stream_addr_list_ntop(const struct streaminfo * pstream, char * dst, int size)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
int MESA_dir_link_to_human(int link_route_dir)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int MESA_set_stream_opt(const struct streaminfo * pstream, enum MESA_stream_opt opt, void * opt_val, int opt_val_len)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
int MESA_get_stream_opt(const struct streaminfo * pstream, enum MESA_stream_opt opt, void * opt_val, int * opt_val_len)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int sapp_get_platform_opt(enum sapp_platform_opt opt, void * opt_val, int * opt_val_len)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
int get_rawpkt_opt_from_streaminfo(const struct streaminfo * pstream, int type, void * out_value)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define MAX_BRIDGE_NUM 16
|
||||
void *g_bridge_async_data[MAX_BRIDGE_NUM]={0};
|
||||
stream_bridge_free_cb_t *g_bridge_async_free[MAX_BRIDGE_NUM]={0};
|
||||
stream_bridge_sync_cb_t *g_bridge_sync_cb[MAX_BRIDGE_NUM]={0};
|
||||
|
||||
int stream_bridge_register_data_free_cb(int bridge_id, stream_bridge_free_cb_t * free_cb_fun)
|
||||
{
|
||||
g_bridge_async_free[bridge_id]=free_cb_fun;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int stream_bridge_register_data_sync_cb(int bridge_id, stream_bridge_sync_cb_t * sync_cb_fun)
|
||||
{
|
||||
if(g_bridge_sync_cb[bridge_id])
|
||||
{
|
||||
g_bridge_sync_cb[bridge_id]=sync_cb_fun;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int stream_bridge_sync_data_put(const struct streaminfo *stream, int bridge_id, void *data)
|
||||
{
|
||||
if(g_bridge_sync_cb[bridge_id])
|
||||
{
|
||||
g_bridge_sync_cb[bridge_id](stream, bridge_id, data);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void *stream_bridge_async_data_get(const struct streaminfo *stream, int bridge_id)
|
||||
{
|
||||
return g_bridge_async_data[bridge_id];
|
||||
}
|
||||
|
||||
int stream_bridge_async_data_put(const struct streaminfo * stream, int bridge_id, void * data)
|
||||
{
|
||||
g_bridge_async_data[bridge_id]=data;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int stream_bridge_build(const char * bridge_name, const char * rw_mode)
|
||||
{
|
||||
static int bridge_id=0;
|
||||
assert(bridge_id<MAX_BRIDGE_NUM);
|
||||
return bridge_id++;
|
||||
}
|
||||
|
||||
int project_req_add_struct(struct streaminfo *stream, int project_req_id, const void *project_req_value)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
const void *project_req_get_struct(const struct streaminfo *stream, int project_req_id)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int project_customer_register(const char * project_req_name, const char * project_req_val_type)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
int project_producer_register(const char * project_req_name, const char * project_req_val_type, project_req_free_t * free_cb)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
extern "C" void *http_field_parser(const char* buf, unsigned int buflen, int http_dir)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
extern "C" int http_get_filed_result(void *result, long long field_flag, char **field_value)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
extern "C" void http_free_filed_result(void *result)
|
||||
{
|
||||
}
|
||||
|
||||
extern "C" int ftp_control_identify(struct streaminfo *a_tcp)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
extern "C" int ftp_data_identify(struct streaminfo *a_tcp)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
extern "C" int mail_protocol_identify_by_first_payload(struct streaminfo *a_tcp, char *payload, int payload_len, int thread_seq)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
extern "C" char stratum_identify(struct streaminfo* pstream,void** pme,int thread_seq,const void* a_packet)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
extern "C" int rdp_protocol_identify(const char *payload, unsigned int payload_len, int thread_seq)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
extern "C" int rdpudp_protocol_identify(const char *payload, unsigned int payload_len, int thread_seq)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
int quic_version_int2string(unsigned int version, char *buff, int buff_len)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
unsigned int quic_protocol_identify(struct streaminfo *a_stream, void *a_packet, char *out_sni, int *out_sni_len, char *out_ua, int *out_ua_len)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
extern "C" unsigned char sip_identify_from_to(char* buff,UINT32 buflen,char** from,UINT32* from_len,char** to,UINT32* to_len)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
extern "C" int dtls_parse_sni(const char *udp_payload, int udp_payload_len, char *servername, int servername_len)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
extern "C" bool dtls_identifyStream(struct streaminfo *a_udp)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
extern "C" struct _ssl_ja3_info_t *ssl_get_ja3_fingerprint(struct streaminfo *stream, unsigned char *payload, int payload_len, int thread_seq)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
10
test/src/gtest_common.h
Normal file
10
test/src/gtest_common.h
Normal file
@@ -0,0 +1,10 @@
|
||||
#pragma once
|
||||
|
||||
#include "tsg_send_log.h"
|
||||
|
||||
extern "C" int TSG_MASTER_INIT();
|
||||
void free_shaping_result(const struct streaminfo *stream, int bridge_id, void *data);
|
||||
|
||||
int TLD_convert_json(struct TLD_handle_t *_handle, char *buff, unsigned int buff_len);
|
||||
int set_shaping_rule_ids(struct tsg_log_instance_t *_instance, struct TLD_handle_t *_handle, struct streaminfo *a_stream);
|
||||
|
||||
223
test/src/gtest_master.cpp
Normal file
223
test/src/gtest_master.cpp
Normal file
@@ -0,0 +1,223 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "gtest_common.h"
|
||||
#include "tsg_rule.h"
|
||||
#include "tsg_entry.h"
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
TEST(TSGMaster, ShapingSetRuleIds)
|
||||
{
|
||||
const struct streaminfo a_stream={0};
|
||||
struct Maat_rule_t shaping_result[MAX_RESULT_NUM]={0};
|
||||
|
||||
for(int i=0; i<MAX_RESULT_NUM; i++)
|
||||
{
|
||||
shaping_result[i].action=TSG_ACTION_SHAPING;
|
||||
shaping_result[i].config_id=TSG_ACTION_SHAPING+i;
|
||||
}
|
||||
|
||||
tsg_notify_hited_shaping_result(&a_stream, shaping_result, MAX_RESULT_NUM, 0);
|
||||
|
||||
struct TLD_handle_t *handle=TLD_create(0);
|
||||
set_shaping_rule_ids(g_tsg_log_instance, handle, (struct streaminfo *)&a_stream);
|
||||
char shaping_rule_ids[256]={0};
|
||||
TLD_convert_json(handle, shaping_rule_ids, sizeof(shaping_rule_ids));
|
||||
EXPECT_STREQ("{\"common_shaping_rule_ids\":\"32,33,34,35,36,37,38,39\"}", shaping_rule_ids);
|
||||
|
||||
struct notify_shaping_policy *shaping_label=(struct notify_shaping_policy *)stream_bridge_async_data_get(&a_stream, g_tsg_para.bridge_id[BRIDGE_TYPE_NOTIFY_SHAPING_RESULT]);
|
||||
EXPECT_NE(nullptr, shaping_label);
|
||||
EXPECT_EQ(MAX_RESULT_NUM, shaping_label->shaping_result_num);
|
||||
for(int i=0; i<shaping_label->shaping_result_num; i++)
|
||||
{
|
||||
EXPECT_EQ(TSG_ACTION_SHAPING, shaping_label->shaping_result[i].action);
|
||||
EXPECT_EQ(TSG_ACTION_SHAPING+i, shaping_label->shaping_result[i].config_id);
|
||||
}
|
||||
|
||||
free_shaping_result(&a_stream, g_tsg_para.bridge_id[BRIDGE_TYPE_NOTIFY_SHAPING_RESULT], (void *)shaping_label);
|
||||
stream_bridge_async_data_put(&a_stream, g_tsg_para.bridge_id[BRIDGE_TYPE_NOTIFY_SHAPING_RESULT], NULL);
|
||||
EXPECT_EQ(nullptr, stream_bridge_async_data_get(&a_stream, g_tsg_para.bridge_id[BRIDGE_TYPE_NOTIFY_SHAPING_RESULT]));
|
||||
}
|
||||
|
||||
int shaping_policy_notify_cb(const struct streaminfo *stream, int bridge_id, void *data)
|
||||
{
|
||||
struct notify_shaping_policy *shaping_label=(struct notify_shaping_policy *)data;
|
||||
EXPECT_NE(nullptr, shaping_label);
|
||||
EXPECT_EQ(MAX_RESULT_NUM, shaping_label->shaping_result_num);
|
||||
for(int i=0; i<shaping_label->shaping_result_num; i++)
|
||||
{
|
||||
EXPECT_EQ(TSG_ACTION_SHAPING, shaping_label->shaping_result[i].action);
|
||||
EXPECT_EQ(TSG_ACTION_SHAPING+i, shaping_label->shaping_result[i].config_id);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
TEST(TSGMaster, ShapingPolicyNotify)
|
||||
{
|
||||
const struct streaminfo a_stream={0};
|
||||
struct Maat_rule_t shaping_result[MAX_RESULT_NUM]={0};
|
||||
|
||||
for(int i=0; i<MAX_RESULT_NUM; i++)
|
||||
{
|
||||
shaping_result[i].action=TSG_ACTION_SHAPING;
|
||||
shaping_result[i].config_id=TSG_ACTION_SHAPING+i;
|
||||
}
|
||||
|
||||
stream_bridge_register_data_sync_cb(g_tsg_para.bridge_id[BRIDGE_TYPE_NOTIFY_SHAPING_RESULT], shaping_policy_notify_cb);
|
||||
|
||||
tsg_notify_hited_shaping_result(&a_stream, shaping_result, MAX_RESULT_NUM, 0);
|
||||
int shaping_result_num=tsg_pull_shaping_result((struct streaminfo *)&a_stream, shaping_result, MAX_RESULT_NUM);
|
||||
EXPECT_EQ(MAX_RESULT_NUM, shaping_result_num);
|
||||
for(int i=0; i<shaping_result_num; i++)
|
||||
{
|
||||
EXPECT_EQ(TSG_ACTION_SHAPING, shaping_result[i].action);
|
||||
EXPECT_EQ(TSG_ACTION_SHAPING+i, shaping_result[i].config_id);
|
||||
}
|
||||
|
||||
struct notify_shaping_policy *shaping_label=(struct notify_shaping_policy *)stream_bridge_async_data_get(&a_stream, g_tsg_para.bridge_id[BRIDGE_TYPE_NOTIFY_SHAPING_RESULT]);
|
||||
EXPECT_NE(nullptr, shaping_label);
|
||||
EXPECT_EQ(MAX_RESULT_NUM, shaping_label->shaping_result_num);
|
||||
for(int i=0; i<shaping_label->shaping_result_num; i++)
|
||||
{
|
||||
EXPECT_EQ(TSG_ACTION_SHAPING, shaping_label->shaping_result[i].action);
|
||||
EXPECT_EQ(TSG_ACTION_SHAPING+i, shaping_label->shaping_result[i].config_id);
|
||||
}
|
||||
|
||||
free_shaping_result(&a_stream, g_tsg_para.bridge_id[BRIDGE_TYPE_NOTIFY_SHAPING_RESULT], (void *)shaping_label);
|
||||
stream_bridge_async_data_put(&a_stream, g_tsg_para.bridge_id[BRIDGE_TYPE_NOTIFY_SHAPING_RESULT], NULL);
|
||||
EXPECT_EQ(nullptr, stream_bridge_async_data_get(&a_stream, g_tsg_para.bridge_id[BRIDGE_TYPE_NOTIFY_SHAPING_RESULT]));
|
||||
}
|
||||
|
||||
int shaping_policy_notify_null_cb(const struct streaminfo *stream, int bridge_id, void *data)
|
||||
{
|
||||
EXPECT_EQ(nullptr, data);
|
||||
return 0;
|
||||
}
|
||||
|
||||
TEST(TSGMaster, ShapingPolicyNotifyNULL)
|
||||
{
|
||||
const struct streaminfo a_stream={0};
|
||||
struct Maat_rule_t shaping_result[MAX_RESULT_NUM]={0};
|
||||
|
||||
stream_bridge_register_data_sync_cb(g_tsg_para.bridge_id[BRIDGE_TYPE_NOTIFY_SHAPING_RESULT], shaping_policy_notify_null_cb);
|
||||
|
||||
tsg_notify_hited_shaping_result(&a_stream, shaping_result, 0, 0);
|
||||
struct notify_shaping_policy *shaping_label=(struct notify_shaping_policy *)stream_bridge_async_data_get(&a_stream, g_tsg_para.bridge_id[BRIDGE_TYPE_NOTIFY_SHAPING_RESULT]);
|
||||
EXPECT_EQ(nullptr, shaping_label);
|
||||
}
|
||||
|
||||
int shaping_duplicate_policy_notify_cb(const struct streaminfo *stream, int bridge_id, void *data)
|
||||
{
|
||||
struct notify_shaping_policy *shaping_label=(struct notify_shaping_policy *)data;
|
||||
EXPECT_NE(nullptr, shaping_label);
|
||||
EXPECT_EQ(MAX_RESULT_NUM/2, shaping_label->shaping_result_num);
|
||||
for(int i=0; i<shaping_label->shaping_result_num; i++)
|
||||
{
|
||||
EXPECT_EQ(TSG_ACTION_SHAPING, shaping_label->shaping_result[i].action);
|
||||
EXPECT_EQ(TSG_ACTION_SHAPING+i, shaping_label->shaping_result[i].config_id);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
TEST(TSGMaster, ShapingDuplicatePolicyNotify)
|
||||
{
|
||||
const struct streaminfo a_stream={0};
|
||||
struct Maat_rule_t shaping_result[MAX_RESULT_NUM]={0};
|
||||
|
||||
for(int i=0; i<MAX_RESULT_NUM; i++)
|
||||
{
|
||||
shaping_result[i].action=TSG_ACTION_SHAPING;
|
||||
shaping_result[i].config_id=TSG_ACTION_SHAPING+(i%4);
|
||||
}
|
||||
|
||||
stream_bridge_register_data_sync_cb(g_tsg_para.bridge_id[BRIDGE_TYPE_NOTIFY_SHAPING_RESULT], shaping_duplicate_policy_notify_cb);
|
||||
|
||||
tsg_notify_hited_shaping_result(&a_stream, shaping_result, MAX_RESULT_NUM, 0);
|
||||
int shaping_result_num=tsg_pull_shaping_result((struct streaminfo *)&a_stream, shaping_result, MAX_RESULT_NUM);
|
||||
EXPECT_EQ(MAX_RESULT_NUM/2, shaping_result_num);
|
||||
for(int i=0; i<shaping_result_num; i++)
|
||||
{
|
||||
EXPECT_EQ(TSG_ACTION_SHAPING, shaping_result[i].action);
|
||||
EXPECT_EQ(TSG_ACTION_SHAPING+i, shaping_result[i].config_id);
|
||||
}
|
||||
|
||||
struct notify_shaping_policy *shaping_label=(struct notify_shaping_policy *)stream_bridge_async_data_get(&a_stream, g_tsg_para.bridge_id[BRIDGE_TYPE_NOTIFY_SHAPING_RESULT]);
|
||||
EXPECT_NE(nullptr, shaping_label);
|
||||
EXPECT_EQ(MAX_RESULT_NUM/2, shaping_label->shaping_result_num);
|
||||
for(int i=0; i<shaping_label->shaping_result_num; i++)
|
||||
{
|
||||
EXPECT_EQ(TSG_ACTION_SHAPING, shaping_label->shaping_result[i].action);
|
||||
EXPECT_EQ(TSG_ACTION_SHAPING+i, shaping_label->shaping_result[i].config_id);
|
||||
}
|
||||
|
||||
free_shaping_result(&a_stream, g_tsg_para.bridge_id[BRIDGE_TYPE_NOTIFY_SHAPING_RESULT], (void *)shaping_label);
|
||||
stream_bridge_async_data_put(&a_stream, g_tsg_para.bridge_id[BRIDGE_TYPE_NOTIFY_SHAPING_RESULT], NULL);
|
||||
EXPECT_EQ(nullptr, stream_bridge_async_data_get(&a_stream, g_tsg_para.bridge_id[BRIDGE_TYPE_NOTIFY_SHAPING_RESULT]));
|
||||
}
|
||||
|
||||
TEST(TSGMaster, ShapingDuplicatePolicyMultipleNotify)
|
||||
{
|
||||
const struct streaminfo a_stream={0};
|
||||
struct Maat_rule_t shaping_result[MAX_RESULT_NUM]={0};
|
||||
|
||||
for(int i=0; i<MAX_RESULT_NUM/2; i++)
|
||||
{
|
||||
shaping_result[i].action=TSG_ACTION_SHAPING;
|
||||
shaping_result[i].config_id=TSG_ACTION_SHAPING+i;
|
||||
}
|
||||
|
||||
stream_bridge_register_data_sync_cb(g_tsg_para.bridge_id[BRIDGE_TYPE_NOTIFY_SHAPING_RESULT], shaping_duplicate_policy_notify_cb);
|
||||
|
||||
// First notify
|
||||
tsg_notify_hited_shaping_result(&a_stream, shaping_result, MAX_RESULT_NUM/2, 0);
|
||||
int shaping_result_num=tsg_pull_shaping_result((struct streaminfo *)&a_stream, shaping_result, MAX_RESULT_NUM);
|
||||
EXPECT_EQ(MAX_RESULT_NUM/2, shaping_result_num);
|
||||
for(int i=0; i<shaping_result_num; i++)
|
||||
{
|
||||
EXPECT_EQ(TSG_ACTION_SHAPING, shaping_result[i].action);
|
||||
EXPECT_EQ(TSG_ACTION_SHAPING+i, shaping_result[i].config_id);
|
||||
}
|
||||
|
||||
struct notify_shaping_policy *shaping_label=(struct notify_shaping_policy *)stream_bridge_async_data_get(&a_stream, g_tsg_para.bridge_id[BRIDGE_TYPE_NOTIFY_SHAPING_RESULT]);
|
||||
EXPECT_NE(nullptr, shaping_label);
|
||||
EXPECT_EQ(MAX_RESULT_NUM/2, shaping_label->shaping_result_num);
|
||||
for(int i=0; i<shaping_label->shaping_result_num; i++)
|
||||
{
|
||||
EXPECT_EQ(TSG_ACTION_SHAPING, shaping_label->shaping_result[i].action);
|
||||
EXPECT_EQ(TSG_ACTION_SHAPING+i, shaping_label->shaping_result[i].config_id);
|
||||
}
|
||||
|
||||
// Second notify
|
||||
tsg_notify_hited_shaping_result(&a_stream, shaping_result, MAX_RESULT_NUM/2, 0);
|
||||
shaping_result_num=tsg_pull_shaping_result((struct streaminfo *)&a_stream, shaping_result, MAX_RESULT_NUM);
|
||||
EXPECT_EQ(MAX_RESULT_NUM/2, shaping_result_num);
|
||||
for(int i=0; i<shaping_result_num; i++)
|
||||
{
|
||||
EXPECT_EQ(TSG_ACTION_SHAPING, shaping_result[i].action);
|
||||
EXPECT_EQ(TSG_ACTION_SHAPING+i, shaping_result[i].config_id);
|
||||
}
|
||||
|
||||
shaping_label=(struct notify_shaping_policy *)stream_bridge_async_data_get(&a_stream, g_tsg_para.bridge_id[BRIDGE_TYPE_NOTIFY_SHAPING_RESULT]);
|
||||
EXPECT_NE(nullptr, shaping_label);
|
||||
EXPECT_EQ(MAX_RESULT_NUM/2, shaping_label->shaping_result_num);
|
||||
for(int i=0; i<shaping_label->shaping_result_num; i++)
|
||||
{
|
||||
EXPECT_EQ(TSG_ACTION_SHAPING, shaping_label->shaping_result[i].action);
|
||||
EXPECT_EQ(TSG_ACTION_SHAPING+i, shaping_label->shaping_result[i].config_id);
|
||||
}
|
||||
|
||||
free_shaping_result(&a_stream, g_tsg_para.bridge_id[BRIDGE_TYPE_NOTIFY_SHAPING_RESULT], (void *)shaping_label);
|
||||
stream_bridge_async_data_put(&a_stream, g_tsg_para.bridge_id[BRIDGE_TYPE_NOTIFY_SHAPING_RESULT], NULL);
|
||||
EXPECT_EQ(nullptr, stream_bridge_async_data_get(&a_stream, g_tsg_para.bridge_id[BRIDGE_TYPE_NOTIFY_SHAPING_RESULT]));
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
TSG_MASTER_INIT();
|
||||
testing::InitGoogleTest(&argc, argv);
|
||||
return RUN_ALL_TESTS();
|
||||
}
|
||||
|
||||
69
test/src/gtest_rule.cpp
Normal file
69
test/src/gtest_rule.cpp
Normal file
@@ -0,0 +1,69 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "tsg_entry.h"
|
||||
#include "gtest_common.h"
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
g_tsg_para_t g_tsg_para;
|
||||
id2field_t g_tsg_proto_name2id[PROTO_MAX]={{PROTO_UNKONWN, 0, "unknown"},
|
||||
{PROTO_IPv4, 0, "IPV4"},
|
||||
{PROTO_IPv6, 0, "IPV6"},
|
||||
{PROTO_TCP, 0, "TCP"},
|
||||
{PROTO_UDP, 0, "UDP"},
|
||||
{PROTO_HTTP, 0, "HTTP"},
|
||||
{PROTO_MAIL, 0, "MAIL"},
|
||||
{PROTO_DNS, 0, "DNS"},
|
||||
{PROTO_FTP, 0, "FTP"},
|
||||
{PROTO_SSL, 0, "SSL"},
|
||||
{PROTO_SIP, 0, "SIP"},
|
||||
{PROTO_BGP, 0, "BGP"},
|
||||
{PROTO_STREAMING_MEDIA, 0, "STREAMING_MEDIA"},
|
||||
{PROTO_QUIC, 0, "QUIC"},
|
||||
{PROTO_SSH, 0, "SSH"},
|
||||
{PROTO_SMTP, 0, "SMTP"},
|
||||
{PROTO_IMAP, 0, "IMAP"},
|
||||
{PROTO_POP3, 0, "POP3"},
|
||||
{PROTO_RTP, 0, "RTP"},
|
||||
{PROTO_APP, 0, "BASE"},
|
||||
{PROTO_L2TP, 0, "L2TP"},
|
||||
{PROTO_PPTP, 0, "PPTP"},
|
||||
{PROTO_STRATUM, 0, "Stratum"},
|
||||
{PROTO_RDP, 0, "RDP"},
|
||||
{PROTO_DTLS, 0, "DTLS"}
|
||||
};
|
||||
|
||||
unsigned int tsg_l7_protocol_name2id(const char *l7_protocol_name)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
void free_policy_label(int thread_seq, void *project_req_value)
|
||||
{
|
||||
}
|
||||
|
||||
void set_session_attribute_label(const struct streaminfo *a_stream, enum TSG_ATTRIBUTE_TYPE type, void *value, int value_len, int thread_seq)
|
||||
{
|
||||
}
|
||||
|
||||
int tsg_get_umts_user_info(const struct streaminfo *a_stream, struct umts_user_info **user_info)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
TEST(MasterTest, SetVlan)
|
||||
{
|
||||
//int ret=set_vlan(NULL, NULL, NULL, 0, NULL, LOG_COMMON_TUNNELS_VLAN_SRC_ID);
|
||||
//EXPECT_EQ(1, ret);
|
||||
}
|
||||
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
testing::InitGoogleTest(&argc, argv);
|
||||
return RUN_ALL_TESTS();
|
||||
}
|
||||
|
||||
41
test/src/gtest_sendlog.cpp
Normal file
41
test/src/gtest_sendlog.cpp
Normal file
@@ -0,0 +1,41 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "gtest_common.h"
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
int tsg_app_id2name(int app_id, char *app_name, int app_name_len, int is_joint_parent)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
int tsg_get_location_type(void)
|
||||
{
|
||||
return 19;
|
||||
}
|
||||
|
||||
char *tsg_l7_protocol_id2name(unsigned int l7_protocol_id)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
char get_direction_from_tcpall(const struct streaminfo *a_stream)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
TEST(MasterTest, SetVlan)
|
||||
{
|
||||
//int ret=set_vlan(NULL, NULL, NULL, 0, NULL, LOG_COMMON_TUNNELS_VLAN_SRC_ID);
|
||||
//EXPECT_EQ(1, ret);
|
||||
}
|
||||
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
testing::InitGoogleTest(&argc, argv);
|
||||
return RUN_ALL_TESTS();
|
||||
}
|
||||
|
||||
@@ -1,207 +0,0 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <assert.h>
|
||||
#include <sys/time.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "app_label.h"
|
||||
|
||||
#include <MESA/stream.h>
|
||||
#include <MESA/MESA_prof_load.h>
|
||||
#include <MESA/MESA_handle_logger.h>
|
||||
#include <MESA/MESA_jump_layer.h>
|
||||
|
||||
enum GTEST_BRIDGE
|
||||
{
|
||||
GTEST_BRIDGE_TYPE_APP_IDENTIFY_RESULT=0,
|
||||
GTEST_BRIDGE_TYPE_MAX
|
||||
};
|
||||
|
||||
struct gtest_para
|
||||
{
|
||||
int bridge_id[GTEST_BRIDGE_TYPE_MAX];
|
||||
char bridge_name[GTEST_BRIDGE_TYPE_MAX][64];
|
||||
};
|
||||
|
||||
|
||||
struct gtest_para g_gtest_para;
|
||||
|
||||
extern "C" unsigned char GTEST_APP_FULL_PATH_1_ENTRY(const struct streaminfo *a_stream, void **pme, int thread_seq, const void *a_packet)
|
||||
{
|
||||
struct app_identify_result lpi;
|
||||
memset(&lpi, 0, sizeof(lpi));
|
||||
|
||||
lpi.app_id_num=2;
|
||||
lpi.origin=ORIGIN_BASIC_PROTOCOL;
|
||||
lpi.app_id[0]=336; //openvpn
|
||||
lpi.app_id[1]=199; //ssl
|
||||
stream_bridge_sync_data_put(a_stream, g_gtest_para.bridge_id[GTEST_BRIDGE_TYPE_APP_IDENTIFY_RESULT], (void *)&lpi);
|
||||
|
||||
struct app_identify_result user_define;
|
||||
memset(&user_define, 0, sizeof(user_define));
|
||||
|
||||
user_define.app_id_num=1;
|
||||
user_define.origin=ORIGIN_USER_DEFINE;
|
||||
user_define.app_id[0]=3145; //qq_web
|
||||
stream_bridge_sync_data_put(a_stream, g_gtest_para.bridge_id[GTEST_BRIDGE_TYPE_APP_IDENTIFY_RESULT], (void *)&user_define);
|
||||
|
||||
struct app_identify_result qm;
|
||||
memset(&qm, 0, sizeof(qm));
|
||||
|
||||
qm.app_id_num=4;
|
||||
qm.origin=ORIGIN_QM_ENGINE;
|
||||
qm.app_id[0]=336; //openvpn
|
||||
qm.app_id[1]=199; //ssl
|
||||
qm.app_id[2]=1241; //qq_web
|
||||
qm.app_id[3]=3145; //qq_r2
|
||||
stream_bridge_sync_data_put(a_stream, g_gtest_para.bridge_id[GTEST_BRIDGE_TYPE_APP_IDENTIFY_RESULT], (void *)&qm);
|
||||
|
||||
return APP_STATE_DROPME;
|
||||
}
|
||||
|
||||
extern "C" unsigned char GTEST_APP_FULL_PATH_2_ENTRY(const struct streaminfo *a_stream, void **pme, int thread_seq, const void *a_packet)
|
||||
{
|
||||
struct app_identify_result lpi;
|
||||
memset(&lpi, 0, sizeof(lpi));
|
||||
|
||||
lpi.app_id_num=2;
|
||||
lpi.origin=ORIGIN_BASIC_PROTOCOL;
|
||||
lpi.app_id[0]=336; //openvpn
|
||||
lpi.app_id[1]=199; //ssl
|
||||
stream_bridge_sync_data_put(a_stream, g_gtest_para.bridge_id[GTEST_BRIDGE_TYPE_APP_IDENTIFY_RESULT], (void *)&lpi);
|
||||
|
||||
struct app_identify_result built_in;
|
||||
memset(&built_in, 0, sizeof(built_in));
|
||||
|
||||
built_in.app_id_num=1;
|
||||
built_in.origin=ORIGIN_BUILT_IN;
|
||||
built_in.app_id[0]=3145; //qq_web
|
||||
stream_bridge_sync_data_put(a_stream, g_gtest_para.bridge_id[GTEST_BRIDGE_TYPE_APP_IDENTIFY_RESULT], (void *)&built_in);
|
||||
|
||||
struct app_identify_result qm;
|
||||
memset(&qm, 0, sizeof(qm));
|
||||
|
||||
qm.app_id_num=3;
|
||||
qm.origin=ORIGIN_QM_ENGINE;
|
||||
qm.app_id[0]=336; //openvpn
|
||||
qm.app_id[1]=1241; //qq_web
|
||||
qm.app_id[2]=3145; //qq_r2
|
||||
stream_bridge_sync_data_put(a_stream, g_gtest_para.bridge_id[GTEST_BRIDGE_TYPE_APP_IDENTIFY_RESULT], (void *)&qm);
|
||||
|
||||
return APP_STATE_DROPME;
|
||||
}
|
||||
|
||||
extern "C" unsigned char GTEST_APP_FULL_PATH_3_ENTRY(const struct streaminfo *a_stream, void **pme, int thread_seq, const void *a_packet)
|
||||
{
|
||||
struct app_identify_result lpi;
|
||||
memset(&lpi, 0, sizeof(lpi));
|
||||
|
||||
lpi.app_id_num=2;
|
||||
lpi.origin=ORIGIN_BASIC_PROTOCOL;
|
||||
lpi.app_id[0]=336; //openvpn
|
||||
lpi.app_id[1]=199; //ssl
|
||||
stream_bridge_sync_data_put(a_stream, g_gtest_para.bridge_id[GTEST_BRIDGE_TYPE_APP_IDENTIFY_RESULT], (void *)&lpi);
|
||||
|
||||
struct app_identify_result built_in;
|
||||
memset(&built_in, 0, sizeof(built_in));
|
||||
|
||||
built_in.app_id_num=1;
|
||||
built_in.origin=ORIGIN_BUILT_IN;
|
||||
built_in.app_id[0]=3145; //qq_web
|
||||
stream_bridge_sync_data_put(a_stream, g_gtest_para.bridge_id[GTEST_BRIDGE_TYPE_APP_IDENTIFY_RESULT], (void *)&built_in);
|
||||
|
||||
return APP_STATE_DROPME;
|
||||
}
|
||||
|
||||
extern "C" unsigned char GTEST_APP_FULL_PATH_4_ENTRY(const struct streaminfo *a_stream, void **pme, int thread_seq, const void *a_packet)
|
||||
{
|
||||
struct app_identify_result lpi;
|
||||
memset(&lpi, 0, sizeof(lpi));
|
||||
|
||||
lpi.app_id_num=1;
|
||||
lpi.origin=ORIGIN_BASIC_PROTOCOL;
|
||||
lpi.app_id[0]=199; //ssl
|
||||
stream_bridge_sync_data_put(a_stream, g_gtest_para.bridge_id[GTEST_BRIDGE_TYPE_APP_IDENTIFY_RESULT], (void *)&lpi);
|
||||
|
||||
struct app_identify_result user_define;
|
||||
memset(&user_define, 0, sizeof(user_define));
|
||||
|
||||
struct app_identify_result built_in;
|
||||
memset(&built_in, 0, sizeof(built_in));
|
||||
|
||||
built_in.app_id_num=2;
|
||||
built_in.origin=ORIGIN_BUILT_IN;
|
||||
built_in.app_id[0]=3145; //qq_web
|
||||
built_in.app_id[1]=156; //qq
|
||||
stream_bridge_sync_data_put(a_stream, g_gtest_para.bridge_id[GTEST_BRIDGE_TYPE_APP_IDENTIFY_RESULT], (void *)&built_in);
|
||||
|
||||
|
||||
struct app_identify_result qm;
|
||||
memset(&qm, 0, sizeof(qm));
|
||||
|
||||
qm.app_id_num=4;
|
||||
qm.origin=ORIGIN_QM_ENGINE;
|
||||
qm.app_id[0]=336; //openvpn
|
||||
qm.app_id[1]=199; //ssl
|
||||
qm.app_id[2]=1241; //qq_web
|
||||
qm.app_id[3]=3145; //qq_r2
|
||||
stream_bridge_sync_data_put(a_stream, g_gtest_para.bridge_id[GTEST_BRIDGE_TYPE_APP_IDENTIFY_RESULT], (void *)&qm);
|
||||
|
||||
return APP_STATE_DROPME;
|
||||
}
|
||||
|
||||
extern "C" unsigned char GTEST_APP_FULL_PATH_5_ENTRY(const struct streaminfo *a_stream, void **pme, int thread_seq, const void *a_packet)
|
||||
{
|
||||
struct app_identify_result built_in;
|
||||
memset(&built_in, 0, sizeof(built_in));
|
||||
|
||||
built_in.app_id_num=2;
|
||||
built_in.origin=ORIGIN_BUILT_IN;
|
||||
built_in.app_id[0]=3145; //qq_web
|
||||
built_in.app_id[1]=156; //qq
|
||||
stream_bridge_sync_data_put(a_stream, g_gtest_para.bridge_id[GTEST_BRIDGE_TYPE_APP_IDENTIFY_RESULT], (void *)&built_in);
|
||||
|
||||
struct app_identify_result qm;
|
||||
memset(&qm, 0, sizeof(qm));
|
||||
|
||||
qm.app_id_num=4;
|
||||
qm.origin=ORIGIN_QM_ENGINE;
|
||||
qm.app_id[0]=336; //openvpn
|
||||
qm.app_id[1]=199; //ssl
|
||||
qm.app_id[2]=1241; //qq_web
|
||||
qm.app_id[3]=3145; //qq_r2
|
||||
stream_bridge_sync_data_put(a_stream, g_gtest_para.bridge_id[GTEST_BRIDGE_TYPE_APP_IDENTIFY_RESULT], (void *)&qm);
|
||||
|
||||
return APP_STATE_DROPME;
|
||||
}
|
||||
|
||||
extern "C" unsigned char GTEST_UNKNOWN_APP_ENTRY(const struct streaminfo *a_stream, void **pme, int thread_seq, const void *a_packet)
|
||||
{
|
||||
return APP_STATE_DROPME;
|
||||
}
|
||||
|
||||
extern "C" int GTEST_INIT()
|
||||
{
|
||||
memset(&g_gtest_para, 0, sizeof(g_gtest_para));
|
||||
|
||||
MESA_load_profile_string_def("tsgconf/main.conf", "SYSTEM", "APP_IDENTIFY_RESULT_BRIDGE", g_gtest_para.bridge_name[GTEST_BRIDGE_TYPE_APP_IDENTIFY_RESULT], 64, "APP_IDENTIFY_RESULT_BRIDGE");
|
||||
|
||||
for(int i=0; i<GTEST_BRIDGE_TYPE_MAX; i++)
|
||||
{
|
||||
g_gtest_para.bridge_id[i]=stream_bridge_build(g_gtest_para.bridge_name[i], "w");
|
||||
if(g_gtest_para.bridge_id[i]<0)
|
||||
{
|
||||
printf("stream_bridge_build is error, bridge_name: %s", g_gtest_para.bridge_name[i]);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
extern "C" int GTEST_UNLOAD()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1,50 +0,0 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include "../inc/app_label.h"
|
||||
#include "../inc/tsg_rule.h"
|
||||
#include "../inc/tsg_send_log.h"
|
||||
#include "../inc/tsg_statistic.h"
|
||||
//#include "../src/tsg_entry.h"
|
||||
#include "../src/tsg_send_log_internal.h"
|
||||
#include "../inc/tsg_ssl_utils.h"
|
||||
#include "../src/tsg_ssh_utils.h"
|
||||
#include "../src/tsg_protocol_common.h"
|
||||
|
||||
#include "tsg_master_gtest_function.h"
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
/*
|
||||
L7(openvpn), appSketch(psiphon), Thrid(openvpn.ssl.wechat) = openvpn.ssl.psiphon
|
||||
L7(openvpn), appSketch(psiphon), Thrid(openvpn.qq_web.wechat) = openvpn.psiphon
|
||||
L7(openvpn), appSketch(psiphon), Thrid(openvpn.wechat) = openvpn.psiphon
|
||||
L7(openvpn.ssl), appSketch(psiphon), Thrid(openvpn.wechat) = openvpn.ssl.psiphon
|
||||
L7(openvpn.ssl), appSketch(psiphon), Thrid(openvpn) = openvpn.ssl.psiphon
|
||||
L7(openvpn.ssl), appSketch(psiphon), Thrid(openvpn.ssl.wechat) = openvpn.ssl.psiphon
|
||||
L7(null), appSketch(psiphon), Thrid(openvpn.ssl.wechat) = openvpn.ssl.psiphon
|
||||
L7(null), appSketch(psiphon), Thrid(wechat) = psiphon
|
||||
L7(null), appSketch(null), Thrid(openvpn.ssl.wechat) = openvpn.ssl.wechat
|
||||
L7(null), appSketch(null), Thrid(null) = unknown
|
||||
*/
|
||||
|
||||
TEST(MasterTest, AppFullPath)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
TEST(MasterTest, SetVlan)
|
||||
{
|
||||
//int ret=set_vlan(NULL, NULL, NULL, 0, NULL, LOG_COMMON_TUNNELS_VLAN_SRC_ID);
|
||||
//EXPECT_EQ(1, ret);
|
||||
}
|
||||
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
libsapp_setup_env(argc,argv);
|
||||
testing::InitGoogleTest(&argc, argv);
|
||||
return RUN_ALL_TESTS();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user