github.com/keltia/go-ipfs@v0.3.8-0.20150909044612-210793031c63/blocks/bloom/filter_test.go (about) 1 package bloom 2 3 import ( 4 "encoding/binary" 5 "fmt" 6 "testing" 7 ) 8 9 func TestFilter(t *testing.T) { 10 f := NewFilter(128) 11 12 keys := [][]byte{ 13 []byte("hello"), 14 []byte("fish"), 15 []byte("ipfsrocks"), 16 []byte("i want ipfs socks"), 17 } 18 19 f.Add(keys[0]) 20 if !f.Find(keys[0]) { 21 t.Fatal("Failed to find single inserted key!") 22 } 23 24 f.Add(keys[1]) 25 if !f.Find(keys[1]) { 26 t.Fatal("Failed to find key!") 27 } 28 29 f.Add(keys[2]) 30 f.Add(keys[3]) 31 32 for _, k := range keys { 33 if !f.Find(k) { 34 t.Fatal("Couldnt find one of three keys") 35 } 36 } 37 38 if f.Find([]byte("beep boop")) { 39 t.Fatal("Got false positive! Super unlikely!") 40 } 41 42 fmt.Println(f) 43 } 44 45 func TestMerge(t *testing.T) { 46 47 f1 := NewFilter(128) 48 f2 := NewFilter(128) 49 50 fbork := NewFilter(32) 51 52 _, err := f1.Merge(fbork) 53 54 if err == nil { 55 t.Fatal("Merge should fail on filters with different lengths") 56 } 57 58 b := make([]byte, 4) 59 60 var i uint32 61 for i = 0; i < 10; i++ { 62 binary.LittleEndian.PutUint32(b, i) 63 f1.Add(b) 64 } 65 66 for i = 10; i < 20; i++ { 67 binary.LittleEndian.PutUint32(b, i) 68 f2.Add(b) 69 } 70 71 merged, _ := f1.Merge(f2) 72 73 for i = 0; i < 20; i++ { 74 binary.LittleEndian.PutUint32(b, i) 75 76 if !merged.Find(b) { 77 t.Fatal("Could not find all keys in merged filter") 78 } 79 } 80 } 81 82 func TestHamming(t *testing.T) { 83 f1 := NewFilter(128) 84 f2 := NewFilter(128) 85 86 f1.Add([]byte("no collision")) 87 f1.Add([]byte("collision? no!")) 88 89 dist, _ := f1.HammingDistance(f2) 90 91 if dist != 6 { 92 t.Fatal("Should have 6 bit difference") 93 } 94 }