47 lines
1.1 KiB
Go
47 lines
1.1 KiB
Go
package gossip
|
|
|
|
import (
|
|
"math"
|
|
"math/rand"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
func TestNewCrdsFilterSet(t *testing.T) {
|
|
filters := NewCrdsFilterSet(55345017, 4098)
|
|
assert.Equal(t, 16384, len(filters))
|
|
maskBits := filters[0].MaskBits
|
|
rightShift := 64 - maskBits
|
|
ones := uint64(math.MaxUint64) >> maskBits
|
|
for i, filter := range filters {
|
|
assert.Equal(t, maskBits, filter.MaskBits)
|
|
assert.Equal(t, uint64(i), filter.Mask>>rightShift)
|
|
assert.Equal(t, ones, ones&filter.Mask)
|
|
}
|
|
}
|
|
|
|
func TestCrdsFilterSet_Add(t *testing.T) {
|
|
filters := NewCrdsFilterSet(9672788, 8196)
|
|
hashValues := make([]Hash, 1024)
|
|
for i := range hashValues {
|
|
rand.Read(hashValues[i][:])
|
|
filters.Add(hashValues[i])
|
|
}
|
|
for _, hashValue := range hashValues {
|
|
numHits := uint(0)
|
|
falsePositives := uint(0)
|
|
for _, filter := range filters {
|
|
if filter.TestMask(&hashValue) {
|
|
numHits++
|
|
assert.True(t, filter.Contains(&hashValue))
|
|
assert.True(t, filter.Filter.Contains(&hashValue))
|
|
} else if filter.Filter.Contains(&hashValue) {
|
|
falsePositives++
|
|
}
|
|
}
|
|
assert.Equal(t, numHits, uint(1))
|
|
assert.Less(t, falsePositives, uint(5))
|
|
}
|
|
}
|