29#include <gtest/gtest-spi.h>
30#include <gtest/gtest.h>
36#define GEM5_DECLARE_FILTER_PARAMS(name) \
37 BloomFilterBaseParams name; \
38 name.eventq_index = 0; \
40 name.offset_bits = 6; \
68TEST(BloomFilterBaseTest, Construct)
73 for (
int i = 0;
i < params.size;
i++) {
74 ASSERT_FALSE(filter.
isSet(
i));
82TEST(BloomFilterBaseTest, SingleIsSet)
90 ASSERT_TRUE(filter.
isSet(0));
91 ASSERT_FALSE(filter.
isSet(1));
92 ASSERT_FALSE(filter.
isSet(2));
98 ASSERT_FALSE(filter.
isSet(0));
99 ASSERT_TRUE(filter.
isSet(1));
100 ASSERT_FALSE(filter.
isSet(2));
106 ASSERT_FALSE(filter.
isSet(0));
107 ASSERT_FALSE(filter.
isSet(1));
108 ASSERT_TRUE(filter.
isSet(2));
115TEST(BloomFilterBaseTest, MultipleIsSet)
125 ASSERT_TRUE(filter.
isSet(0));
126 ASSERT_TRUE(filter.
isSet(1));
127 ASSERT_FALSE(filter.
isSet(2));
135 ASSERT_FALSE(filter.
isSet(0));
136 ASSERT_TRUE(filter.
isSet(1));
137 ASSERT_TRUE(filter.
isSet(2));
145 ASSERT_TRUE(filter.
isSet(0));
146 ASSERT_FALSE(filter.
isSet(1));
147 ASSERT_TRUE(filter.
isSet(2));
157 ASSERT_TRUE(filter.
isSet(0));
158 ASSERT_TRUE(filter.
isSet(1));
159 ASSERT_TRUE(filter.
isSet(2));
167TEST(BloomFilterBaseTest, SingleIsSetThreshold)
171 params.threshold = 2;
177 ASSERT_FALSE(filter.
isSet(0));
178 ASSERT_FALSE(filter.
isSet(1));
179 ASSERT_FALSE(filter.
isSet(2));
182 ASSERT_TRUE(filter.
isSet(0));
183 ASSERT_FALSE(filter.
isSet(1));
184 ASSERT_FALSE(filter.
isSet(2));
189 ASSERT_FALSE(filter.
isSet(0));
190 ASSERT_FALSE(filter.
isSet(1));
191 ASSERT_FALSE(filter.
isSet(2));
194 ASSERT_FALSE(filter.
isSet(0));
195 ASSERT_TRUE(filter.
isSet(1));
196 ASSERT_FALSE(filter.
isSet(2));
201 ASSERT_FALSE(filter.
isSet(0));
202 ASSERT_FALSE(filter.
isSet(1));
203 ASSERT_FALSE(filter.
isSet(2));
206 ASSERT_FALSE(filter.
isSet(0));
207 ASSERT_FALSE(filter.
isSet(1));
208 ASSERT_TRUE(filter.
isSet(2));
217 ASSERT_FALSE(filter.
isSet(0));
218 ASSERT_FALSE(filter.
isSet(1));
219 ASSERT_FALSE(filter.
isSet(2));
223TEST(BloomFilterBaseTest, MergeBothEmpty)
229 filter.
merge(&filter2);
238TEST(BloomFilterBaseTest, MergeWithEmpty)
246 filter.
merge(&filter2);
248 ASSERT_TRUE(filter.
isSet(1));
256TEST(BloomFilterBaseTest, MergeWithEmpty2)
264 filter.
merge(&filter2);
266 ASSERT_TRUE(filter.
isSet(1));
268 ASSERT_TRUE(filter.
isSet(1));
275TEST(BloomFilterBaseTest, MergeNoIntersection)
291 filter.
merge(&filter2);
293 ASSERT_TRUE(filter.
isSet(1));
294 ASSERT_TRUE(filter.
isSet(2));
295 ASSERT_TRUE(filter.
isSet(3));
296 ASSERT_TRUE(filter.
isSet(4));
297 ASSERT_TRUE(filter.
isSet(5));
298 ASSERT_TRUE(filter.
isSet(8));
299 ASSERT_TRUE(filter.
isSet(9));
301 ASSERT_TRUE(filter2.
isSet(3));
302 ASSERT_TRUE(filter2.
isSet(4));
303 ASSERT_TRUE(filter2.
isSet(9));
307TEST(BloomFilterBaseTest, MergeIntersectionThreshold1)
323 filter.
merge(&filter2);
325 ASSERT_TRUE(filter.
isSet(1));
326 ASSERT_TRUE(filter.
isSet(2));
327 ASSERT_TRUE(filter.
isSet(3));
328 ASSERT_TRUE(filter.
isSet(5));
329 ASSERT_TRUE(filter.
isSet(8));
330 ASSERT_TRUE(filter.
isSet(9));
332 ASSERT_TRUE(filter2.
isSet(3));
333 ASSERT_TRUE(filter2.
isSet(5));
334 ASSERT_TRUE(filter2.
isSet(9));
342TEST(BloomFilterBaseTest, MergeIntersectionThreshold2)
347 params.threshold = 2;
363 filter.
merge(&filter2);
366 ASSERT_TRUE(filter.
isSet(2));
367 ASSERT_TRUE(filter.
isSet(5));
369 ASSERT_FALSE(filter2.
isSet(2));
370 ASSERT_TRUE(filter2.
isSet(5));
374TEST(BloomFilterBaseDeathTest, MergeDifferent)
377 GTEST_SKIP() <<
"Skipping as assertions are "
378 "stripped out of fast builds";
383 BloomFilterBaseParams params2;
384 params2.eventq_index = params.eventq_index;
385 params2.size = params.size + 1;
386 params2.offset_bits = params.offset_bits;
387 params2.num_bits = params.num_bits;
388 params2.threshold = params.threshold;
391 ASSERT_DEATH(filter.
merge(&filter2),
"");
394#undef GEM5_DECLARE_FILTER_PARAMS
TEST(BloomFilterBaseTest, Construct)
Test that a filter is initialized in a cleared state.
#define GEM5_DECLARE_FILTER_PARAMS(name)
Simulates basic behavior of a bloom filter.
void set(Addr addr) override
Perform the filter specific function to set the corresponding entries (can be multiple) of an address...
int getCount(Addr addr) const override
Get the value stored in the corresponding filter entry of an address.
virtual bool isSet(Addr addr) const
Check if the corresponding filter entries of an address should be considered as set.
std::vector< SatCounter8 > filter
The filter itself.
virtual int getTotalCount() const
Get the total value stored in the filter entries.
virtual void clear()
Clear the filter by resetting all values.
Base(const BloomFilterBaseParams &p)
Create and clear the filter.
virtual void merge(const Base *other)
Merges the contents of both filters into this' (Bloom Filter union).
Copyright (c) 2024 Arm Limited All rights reserved.
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.