Skip to content

Commit 8e98f90

Browse files
[tests] Add unit tests for CounterNameMapUpdater
Add comprehensive unit tests for CounterNameMapUpdater to verify that counter name maps are correctly written to COUNTERS_DB regardless of HFT (High Frequency Telemetry) support. Tests cover: - QUEUE counter maps without HFT support - Priority Group counter maps without HFT support - Handling of empty OID values - Single counter name map operations These tests verify the fix from sonic-net#3967 that removed the redundant outer 'if (gHFTOrch)' check which was preventing counter registration on platforms without HFT support. Signed-off-by: Prasoon Saurav <[email protected]>
1 parent 0e1558e commit 8e98f90

File tree

2 files changed

+202
-0
lines changed

2 files changed

+202
-0
lines changed

tests/mock_tests/Makefile.am

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ tests_SOURCES = aclorch_ut.cpp \
7474
twamporch_ut.cpp \
7575
stporch_ut.cpp \
7676
flexcounter_ut.cpp \
77+
counternameupdater_ut.cpp \
7778
mock_orch_test.cpp \
7879
mock_dash_orch_test.cpp \
7980
zmq_orch_ut.cpp \
Lines changed: 201 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,201 @@
1+
#include "ut_helper.h"
2+
#include "mock_orchagent_main.h"
3+
#include "mock_table.h"
4+
#include <gtest/gtest.h>
5+
6+
#define private public
7+
#include "high_frequency_telemetry/counternameupdater.h"
8+
#undef private
9+
10+
extern HFTelOrch *gHFTOrch;
11+
12+
namespace counternameupdater_test
13+
{
14+
using namespace std;
15+
using namespace swss;
16+
17+
struct CounterNameMapUpdaterTest : public ::testing::Test
18+
{
19+
shared_ptr<DBConnector> m_counters_db;
20+
shared_ptr<Table> m_counters_queue_name_map_table;
21+
shared_ptr<Table> m_counters_pg_name_map_table;
22+
23+
CounterNameMapUpdaterTest()
24+
{
25+
}
26+
27+
void SetUp() override
28+
{
29+
// Initialize database connectors
30+
m_counters_db = make_shared<DBConnector>("COUNTERS_DB", 0);
31+
m_counters_queue_name_map_table = make_shared<Table>(m_counters_db.get(), "COUNTERS_QUEUE_NAME_MAP");
32+
m_counters_pg_name_map_table = make_shared<Table>(m_counters_db.get(), "COUNTERS_PG_NAME_MAP");
33+
34+
// Clear tables
35+
m_counters_queue_name_map_table->del("");
36+
m_counters_pg_name_map_table->del("");
37+
}
38+
39+
void TearDown() override
40+
{
41+
// Clean up
42+
m_counters_queue_name_map_table->del("");
43+
m_counters_pg_name_map_table->del("");
44+
}
45+
};
46+
47+
// Test that setCounterNameMap works without HFT support (gHFTOrch == nullptr)
48+
TEST_F(CounterNameMapUpdaterTest, SetCounterNameMapWithoutHFT)
49+
{
50+
// Ensure gHFTOrch is nullptr to simulate platform without HFT support
51+
HFTelOrch *saved_gHFTOrch = gHFTOrch;
52+
gHFTOrch = nullptr;
53+
54+
cout << "Testing QUEUE counter maps without HFT support (gHFTOrch=" << (void*)gHFTOrch << ")" << endl;
55+
56+
// Create CounterNameMapUpdater for QUEUE
57+
CounterNameMapUpdater queue_updater("COUNTERS_DB", "COUNTERS_QUEUE_NAME_MAP");
58+
59+
// Create test data - vector of counter name maps
60+
vector<FieldValueTuple> queue_maps = {
61+
{"Ethernet0:0", "oid:0x1500000000001"},
62+
{"Ethernet0:1", "oid:0x1500000000002"},
63+
{"Ethernet0:2", "oid:0x1500000000003"},
64+
};
65+
66+
cout << "Calling setCounterNameMap with " << queue_maps.size() << " entries..." << endl;
67+
68+
// Call setCounterNameMap with vector - this should work even without HFT
69+
queue_updater.setCounterNameMap(queue_maps);
70+
71+
cout << "Verifying entries were written to COUNTERS_DB..." << endl;
72+
73+
// Verify that the counter names were written to COUNTERS_DB
74+
string value;
75+
bool result;
76+
77+
result = m_counters_queue_name_map_table->hget("", "Ethernet0:0", value);
78+
cout << " Ethernet0:0 -> " << (result ? value : "NOT FOUND") << endl;
79+
ASSERT_TRUE(result);
80+
ASSERT_EQ(value, "oid:0x1500000000001");
81+
82+
result = m_counters_queue_name_map_table->hget("", "Ethernet0:1", value);
83+
cout << " Ethernet0:1 -> " << (result ? value : "NOT FOUND") << endl;
84+
ASSERT_TRUE(result);
85+
ASSERT_EQ(value, "oid:0x1500000000002");
86+
87+
result = m_counters_queue_name_map_table->hget("", "Ethernet0:2", value);
88+
cout << " Ethernet0:2 -> " << (result ? value : "NOT FOUND") << endl;
89+
ASSERT_TRUE(result);
90+
ASSERT_EQ(value, "oid:0x1500000000003");
91+
92+
cout << "All QUEUE counter map entries verified successfully!" << endl;
93+
94+
// Restore gHFTOrch
95+
gHFTOrch = saved_gHFTOrch;
96+
}
97+
98+
// Test that setCounterNameMap works for Priority Groups without HFT support
99+
TEST_F(CounterNameMapUpdaterTest, SetPriorityGroupMapWithoutHFT)
100+
{
101+
// Ensure gHFTOrch is nullptr to simulate platform without HFT support
102+
HFTelOrch *saved_gHFTOrch = gHFTOrch;
103+
gHFTOrch = nullptr;
104+
105+
// Create CounterNameMapUpdater for Priority Groups
106+
CounterNameMapUpdater pg_updater("COUNTERS_DB", "COUNTERS_PG_NAME_MAP");
107+
108+
// Create test data - vector of PG counter name maps
109+
vector<FieldValueTuple> pg_maps = {
110+
{"Ethernet0:0", "oid:0x1a00000000001"},
111+
{"Ethernet0:1", "oid:0x1a00000000002"},
112+
{"Ethernet4:0", "oid:0x1a00000000003"},
113+
};
114+
115+
// Call setCounterNameMap with vector - this should work even without HFT
116+
pg_updater.setCounterNameMap(pg_maps);
117+
118+
// Verify that the counter names were written to COUNTERS_DB
119+
string value;
120+
bool result;
121+
122+
result = m_counters_pg_name_map_table->hget("", "Ethernet0:0", value);
123+
ASSERT_TRUE(result);
124+
ASSERT_EQ(value, "oid:0x1a00000000001");
125+
126+
result = m_counters_pg_name_map_table->hget("", "Ethernet0:1", value);
127+
ASSERT_TRUE(result);
128+
ASSERT_EQ(value, "oid:0x1a00000000002");
129+
130+
result = m_counters_pg_name_map_table->hget("", "Ethernet4:0", value);
131+
ASSERT_TRUE(result);
132+
ASSERT_EQ(value, "oid:0x1a00000000003");
133+
134+
// Restore gHFTOrch
135+
gHFTOrch = saved_gHFTOrch;
136+
}
137+
138+
// Test that setCounterNameMap handles empty OID values
139+
TEST_F(CounterNameMapUpdaterTest, SetCounterNameMapWithEmptyOID)
140+
{
141+
// Ensure gHFTOrch is nullptr
142+
HFTelOrch *saved_gHFTOrch = gHFTOrch;
143+
gHFTOrch = nullptr;
144+
145+
CounterNameMapUpdater queue_updater("COUNTERS_DB", "COUNTERS_QUEUE_NAME_MAP");
146+
147+
// Create test data with empty OID value
148+
vector<FieldValueTuple> queue_maps = {
149+
{"Ethernet0:0", "oid:0x1500000000001"},
150+
{"Ethernet0:1", ""}, // Empty OID
151+
{"Ethernet0:2", "oid:0x1500000000003"},
152+
};
153+
154+
// Call setCounterNameMap - should handle empty OID gracefully
155+
queue_updater.setCounterNameMap(queue_maps);
156+
157+
// Verify that entries were written
158+
string value;
159+
bool result;
160+
161+
result = m_counters_queue_name_map_table->hget("", "Ethernet0:0", value);
162+
ASSERT_TRUE(result);
163+
ASSERT_EQ(value, "oid:0x1500000000001");
164+
165+
// Empty OID should be written as "oid:0x0"
166+
result = m_counters_queue_name_map_table->hget("", "Ethernet0:1", value);
167+
ASSERT_TRUE(result);
168+
ASSERT_EQ(value, "oid:0x0");
169+
170+
result = m_counters_queue_name_map_table->hget("", "Ethernet0:2", value);
171+
ASSERT_TRUE(result);
172+
ASSERT_EQ(value, "oid:0x1500000000003");
173+
174+
// Restore gHFTOrch
175+
gHFTOrch = saved_gHFTOrch;
176+
}
177+
178+
// Test single counter name map set
179+
TEST_F(CounterNameMapUpdaterTest, SetSingleCounterNameMap)
180+
{
181+
// Ensure gHFTOrch is nullptr
182+
HFTelOrch *saved_gHFTOrch = gHFTOrch;
183+
gHFTOrch = nullptr;
184+
185+
CounterNameMapUpdater queue_updater("COUNTERS_DB", "COUNTERS_QUEUE_NAME_MAP");
186+
187+
// Set single counter name map
188+
sai_object_id_t oid = 0x1500000000001;
189+
queue_updater.setCounterNameMap("Ethernet0:0", oid);
190+
191+
// Verify
192+
string value;
193+
bool result = m_counters_queue_name_map_table->hget("", "Ethernet0:0", value);
194+
ASSERT_TRUE(result);
195+
ASSERT_EQ(value, "oid:0x1500000000001");
196+
197+
// Restore gHFTOrch
198+
gHFTOrch = saved_gHFTOrch;
199+
}
200+
}
201+

0 commit comments

Comments
 (0)