1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
|
#include <gtest/gtest.h>
#include "mpack.h"
#include "shaper.h"
#include "shaper_session.h"
#include "shaper_marsio.h"
static void gtest_shaper_log_parse(struct shaping_flow *sf, const char *data, size_t length)
{
int shaping_rule_array_size;
char temp_str[16] = {0};
mpack_tree_t tree;
mpack_node_t root;
mpack_node_t tmp_node;
mpack_node_t tmp_rule_node;
mpack_node_t tmp_profile_node;
mpack_tree_init_data(&tree, data, length);
mpack_tree_parse(&tree);
root = mpack_tree_root(&tree);
//tsync
tmp_node = mpack_node_map_cstr(root, "tsync");
EXPECT_EQ(mpack_type_str, mpack_node_type(tmp_node));
memcpy(temp_str, mpack_node_str(tmp_node), mpack_node_strlen(tmp_node));
EXPECT_STREQ("2.0", temp_str);
//session_id
tmp_node = mpack_node_map_cstr(root, "session_id");
EXPECT_EQ(mpack_type_uint, mpack_node_type(tmp_node));
sf->ctrl_meta.session_id = mpack_node_u64(tmp_node);
//state
tmp_node = mpack_node_map_cstr(root, "state");
EXPECT_EQ(mpack_type_str, mpack_node_type(tmp_node));
memset(temp_str, 0, sizeof(temp_str));
memcpy(temp_str, mpack_node_str(tmp_node), mpack_node_strlen(tmp_node));
EXPECT_STREQ("active", temp_str);
//method
tmp_node = mpack_node_map_cstr(root, "method");
EXPECT_EQ(mpack_type_str, mpack_node_type(tmp_node));
memset(temp_str, 0, sizeof(temp_str));
memcpy(temp_str, mpack_node_str(tmp_node), mpack_node_strlen(tmp_node));
EXPECT_STREQ("log_update", temp_str);
//shaping rules
tmp_node = mpack_node_map_cstr(root, "params");
EXPECT_EQ(mpack_type_map, mpack_node_type(tmp_node));
tmp_node = mpack_node_map_cstr(tmp_node, "shaper");
EXPECT_EQ(mpack_type_array, mpack_node_type(tmp_node));
shaping_rule_array_size = mpack_node_array_length(tmp_node);
sf->rule_num = MIN(shaping_rule_array_size, SHAPING_RULE_NUM_MAX);
for (int i = 0; i < sf->rule_num; i++) {
ASSERT_EQ(mpack_type_map, mpack_node_type(mpack_node_array_at(tmp_node, i)) );
tmp_rule_node = mpack_node_map_cstr(mpack_node_array_at(tmp_node, i), "rule_id");
EXPECT_EQ(mpack_type_bin, mpack_node_type(tmp_rule_node));
uuid_copy(sf->matched_rule_infos[i].uuid, *(uuid_t*)mpack_node_bin_data(tmp_rule_node));
tmp_profile_node = mpack_node_map_cstr(mpack_node_array_at(tmp_node, i), "profile_ids");
ASSERT_EQ(mpack_type_array, mpack_node_type(tmp_profile_node));
int profile_array_len = mpack_node_array_length(tmp_profile_node);
sf->matched_rule_infos[i].borrowing_num = profile_array_len - 1;
for (int j = 0; j < profile_array_len; j++) {
ASSERT_EQ(mpack_type_bin, mpack_node_type(mpack_node_array_at(tmp_profile_node, j)) );
if (j == 0) {
uuid_copy(sf->matched_rule_infos[i].primary.uuid, *(uuid_t*)mpack_node_bin_data(mpack_node_array_at(tmp_profile_node, j)));
} else {
uuid_copy(sf->matched_rule_infos[i].borrowing[j - 1].uuid, *(uuid_t*)mpack_node_bin_data(mpack_node_array_at(tmp_profile_node, j)));
}
}
}
mpack_tree_destroy(&tree);
return;
}
TEST(MPACK_LOG, PARSE)
{
struct shaping_flow sf_in;
struct shaping_flow sf_out;
char *mpack_data = NULL;
size_t mpack_size = 0;
sf_in.ctrl_meta.session_id = 12345678;
sf_in.rule_num = 3;
//rule_id 1, primary profile id 1, borrow profile id 2
uuid_parse("00000000-0000-0000-0000-000000000001", sf_in.matched_rule_infos[0].uuid);
uuid_parse("00000000-0000-0000-0000-000000000001", sf_in.matched_rule_infos[0].primary.uuid);
sf_in.matched_rule_infos[0].borrowing_num = 1;
uuid_parse("00000000-0000-0000-0000-000000000002", sf_in.matched_rule_infos[0].borrowing[0].uuid);
//rule id 2, primary profile id 3, borrow profile id 4,5
uuid_parse("00000000-0000-0000-0000-000000000002", sf_in.matched_rule_infos[1].uuid);
uuid_parse("00000000-0000-0000-0000-000000000003", sf_in.matched_rule_infos[1].primary.uuid);
sf_in.matched_rule_infos[1].borrowing_num = 2;
uuid_parse("00000000-0000-0000-0000-000000000004", sf_in.matched_rule_infos[1].borrowing[0].uuid);
uuid_parse("00000000-0000-0000-0000-000000000005", sf_in.matched_rule_infos[1].borrowing[1].uuid);
//rule id 3, primary profile id 6, borrow profile id 7,8,9
uuid_parse("00000000-0000-0000-0000-000000000003", sf_in.matched_rule_infos[2].uuid);
uuid_parse("00000000-0000-0000-0000-000000000006", sf_in.matched_rule_infos[2].primary.uuid);
sf_in.matched_rule_infos[2].borrowing_num = 3;
uuid_parse("00000000-0000-0000-0000-000000000007", sf_in.matched_rule_infos[2].borrowing[0].uuid);
uuid_parse("00000000-0000-0000-0000-000000000008", sf_in.matched_rule_infos[2].borrowing[1].uuid);
uuid_parse("00000000-0000-0000-0000-000000000009", sf_in.matched_rule_infos[2].borrowing[2].uuid);
shaper_session_log_prepare(&sf_in, &mpack_data, &mpack_size);
gtest_shaper_log_parse(&sf_out, mpack_data, mpack_size);
EXPECT_EQ(sf_out.ctrl_meta.session_id, 12345678);
EXPECT_EQ(sf_out.rule_num, 3);
//rule_id 1, primary profile id 1, borrow profile id 2
char uuid_str[UUID_STR_LEN];
uuid_unparse(sf_out.matched_rule_infos[0].uuid, uuid_str);
EXPECT_STREQ("00000000-0000-0000-0000-000000000001", uuid_str);
uuid_unparse(sf_out.matched_rule_infos[0].primary.uuid, uuid_str);
EXPECT_STREQ("00000000-0000-0000-0000-000000000001", uuid_str);
EXPECT_EQ(sf_out.matched_rule_infos[0].borrowing_num, 1);
uuid_unparse(sf_out.matched_rule_infos[0].borrowing[0].uuid, uuid_str);
EXPECT_STREQ("00000000-0000-0000-0000-000000000002", uuid_str);
//rule id 2, primary profile id 3, borrow profile id 4,5
uuid_unparse(sf_out.matched_rule_infos[1].uuid, uuid_str);
EXPECT_STREQ("00000000-0000-0000-0000-000000000002", uuid_str);
uuid_unparse(sf_out.matched_rule_infos[1].primary.uuid, uuid_str);
EXPECT_STREQ("00000000-0000-0000-0000-000000000003", uuid_str);
EXPECT_EQ(sf_out.matched_rule_infos[1].borrowing_num, 2);
uuid_unparse(sf_out.matched_rule_infos[1].borrowing[0].uuid, uuid_str);
EXPECT_STREQ("00000000-0000-0000-0000-000000000004", uuid_str);
uuid_unparse(sf_out.matched_rule_infos[1].borrowing[1].uuid, uuid_str);
EXPECT_STREQ("00000000-0000-0000-0000-000000000005", uuid_str);
//rule id 3, primary profile id 6, borrow profile id 7,8,9
uuid_unparse(sf_out.matched_rule_infos[2].uuid, uuid_str);
EXPECT_STREQ("00000000-0000-0000-0000-000000000003", uuid_str);
uuid_unparse(sf_out.matched_rule_infos[2].primary.uuid, uuid_str);
EXPECT_STREQ("00000000-0000-0000-0000-000000000006", uuid_str);
EXPECT_EQ(sf_out.matched_rule_infos[2].borrowing_num, 3);
uuid_unparse(sf_out.matched_rule_infos[2].borrowing[0].uuid, uuid_str);
EXPECT_STREQ("00000000-0000-0000-0000-000000000007", uuid_str);
uuid_unparse(sf_out.matched_rule_infos[2].borrowing[1].uuid, uuid_str);
EXPECT_STREQ("00000000-0000-0000-0000-000000000008", uuid_str);
uuid_unparse(sf_out.matched_rule_infos[2].borrowing[2].uuid, uuid_str);
EXPECT_STREQ("00000000-0000-0000-0000-000000000009", uuid_str);
if (mpack_data) {
free(mpack_data);
}
}
int main(int argc, char **argv)
{
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
|