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  }