1+ #include < gtest/gtest.h>
2+ #include < MsgGen.h>
3+ #include < libfds.h>
4+
5+ extern " C" {
6+ #include < core/template_mapper.h>
7+ }
8+
9+ int main (int argc, char **argv)
10+ {
11+ ::testing::InitGoogleTest (&argc, argv);
12+ return RUN_ALL_TESTS ();
13+ }
14+
15+ /* * \brief Create template with given ID and fields cnt */
16+ struct fds_template *create_template (uint id, uint fields_cnt) {
17+ ipfix_trec trec (id);
18+ for (uint i = 1 ; i <= fields_cnt; ++i) {
19+ trec.add_field (i, 4 );
20+ }
21+ uint16_t tmplt_size = trec.size ();
22+ uint8_t *tmplt_raw = trec.release ();
23+
24+ fds_template *tmplt;
25+ fds_template_parse (FDS_TYPE_TEMPLATE, tmplt_raw, &tmplt_size, &tmplt);
26+ free (tmplt_raw);
27+ return tmplt;
28+ }
29+
30+ /* *
31+ * \brief Main testing fixture for testing mapper component
32+ */
33+ class Common : public ::testing::Test {
34+ protected:
35+ using mapper_uniq = std::unique_ptr<ipx_template_mapper_t , decltype (&ipx_mapper_destroy)>;
36+
37+ ipx_template_mapper_t *mapper;
38+
39+ // Parsed templates
40+ const uint tmplt_cnt = 2 ;
41+ const fds_template *t1[2 ];
42+ const fds_template *t2[2 ];
43+
44+ // Setup
45+ void SetUp () override {
46+ // Initialize mapper
47+ mapper_uniq mapper_wrap (ipx_mapper_create (), &ipx_mapper_destroy);
48+ mapper = mapper_wrap.release ();
49+
50+ const uint16_t tmplt_id = 256 ;
51+
52+ for (uint i = 0 ; i < tmplt_cnt; ++i) {
53+ t1[i] = create_template (tmplt_id, 2 +i);
54+ t2[i] = create_template (tmplt_id+1 , 3 +i);
55+ }
56+ }
57+
58+ // Tear Down
59+ void TearDown () override {
60+ ipx_mapper_destroy (mapper);
61+
62+ for (uint i = 0 ; i < tmplt_cnt; ++i) {
63+ fds_template_destroy ((struct fds_template *)t1[i]);
64+ fds_template_destroy ((struct fds_template *)t2[i]);
65+ }
66+ }
67+ };
68+
69+ TEST_F (Common, CreateAndDestroy)
70+ {
71+ // Nothing to do
72+ ASSERT_NE (mapper, nullptr );
73+ }
74+
75+ TEST_F (Common, LookUp_EmptyMapper)
76+ {
77+ // Look up for template
78+ const fds_template *tmplt = ipx_mapper_lookup (mapper, t1[0 ], 256 );
79+ ASSERT_EQ (tmplt, nullptr );
80+ }
81+
82+ TEST_F (Common, Add_SingleTemplate)
83+ {
84+ // Add template
85+ ASSERT_EQ (ipx_mapper_add (mapper, t1[0 ], 256 ), IPX_OK);
86+
87+ // Lookup template
88+ const fds_template *tmplt = ipx_mapper_lookup (mapper, t1[0 ], 256 );
89+ ASSERT_NE (tmplt, nullptr );
90+ EXPECT_EQ (fds_template_cmp (tmplt, t1[0 ]), 0 );
91+ }
92+
93+ TEST_F (Common, Add_MultipleTemplates_SameID)
94+ {
95+ // Use templates with ID 257, set original ID to 256
96+ ASSERT_EQ (ipx_mapper_add (mapper, t2[0 ], 256 ), IPX_OK);
97+ ASSERT_EQ (ipx_mapper_add (mapper, t2[1 ], 256 ), IPX_OK);
98+
99+ // Lookup using wrong template
100+ EXPECT_EQ (ipx_mapper_lookup (mapper, t1[0 ], 256 ), nullptr );
101+
102+ // Lookup using correct template
103+ const struct fds_template *tmplt = ipx_mapper_lookup (mapper, t2[1 ], 256 );
104+ ASSERT_NE (tmplt, nullptr );
105+ EXPECT_EQ (fds_template_cmp (tmplt, t2[1 ]), 0 );
106+
107+ tmplt = ipx_mapper_lookup (mapper, t2[0 ], 256 );
108+ ASSERT_NE (tmplt, nullptr );
109+ EXPECT_EQ (fds_template_cmp (tmplt, t2[0 ]), 0 );
110+ }
111+
112+ TEST_F (Common, Add_MultipleTemplates_DifferentIDs)
113+ {
114+ size_t size = 1000 ;
115+ fds_template **tmplts = new fds_template*[size];
116+ for (size_t i = 0 ; i < size; i++) {
117+ tmplts[i] = create_template (256 + i * 10 , 2 );
118+ }
119+
120+ for (size_t i = 0 ; i < size; i++) {
121+ ASSERT_EQ (ipx_mapper_add (mapper, tmplts[i], tmplts[i]->id ), IPX_OK);
122+ }
123+
124+ const struct fds_template *tmplt;
125+ for (size_t i = 0 ; i < size; i++) {
126+ tmplt = ipx_mapper_lookup (mapper, tmplts[i], 256 + i * 10 );
127+ ASSERT_NE (tmplt, nullptr );
128+ EXPECT_EQ (fds_template_cmp (tmplt, tmplts[i]), 0 );
129+ }
130+
131+ for (size_t i = 0 ; i < size; i++) {
132+ fds_template_destroy (tmplts[i]);
133+ }
134+ delete[] tmplts;
135+ }
136+
137+ TEST_F (Common, Add_AllTemplates)
138+ {
139+ size_t size = 65536 - 256 ;
140+ fds_template **tmplts = new fds_template*[size];
141+ for (size_t i = 0 ; i < size; i++) {
142+ tmplts[i] = create_template (256 + i, 2 );
143+ }
144+
145+ for (size_t i = 0 ; i < size; i++) {
146+ ASSERT_EQ (ipx_mapper_add (mapper, tmplts[i], tmplts[i]->id ), IPX_OK);
147+ }
148+
149+ const struct fds_template *tmplt;
150+ for (size_t i = 0 ; i < size; i++) {
151+ tmplt = ipx_mapper_lookup (mapper, tmplts[i], 256 + i);
152+ ASSERT_NE (tmplt, nullptr );
153+ EXPECT_EQ (fds_template_cmp (tmplt, tmplts[i]), 0 );
154+ }
155+
156+ for (size_t i = 0 ; i < size; i++) {
157+ fds_template_destroy (tmplts[i]);
158+ }
159+ delete[] tmplts;
160+ }
0 commit comments