@@ -39,7 +39,22 @@ class FilterTest : public ::testing::Test {
3939 VCL::FilterParameters params_ht_max;
4040 VCL::FilterParameters params_cache_max;
4141
42+
43+ static int filter_name_counter;
44+ std::vector<std::string> filter_names;
45+
46+
4247 void SetUp () override {
48+
49+ // Clear any filters from previous tests to ensure clean state
50+ // since filter_create adds to a global manager
51+ std::vector<std::string> existing_filter_names = VCL::filter_list_all_names ();
52+ for (const std::string& name : existing_filter_names) {
53+ VCL::filter_free (VCL::filter_find_existing (name.c_str ()));
54+ }
55+
56+ filter_names.clear ();
57+
4358 // Common parameters for small filters
4459 params_ht_small.num_keys = SMALL_NUM_KEYS;
4560 params_ht_small.key_len = TEST_KEY_LEN;
@@ -78,17 +93,157 @@ class FilterTest : public ::testing::Test {
7893 }
7994
8095 void TearDown () override {
81- // No explicit teardown needed for unique_ptr or stack objects
96+ // Free filters after test to prevent duplicate names
97+ std::vector<std::string> existing_filter_names = VCL::filter_list_all_names ();
98+ for (const std::string& name : existing_filter_names) {
99+ VCL::filter_free (VCL::filter_find_existing (name.c_str ()));
100+ }
101+
102+ filter_names.clear ();
82103 }
83104};
84105
106+ int FilterTest::filter_name_counter = 0 ;
85107
86108/*
87109 ********************************
88110 * I. Filter Creation Tests *
89111 ********************************
90112*/
91113
114+ // Test cases for filter listing and finding
115+ TEST_F (FilterTest, Filter_list_all_names_Empty) {
116+ std::vector<std::string> names = VCL::filter_list_all_names ();
117+ EXPECT_TRUE (names.empty ()) << " Expected no filters initially, but found " << names.size ();
118+ }
119+
120+ TEST_F (FilterTest, Filter_list_all_names_MultipleFilters) {
121+ filter_name_counter = 0 ;
122+
123+ filter_names.emplace_back (" TestCacheFilterMedium_" + std::to_string (filter_name_counter++));
124+ filter_names.emplace_back (" TestCacheFilterMedium_" + std::to_string (filter_name_counter++));
125+ filter_names.emplace_back (" TestCacheFilterMedium_" + std::to_string (filter_name_counter++));
126+
127+ VCL::FilterParameters p0 = params_cache_medium;
128+ p0.name = filter_names[0 ].c_str ();
129+ VCL::Filter* filter0 = VCL::filter_create (&p0);
130+
131+ VCL::FilterParameters p1 = params_cache_medium;
132+ p1.name = filter_names[1 ].c_str ();
133+ VCL::Filter* filter1 = VCL::filter_create (&p1);
134+
135+ VCL::FilterParameters p2 = params_cache_medium;
136+ p2.name = filter_names[2 ].c_str ();
137+ VCL::Filter* filter2 = VCL::filter_create (&p2);
138+
139+ ASSERT_NE (filter0, nullptr );
140+ ASSERT_NE (filter1, nullptr );
141+ ASSERT_NE (filter2, nullptr );
142+
143+ std::vector<std::string> names = VCL::filter_list_all_names ();
144+ EXPECT_EQ (names.size (), 3 ) << " Expected 3 filters, but found " << names.size ();
145+
146+ std::vector<std::string> expected_names;
147+ expected_names.push_back (p0.name );
148+ expected_names.push_back (p1.name );
149+ expected_names.push_back (p2.name );
150+
151+ std::sort (names.begin (), names.end ());
152+ std::sort (expected_names.begin (), expected_names.end ());
153+
154+ // Compare the sorted lists
155+ for (size_t i = 0 ; i < expected_names.size (); ++i) {
156+ EXPECT_EQ (names[i], expected_names[i])
157+ << " Mismatch at index " << i << " . Expected: " << expected_names[i] << " , Actual: " << names[i];
158+ }
159+ }
160+
161+ TEST_F (FilterTest, Filter_list_all_names_AfterFree) {
162+ VCL::FilterParameters p1 = params_ht_small;
163+ filter_names.emplace_back (" TestHTFilterSmall_" + std::to_string (filter_name_counter++));
164+ p1.name = filter_names.back ().c_str ();
165+ VCL::Filter* filter1 = VCL::filter_create (&p1);
166+
167+ VCL::FilterParameters p2 = params_cache_medium;
168+ filter_names.emplace_back (" TestCacheFilterMedium_" + std::to_string (filter_name_counter++));
169+ p2.name = filter_names.back ().c_str ();
170+ VCL::Filter* filter2 = VCL::filter_create (&p2);
171+
172+ ASSERT_NE (filter1, nullptr );
173+ ASSERT_NE (filter2, nullptr );
174+
175+ std::vector<std::string> names_before_free = VCL::filter_list_all_names ();
176+ EXPECT_EQ (names_before_free.size (), 2 );
177+
178+ VCL::filter_free (filter1); // Free filter1
179+
180+ std::vector<std::string> names_after_free_1 = VCL::filter_list_all_names ();
181+ EXPECT_EQ (names_after_free_1.size (), 1 );
182+ EXPECT_EQ (names_after_free_1[0 ], p2.name ); // Only p2.name should remain
183+
184+ VCL::filter_free (filter2); // Free filter2
185+
186+ std::vector<std::string> names_after_free_2 = VCL::filter_list_all_names ();
187+ EXPECT_TRUE (names_after_free_2.empty ());
188+
189+ }
190+
191+ TEST_F (FilterTest, Filter_find_existing_Success) {
192+ VCL::FilterParameters p1 = params_ht_small;
193+ filter_names.emplace_back (" TestHTFilterSmall_" + std::to_string (filter_name_counter++));
194+ p1.name = filter_names.back ().c_str ();
195+ VCL::Filter* filter1 = VCL::filter_create (&p1);
196+ ASSERT_NE (filter1, nullptr );
197+
198+ VCL::Filter* found_filter = VCL::filter_find_existing (p1.name );
199+ ASSERT_NE (found_filter, nullptr );
200+ EXPECT_EQ (found_filter, filter1);
201+ EXPECT_STREQ (found_filter->get_name (), p1.name );
202+
203+ // Test a different filter type
204+ VCL::FilterParameters p2 = params_cache_medium;
205+ filter_names.emplace_back (" TestCacheFilterMedium_" + std::to_string (filter_name_counter++));
206+ p2.name = filter_names.back ().c_str ();
207+ VCL::Filter* filter2 = VCL::filter_create (&p2);
208+ ASSERT_NE (filter2, nullptr );
209+ VCL::Filter* found_filter2 = VCL::filter_find_existing (p2.name );
210+ ASSERT_NE (found_filter2, nullptr );
211+ EXPECT_EQ (found_filter2, filter2);
212+ }
213+
214+ TEST_F (FilterTest, Filter_find_existing_NotFound) {
215+ // No filters created yet (or existing ones cleared by SetUp)
216+ std::string non_existent_name = " NonExistentFilter_" + std::to_string (filter_name_counter++);
217+ VCL::Filter* found_filter = VCL::filter_find_existing (non_existent_name.c_str ());
218+ EXPECT_EQ (found_filter, nullptr );
219+
220+ // Create one filter, then search for a different non-existent one
221+ VCL::FilterParameters p_temp = params_ht_small;
222+ filter_names.emplace_back (" TempFilter_" + std::to_string (filter_name_counter++));
223+ p_temp.name = filter_names.back ().c_str ();
224+ VCL::filter_create (&p_temp);
225+
226+ std::string another_non_existent_name = " AnotherNonExistentFilter_" + std::to_string (filter_name_counter++);
227+ found_filter = VCL::filter_find_existing (another_non_existent_name.c_str ());
228+ EXPECT_EQ (found_filter, nullptr );
229+ }
230+
231+ TEST_F (FilterTest, Filter_find_existing_NullName) {
232+ VCL::Filter* found_filter = VCL::filter_find_existing (nullptr );
233+ EXPECT_EQ (found_filter, nullptr );
234+ }
235+
236+
237+ TEST_F (FilterTest, Filter_GetName) {
238+ VCL::Filter* ht_filter = VCL::filter_create (¶ms_ht_small);
239+ ASSERT_NE (ht_filter, nullptr );
240+ ASSERT_TRUE (ht_filter->is_valid ());
241+ EXPECT_STREQ (ht_filter->get_name (), params_ht_small.name );
242+ VCL::filter_free (ht_filter); // Clean up explicitly
243+
244+ }
245+
246+
92247TEST_F (FilterTest, CuckooHTFilter_Creation_Success) {
93248 std::unique_ptr<VCL::CuckooHTFilter> filter;
94249 ASSERT_NO_THROW (filter = std::make_unique<VCL::CuckooHTFilter>(params_ht_small));
0 commit comments