package p2p import ( "fmt" "io/ioutil" "math/rand" "testing" "github.com/stretchr/testify/assert" ) const addrBookStrict = true func createTempFileName(prefix string) string { f, err := ioutil.TempFile("", prefix) if err != nil { panic(err) } fname := f.Name() err = f.Close() if err != nil { panic(err) } return fname } func TestEmpty(t *testing.T) { fname := createTempFileName("addrbook_test") // t.Logf("New tempfile name: %v", fname) // Save an empty book & load it book := NewAddrBook(fname, addrBookStrict) book.saveToFile(fname) book = NewAddrBook(fname, addrBookStrict) book.loadFromFile(fname) if book.Size() != 0 { t.Errorf("Expected 0 addresses, found %v", book.Size()) } } func randIPv4Address(t *testing.T) *NetAddress { for { ip := fmt.Sprintf("%v.%v.%v.%v", rand.Intn(254)+1, rand.Intn(255), rand.Intn(255), rand.Intn(255), ) port := rand.Intn(65535-1) + 1 addr, err := NewNetAddressString(fmt.Sprintf("%v:%v", ip, port)) assert.Nil(t, err, "error generating rand network address") if addr.Routable() { return addr } } } func TestSaveAddresses(t *testing.T) { fname := createTempFileName("addrbook_test") //t.Logf("New tempfile name: %v", fname) // Create some random addresses randAddrs := []struct { addr *NetAddress src *NetAddress }{} for i := 0; i < 100; i++ { addr := randIPv4Address(t) src := randIPv4Address(t) randAddrs = append(randAddrs, struct { addr *NetAddress src *NetAddress }{ addr: addr, src: src, }) } // Create the book & populate & save book := NewAddrBook(fname, addrBookStrict) for _, addrSrc := range randAddrs { book.AddAddress(addrSrc.addr, addrSrc.src) } if book.Size() != 100 { t.Errorf("Expected 100 addresses, found %v", book.Size()) } book.saveToFile(fname) // Reload the book book = NewAddrBook(fname, addrBookStrict) book.loadFromFile(fname) // Test ... if book.Size() != 100 { t.Errorf("Expected 100 addresses, found %v", book.Size()) } for _, addrSrc := range randAddrs { addr := addrSrc.addr src := addrSrc.src ka := book.addrLookup[addr.String()] if ka == nil { t.Fatalf("Expected to find KnownAddress %v but wasn't there.", addr) } if !(ka.Addr.Equals(addr) && ka.Src.Equals(src)) { t.Fatalf("KnownAddress doesn't match addr & src") } } } func TestPromoteToOld(t *testing.T) { fname := createTempFileName("addrbook_test") t.Logf("New tempfile name: %v", fname) // Create some random addresses randAddrs := []struct { addr *NetAddress src *NetAddress }{} for i := 0; i < 100; i++ { addr := randIPv4Address(t) src := randIPv4Address(t) randAddrs = append(randAddrs, struct { addr *NetAddress src *NetAddress }{ addr: addr, src: src, }) } // Create the book & populate & save book := NewAddrBook(fname, addrBookStrict) for _, addrSrc := range randAddrs { book.AddAddress(addrSrc.addr, addrSrc.src) } // Attempt all addresses. for _, addrSrc := range randAddrs { book.MarkAttempt(addrSrc.addr) } // Promote half of them for i, addrSrc := range randAddrs { if i%2 == 0 { book.MarkGood(addrSrc.addr) } } book.saveToFile(fname) // Reload the book book = NewAddrBook(fname, addrBookStrict) book.loadFromFile(fname) // Test ... if book.Size() != 100 { t.Errorf("Expected 100 addresses, found %v", book.Size()) } // TODO: do more testing :) selection := book.GetSelection() t.Logf("selection: %v", selection) }