package com.facebook.infrastructure.utils;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import java.io.IOException;
public class CountingBloomFilterTest {
public CountingBloomFilter cbf;
public CountingBloomFilterTest() {
cbf = new CountingBloomFilter(FilterTest.ELEMENTS, FilterTest.spec.bucketsPerElement);
}
@BeforeMethod
public void clear() {
cbf.clear();
}
@Test
public void testOne() {
cbf.add("a");
assert cbf.isPresent("a");
assert cbf.maxBucket() == 1;
assert !cbf.isPresent("b");
cbf.delete("a");
assert !cbf.isPresent("a");
assert cbf.maxBucket() == 0;
}
@Test
public void testCounting() {
cbf.add("a");
cbf.add("a");
assert cbf.maxBucket() == 2;
cbf.delete("a");
assert cbf.isPresent("a");
assert cbf.maxBucket() == 1;
for (int i = 0; i < FilterTest.ELEMENTS; i++) {
cbf.add(Integer.toString(i));
}
for (int i = 0; i < FilterTest.ELEMENTS; i++) {
cbf.delete(Integer.toString(i));
}
assert cbf.isPresent("a");
cbf.delete("a");
assert !cbf.isPresent("a");
assert cbf.maxBucket() == 0;
}
@Test
public void testMerge() {
cbf.add("a");
cbf.add("a");
CountingBloomFilter cbf2 = new CountingBloomFilter(FilterTest.ELEMENTS, FilterTest.spec.bucketsPerElement);
cbf2.add("a");
cbf2.add("a");
cbf.merge(cbf2);
assert cbf.maxBucket() == 4;
}
@Test
public void testMergeMaxCount() {
for (int i = 0; i < CountingBloomFilter.MAX_COUNT; i++) {
cbf.add("b");
}
CountingBloomFilter cbf2 = new CountingBloomFilter(FilterTest.ELEMENTS, FilterTest.spec.bucketsPerElement);
cbf2.add("b");
cbf.merge(cbf2);
assert cbf.maxBucket() == CountingBloomFilter.MAX_COUNT;
}
@Test
public void testMaxCount() {
for (int i = 0; i < CountingBloomFilter.MAX_COUNT; i++) {
cbf.add("a");
}
assert cbf.maxBucket() == CountingBloomFilter.MAX_COUNT;
cbf.add("a");
assert cbf.maxBucket() == CountingBloomFilter.MAX_COUNT;
cbf.delete("a");
assert cbf.maxBucket() == CountingBloomFilter.MAX_COUNT;
}
@Test
public void testFalsePositivesInt() {
FilterTest.testFalsePositives(cbf, FilterTest.intKeys(), FilterTest.randomKeys2());
}
@Test
public void testFalsePositivesRandom() {
FilterTest.testFalsePositives(cbf, FilterTest.randomKeys(), FilterTest.randomKeys2());
}
@Test
public void testWords() {
CountingBloomFilter cbf2 = new CountingBloomFilter(KeyGenerator.WordGenerator.WORDS / 2, FilterTest.spec.bucketsPerElement);
int skipEven = KeyGenerator.WordGenerator.WORDS % 2 == 0 ? 0 : 2;
FilterTest.testFalsePositives(cbf2,
new KeyGenerator.WordGenerator(skipEven, 2),
new KeyGenerator.WordGenerator(1, 2));
}
@Test
public void testSerialize() throws IOException {
CountingBloomFilter cbf2 = (CountingBloomFilter) FilterTest.testSerialize(cbf);
assert cbf2.maxBucket() == 1;
}
}