feature(packet manager): support claim packt and add test case
This commit is contained in:
@@ -67,6 +67,19 @@ unsigned char data[] = {
|
||||
0x81, 0x80, 0x5c, 0x76, 0x00, 0x00, 0x00, 0x00, 0x80, 0x02, 0x20, 0x00, 0xf7, 0x57, 0x00, 0x00, 0x02, 0x04, 0x04, 0xc4, 0x01, 0x03, 0x03, 0x08, 0x01, 0x01,
|
||||
0x04, 0x02};
|
||||
|
||||
static void check_stat(struct packet_manager_runtime_stat *stat, uint64_t input_pkts, uint64_t output_pkts, uint64_t claim_pkts, uint64_t schedule_pkts)
|
||||
{
|
||||
EXPECT_TRUE(stat->input_pkts == input_pkts);
|
||||
EXPECT_TRUE(stat->output_pkts == output_pkts);
|
||||
EXPECT_TRUE(stat->claim_pkts == claim_pkts);
|
||||
EXPECT_TRUE(stat->schedule_pkts == schedule_pkts);
|
||||
|
||||
for (int i = 0; i < PACKET_STAGE_MAX; i++)
|
||||
{
|
||||
EXPECT_TRUE(stat->queue_len[i] == 0);
|
||||
}
|
||||
}
|
||||
|
||||
#if 1
|
||||
TEST(PACKET_MANAGER, NEW_FREE)
|
||||
{
|
||||
@@ -86,20 +99,19 @@ TEST(PACKET_MANAGER, NEW_FREE)
|
||||
}
|
||||
#endif
|
||||
|
||||
#if 1
|
||||
static void on_packet_stage(enum packet_stage stage, struct packet *pkt, void *args)
|
||||
{
|
||||
printf("stage: %s\n", packet_stage_to_str(stage));
|
||||
printf("on_packet_stage: %s\n", packet_stage_to_str(stage));
|
||||
|
||||
static int count = 0;
|
||||
EXPECT_TRUE(count == stage);
|
||||
count++;
|
||||
|
||||
EXPECT_TRUE(packet_is_ctrl(pkt));
|
||||
EXPECT_TRUE(args == NULL);
|
||||
count++;
|
||||
}
|
||||
|
||||
#if 1
|
||||
TEST(PACKET_MANAGER, NORNMAL)
|
||||
TEST(PACKET_MANAGER, SUBSCRIBER)
|
||||
{
|
||||
// global init
|
||||
struct mq_schema *mq_schema = mq_schema_new();
|
||||
@@ -129,9 +141,12 @@ TEST(PACKET_MANAGER, NORNMAL)
|
||||
packet_parse(&pkt, (const char *)data, sizeof(data));
|
||||
packet_set_ctrl(&pkt, true);
|
||||
|
||||
check_stat(packet_manager_runtime_get_stat(runtime), 0, 0, 0, 0);
|
||||
packet_manager_runtime_input(runtime, &pkt);
|
||||
packet_manager_runtime_dispatch(runtime);
|
||||
EXPECT_TRUE(packet_manager_runtime_output(runtime) == &pkt);
|
||||
EXPECT_TRUE(packet_manager_runtime_output(runtime) == NULL);
|
||||
check_stat(packet_manager_runtime_get_stat(runtime), 1, 1, 0, 0);
|
||||
|
||||
// per-thread free
|
||||
|
||||
@@ -145,18 +160,182 @@ TEST(PACKET_MANAGER, NORNMAL)
|
||||
#endif
|
||||
|
||||
#if 1
|
||||
TEST(PACKET_MANAGER, TAKE)
|
||||
static void packet_claimed(struct packet *pkt, void *args)
|
||||
{
|
||||
// TODO
|
||||
// packet_manager_runtime_take_packet(struct packet_manager_runtime *pkt_mgr_rt, struct packet *pkt);
|
||||
char *str = (char *)args;
|
||||
EXPECT_STREQ(str, "hello");
|
||||
printf("packet_claimed: with ctx %s\n", str);
|
||||
EXPECT_TRUE(packet_is_ctrl(pkt));
|
||||
EXPECT_TRUE(packet_is_claim(pkt));
|
||||
free(str);
|
||||
}
|
||||
|
||||
static void module_A_on_packet_stage(enum packet_stage stage, struct packet *pkt, void *args)
|
||||
{
|
||||
struct packet_manager *pkt_mgr = (struct packet_manager *)args;
|
||||
struct packet_manager_runtime *pkt_mgr_rt = packet_manager_get_runtime(pkt_mgr, 0);
|
||||
EXPECT_TRUE(pkt_mgr_rt);
|
||||
|
||||
printf("module_A_on_packet_stage: %s claim packet success\n", packet_stage_to_str(stage));
|
||||
|
||||
static int count = 0;
|
||||
EXPECT_TRUE(count == 0);
|
||||
EXPECT_TRUE(stage == PACKET_STAGE_PREROUTING);
|
||||
EXPECT_TRUE(packet_is_ctrl(pkt));
|
||||
EXPECT_TRUE(!packet_is_claim(pkt));
|
||||
packet_manager_runtime_claim_packet(pkt_mgr_rt, pkt, packet_claimed, strdup("hello"));
|
||||
count++;
|
||||
}
|
||||
|
||||
static void module_B_on_packet_stage(enum packet_stage stage, struct packet *pkt, void *args)
|
||||
{
|
||||
struct packet_manager *pkt_mgr = (struct packet_manager *)args;
|
||||
struct packet_manager_runtime *pkt_mgr_rt = packet_manager_get_runtime(pkt_mgr, 0);
|
||||
EXPECT_TRUE(pkt_mgr_rt);
|
||||
|
||||
printf("module_B_on_packet_stage: %s claim packet failed\n", packet_stage_to_str(stage));
|
||||
|
||||
static int count = 0;
|
||||
EXPECT_TRUE(count == 0);
|
||||
EXPECT_TRUE(stage == PACKET_STAGE_PREROUTING);
|
||||
EXPECT_TRUE(packet_is_ctrl(pkt));
|
||||
EXPECT_TRUE(packet_is_claim(pkt));
|
||||
count++;
|
||||
}
|
||||
|
||||
TEST(PACKET_MANAGER, CLAIM_PACKET)
|
||||
{
|
||||
// global init
|
||||
struct mq_schema *mq_schema = mq_schema_new();
|
||||
EXPECT_TRUE(mq_schema);
|
||||
struct mq_runtime *mq_rt = mq_runtime_new(mq_schema);
|
||||
EXPECT_TRUE(mq_rt);
|
||||
|
||||
// module init
|
||||
struct packet_manager *pkt_mgr = packet_manager_new(mq_schema, "./conf/stellar.toml");
|
||||
EXPECT_TRUE(pkt_mgr);
|
||||
struct packet_manager_schema *schema = packet_manager_get_schema(pkt_mgr);
|
||||
EXPECT_TRUE(schema);
|
||||
EXPECT_TRUE(packet_manager_schema_add_subscriber(schema, PACKET_STAGE_PREROUTING, module_A_on_packet_stage, pkt_mgr) == 0);
|
||||
EXPECT_TRUE(packet_manager_schema_add_subscriber(schema, PACKET_STAGE_INPUT, module_A_on_packet_stage, pkt_mgr) == 0);
|
||||
EXPECT_TRUE(packet_manager_schema_add_subscriber(schema, PACKET_STAGE_FORWARD, module_A_on_packet_stage, pkt_mgr) == 0);
|
||||
EXPECT_TRUE(packet_manager_schema_add_subscriber(schema, PACKET_STAGE_OUTPUT, module_A_on_packet_stage, pkt_mgr) == 0);
|
||||
EXPECT_TRUE(packet_manager_schema_add_subscriber(schema, PACKET_STAGE_POSTROUTING, module_A_on_packet_stage, pkt_mgr) == 0);
|
||||
|
||||
EXPECT_TRUE(packet_manager_schema_add_subscriber(schema, PACKET_STAGE_PREROUTING, module_B_on_packet_stage, pkt_mgr) == 0);
|
||||
EXPECT_TRUE(packet_manager_schema_add_subscriber(schema, PACKET_STAGE_INPUT, module_B_on_packet_stage, pkt_mgr) == 0);
|
||||
EXPECT_TRUE(packet_manager_schema_add_subscriber(schema, PACKET_STAGE_FORWARD, module_B_on_packet_stage, pkt_mgr) == 0);
|
||||
EXPECT_TRUE(packet_manager_schema_add_subscriber(schema, PACKET_STAGE_OUTPUT, module_B_on_packet_stage, pkt_mgr) == 0);
|
||||
EXPECT_TRUE(packet_manager_schema_add_subscriber(schema, PACKET_STAGE_POSTROUTING, module_B_on_packet_stage, pkt_mgr) == 0);
|
||||
|
||||
// per-thread init
|
||||
struct packet_manager_runtime *runtime = packet_manager_get_runtime(pkt_mgr, 0);
|
||||
EXPECT_TRUE(runtime);
|
||||
packet_manager_runtime_init(runtime, mq_rt);
|
||||
|
||||
// per-thread run
|
||||
struct packet pkt;
|
||||
memset(&pkt, 0, sizeof(pkt));
|
||||
packet_parse(&pkt, (const char *)data, sizeof(data));
|
||||
packet_set_ctrl(&pkt, true);
|
||||
|
||||
check_stat(packet_manager_runtime_get_stat(runtime), 0, 0, 0, 0);
|
||||
packet_manager_runtime_input(runtime, &pkt);
|
||||
packet_manager_runtime_dispatch(runtime);
|
||||
EXPECT_TRUE(packet_manager_runtime_output(runtime) == NULL);
|
||||
check_stat(packet_manager_runtime_get_stat(runtime), 1, 0, 1, 0);
|
||||
|
||||
// per-thread free
|
||||
|
||||
// module free
|
||||
packet_manager_free(pkt_mgr);
|
||||
|
||||
// global free
|
||||
mq_runtime_free(mq_rt);
|
||||
mq_schema_free(mq_schema);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if 1
|
||||
TEST(PACKET_MANAGER, SCHEDULE)
|
||||
static void module_C_on_packet_stage(enum packet_stage stage, struct packet *pkt, void *args)
|
||||
{
|
||||
struct packet_manager *pkt_mgr = (struct packet_manager *)args;
|
||||
struct packet_manager_runtime *pkt_mgr_rt = packet_manager_get_runtime(pkt_mgr, 0);
|
||||
EXPECT_TRUE(pkt_mgr_rt);
|
||||
|
||||
printf("module_C_on_packet_stage: \"%s\" schedule packet %p\n", packet_stage_to_str(stage), pkt);
|
||||
|
||||
EXPECT_TRUE(!packet_is_claim(pkt));
|
||||
|
||||
if (stage == PACKET_STAGE_PREROUTING)
|
||||
{
|
||||
packet_manager_runtime_schedule_packet(pkt_mgr_rt, packet_new(10), PACKET_STAGE_INPUT);
|
||||
packet_manager_runtime_schedule_packet(pkt_mgr_rt, packet_new(10), PACKET_STAGE_FORWARD);
|
||||
packet_manager_runtime_schedule_packet(pkt_mgr_rt, packet_new(10), PACKET_STAGE_OUTPUT);
|
||||
packet_manager_runtime_schedule_packet(pkt_mgr_rt, packet_new(10), PACKET_STAGE_POSTROUTING);
|
||||
}
|
||||
}
|
||||
|
||||
TEST(PACKET_MANAGER, SCHEDULE_PACKET)
|
||||
{
|
||||
// global init
|
||||
struct mq_schema *mq_schema = mq_schema_new();
|
||||
EXPECT_TRUE(mq_schema);
|
||||
struct mq_runtime *mq_rt = mq_runtime_new(mq_schema);
|
||||
EXPECT_TRUE(mq_rt);
|
||||
|
||||
// module init
|
||||
struct packet_manager *pkt_mgr = packet_manager_new(mq_schema, "./conf/stellar.toml");
|
||||
EXPECT_TRUE(pkt_mgr);
|
||||
struct packet_manager_schema *schema = packet_manager_get_schema(pkt_mgr);
|
||||
EXPECT_TRUE(schema);
|
||||
EXPECT_TRUE(packet_manager_schema_add_subscriber(schema, PACKET_STAGE_PREROUTING, module_C_on_packet_stage, pkt_mgr) == 0);
|
||||
EXPECT_TRUE(packet_manager_schema_add_subscriber(schema, PACKET_STAGE_INPUT, module_C_on_packet_stage, pkt_mgr) == 0);
|
||||
EXPECT_TRUE(packet_manager_schema_add_subscriber(schema, PACKET_STAGE_FORWARD, module_C_on_packet_stage, pkt_mgr) == 0);
|
||||
EXPECT_TRUE(packet_manager_schema_add_subscriber(schema, PACKET_STAGE_OUTPUT, module_C_on_packet_stage, pkt_mgr) == 0);
|
||||
EXPECT_TRUE(packet_manager_schema_add_subscriber(schema, PACKET_STAGE_POSTROUTING, module_C_on_packet_stage, pkt_mgr) == 0);
|
||||
|
||||
// per-thread init
|
||||
struct packet_manager_runtime *runtime = packet_manager_get_runtime(pkt_mgr, 0);
|
||||
EXPECT_TRUE(runtime);
|
||||
packet_manager_runtime_init(runtime, mq_rt);
|
||||
|
||||
// per-thread run
|
||||
struct packet pkt;
|
||||
memset(&pkt, 0, sizeof(pkt));
|
||||
packet_parse(&pkt, (const char *)data, sizeof(data));
|
||||
packet_set_ctrl(&pkt, true);
|
||||
|
||||
check_stat(packet_manager_runtime_get_stat(runtime), 0, 0, 0, 0);
|
||||
packet_manager_runtime_input(runtime, &pkt);
|
||||
packet_manager_runtime_dispatch(runtime);
|
||||
|
||||
struct packet *tmp = NULL;
|
||||
for (int i = 0; i < 4; i++)
|
||||
{
|
||||
tmp = packet_manager_runtime_output(runtime);
|
||||
EXPECT_TRUE(tmp);
|
||||
packet_free(tmp);
|
||||
}
|
||||
EXPECT_TRUE(packet_manager_runtime_output(runtime) == &pkt);
|
||||
EXPECT_TRUE(packet_manager_runtime_output(runtime) == NULL);
|
||||
check_stat(packet_manager_runtime_get_stat(runtime), 1, 5, 0, 4);
|
||||
|
||||
// per-thread free
|
||||
|
||||
// module free
|
||||
packet_manager_free(pkt_mgr);
|
||||
|
||||
// global free
|
||||
mq_runtime_free(mq_rt);
|
||||
mq_schema_free(mq_schema);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if 1
|
||||
TEST(PACKET_MANAGER, CLAIM_AND_SCHEDULE_PACKET)
|
||||
{
|
||||
// TODO
|
||||
// packet_manager_runtime_schedule_packet(struct packet_manager_runtime *pkt_mgr_rt, struct packet *pkt, enum packet_stage stage);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
Reference in New Issue
Block a user