#include #include "mpack.h" #include "shaper_marsio.h" static int construct_shaping_cmsg(const char *tsync, unsigned long long session_id, const char *state, uuid_t *shaping_rule_ids, int shaping_rule_id_num, char **mpack_data, size_t *mpack_size) { mpack_writer_t writer; mpack_writer_init_growable(&writer, mpack_data, mpack_size); mpack_build_map(&writer); //tsync mpack_write_cstr(&writer, "tsync"); mpack_write_cstr(&writer, "2.0"); //session_id mpack_write_cstr(&writer, "session_id"); mpack_write_u64(&writer, session_id); //state mpack_write_cstr(&writer, "state"); mpack_write_cstr(&writer, state); //method: policy_update mpack_write_cstr(&writer, "method"); mpack_write_cstr(&writer, "policy_update"); //params mpack_write_cstr(&writer, "params"); mpack_build_map(&writer); mpack_write_cstr(&writer, "shaper"); mpack_build_map(&writer); mpack_write_cstr(&writer, "rule_ids"); mpack_build_array(&writer); for (int i = 0; i < shaping_rule_id_num; i++) { mpack_write_bin(&writer, (char*)shaping_rule_ids[i], sizeof(uuid_t)); } mpack_complete_array(&writer);//build array rule_ids mpack_complete_map(&writer);//build map shaper mpack_complete_map(&writer);//build map params mpack_complete_map(&writer);//build map at the beginning mpack_writer_destroy(&writer); return 0; } TEST(CTRL_PACKET, PARSE) { const char *tsync = "2.0"; unsigned long long session_id = 123456789; const char *state = "active"; uuid_t shaping_rule_ids[3]; char *mpack_data = NULL; size_t mpack_size = 0; uuid_parse("00000000-0000-0000-0000-000000000001", shaping_rule_ids[0]); uuid_parse("00000000-0000-0000-0000-000000000002", shaping_rule_ids[1]); uuid_parse("00000000-0000-0000-0000-000000000003", shaping_rule_ids[2]); construct_shaping_cmsg(tsync, session_id, state, shaping_rule_ids, 3, &mpack_data, &mpack_size); struct ctrl_pkt_data ctrl_data; memset(&ctrl_data, 0, sizeof(ctrl_data)); EXPECT_EQ(shaper_marsio_ctrl_pkt_data_parse(&ctrl_data, mpack_data, mpack_size), 0); EXPECT_EQ(ctrl_data.session_id, 123456789); EXPECT_EQ(ctrl_data.state, SESSION_STATE_ACTIVE); EXPECT_EQ(ctrl_data.shaping_rule_num, 3); char uuid_str[UUID_STR_LEN]; uuid_unparse(ctrl_data.shaping_rule_uuids[0], uuid_str); EXPECT_STREQ(uuid_str, "00000000-0000-0000-0000-000000000001"); uuid_unparse(ctrl_data.shaping_rule_uuids[1], uuid_str); EXPECT_STREQ(uuid_str, "00000000-0000-0000-0000-000000000002"); uuid_unparse(ctrl_data.shaping_rule_uuids[2], uuid_str); EXPECT_STREQ(uuid_str, "00000000-0000-0000-0000-000000000003"); if (mpack_data) { free(mpack_data); } } int main(int argc, char **argv) { ::testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); }