func TestNeedMoreAddresses(t *testing.T) { n := addrmgr.New("testneedmoreaddresses", lookupFunc) addrsToAdd := 1500 b := n.NeedMoreAddresses() if !b { t.Errorf("Expected that we need more addresses") } addrs := make([]*wire.NetAddress, addrsToAdd) var err error for i := 0; i < addrsToAdd; i++ { s := fmt.Sprintf("%d.%d.173.147:8333", i/128+60, i%128+60) addrs[i], err = n.DeserializeNetAddress(s) if err != nil { t.Errorf("Failed to turn %s into an address: %v", s, err) } } srcAddr := wire.NewNetAddressIPPort(net.IPv4(173, 144, 173, 111), 8333, 0) n.AddAddresses(addrs, srcAddr) numAddrs := n.NumAddresses() if numAddrs > addrsToAdd { t.Errorf("Number of addresses is too many %d vs %d", numAddrs, addrsToAdd) } b = n.NeedMoreAddresses() if b { t.Errorf("Expected that we don't need more addresses") } }
func TestGood(t *testing.T) { n := addrmgr.New("testgood", lookupFunc) addrsToAdd := 64 * 64 addrs := make([]*wire.NetAddress, addrsToAdd) var err error for i := 0; i < addrsToAdd; i++ { s := fmt.Sprintf("%d.173.147.%d:8333", i/64+60, i%64+60) addrs[i], err = n.DeserializeNetAddress(s) if err != nil { t.Errorf("Failed to turn %s into an address: %v", s, err) } } srcAddr := wire.NewNetAddressIPPort(net.IPv4(173, 144, 173, 111), 8333, 0) n.AddAddresses(addrs, srcAddr) for _, addr := range addrs { n.Good(addr) } numAddrs := n.NumAddresses() if numAddrs >= addrsToAdd { t.Errorf("Number of addresses is too many: %d vs %d", numAddrs, addrsToAdd) } numCache := len(n.AddressCache()) if numCache >= numAddrs/4 { t.Errorf("Number of addresses in cache: got %d, want %d", numCache, numAddrs/4) } }
func TestStartStop(t *testing.T) { n := addrmgr.New("teststartstop", lookupFunc) n.Start() err := n.Stop() if err != nil { t.Fatalf("Address Manager failed to stop: %v", err) } }
func TestAddLocalAddress(t *testing.T) { var tests = []struct { address wire.NetAddress priority addrmgr.AddressPriority valid bool }{ { wire.NetAddress{IP: net.ParseIP("192.168.0.100")}, addrmgr.InterfacePrio, false, }, { wire.NetAddress{IP: net.ParseIP("204.124.1.1")}, addrmgr.InterfacePrio, true, }, { wire.NetAddress{IP: net.ParseIP("204.124.1.1")}, addrmgr.BoundPrio, true, }, { wire.NetAddress{IP: net.ParseIP("::1")}, addrmgr.InterfacePrio, false, }, { wire.NetAddress{IP: net.ParseIP("fe80::1")}, addrmgr.InterfacePrio, false, }, { wire.NetAddress{IP: net.ParseIP("2620:100::1")}, addrmgr.InterfacePrio, true, }, } amgr := addrmgr.New("testaddlocaladdress", nil) for x, test := range tests { result := amgr.AddLocalAddress(&test.address, test.priority) if result == nil && !test.valid { t.Errorf("TestAddLocalAddress test #%d failed: %s should have "+ "been accepted", x, test.address.IP) continue } if result != nil && test.valid { t.Errorf("TestAddLocalAddress test #%d failed: %s should not have "+ "been accepted", x, test.address.IP) continue } } }
func TestConnected(t *testing.T) { n := addrmgr.New("testconnected", lookupFunc) // Add a new address and get it err := n.AddAddressByIP(someIP + ":8333") if err != nil { t.Fatalf("Adding address failed: %v", err) } ka := n.GetAddress() na := ka.NetAddress() // make it an hour ago na.Timestamp = time.Unix(time.Now().Add(time.Hour*-1).Unix(), 0) n.Connected(na) if !ka.NetAddress().Timestamp.After(na.Timestamp) { t.Errorf("Address should have a new timestamp, but does not") } }
func TestAddAddressByIP(t *testing.T) { fmtErr := fmt.Errorf("") addrErr := &net.AddrError{} var tests = []struct { addrIP string err error }{ { someIP + ":8333", nil, }, { someIP, addrErr, }, { someIP[:12] + ":8333", fmtErr, }, { someIP + ":abcd", fmtErr, }, } amgr := addrmgr.New("testaddressbyip", nil) for i, test := range tests { err := amgr.AddAddressByIP(test.addrIP) if test.err != nil && err == nil { t.Errorf("TestGood test %d failed expected an error and got none", i) continue } if test.err == nil && err != nil { t.Errorf("TestGood test %d failed expected no error and got one", i) continue } if reflect.TypeOf(err) != reflect.TypeOf(test.err) { t.Errorf("TestGood test %d failed got %v, want %v", i, reflect.TypeOf(err), reflect.TypeOf(test.err)) continue } } }
func TestAttempt(t *testing.T) { n := addrmgr.New("testattempt", lookupFunc) // Add a new address and get it err := n.AddAddressByIP(someIP + ":8333") if err != nil { t.Fatalf("Adding address failed: %v", err) } ka := n.GetAddress() if !ka.LastAttempt().IsZero() { t.Errorf("Address should not have attempts, but does") } na := ka.NetAddress() n.Attempt(na) if ka.LastAttempt().IsZero() { t.Errorf("Address should have an attempt, but does not") } }
func TestGetAddress(t *testing.T) { n := addrmgr.New("testgetaddress", lookupFunc) // Get an address from an empty set (should error) if rv := n.GetAddress(); rv != nil { t.Errorf("GetAddress failed: got: %v want: %v\n", rv, nil) } // Add a new address and get it err := n.AddAddressByIP(someIP + ":8333") if err != nil { t.Fatalf("Adding address failed: %v", err) } ka := n.GetAddress() if ka == nil { t.Fatalf("Did not get an address where there is one in the pool") } if ka.NetAddress().IP.String() != someIP { t.Errorf("Wrong IP: got %v, want %v", ka.NetAddress().IP.String(), someIP) } // Mark this as a good address and get it n.Good(ka.NetAddress()) ka = n.GetAddress() if ka == nil { t.Fatalf("Did not get an address where there is one in the pool") } if ka.NetAddress().IP.String() != someIP { t.Errorf("Wrong IP: got %v, want %v", ka.NetAddress().IP.String(), someIP) } numAddrs := n.NumAddresses() if numAddrs != 1 { t.Errorf("Wrong number of addresses: got %d, want %d", numAddrs, 1) } }
func TestGetBestLocalAddress(t *testing.T) { localAddrs := []wire.NetAddress{ {IP: net.ParseIP("192.168.0.100")}, {IP: net.ParseIP("::1")}, {IP: net.ParseIP("fe80::1")}, {IP: net.ParseIP("2001:470::1")}, } var tests = []struct { remoteAddr wire.NetAddress want0 wire.NetAddress want1 wire.NetAddress want2 wire.NetAddress want3 wire.NetAddress }{ { // Remote connection from public IPv4 wire.NetAddress{IP: net.ParseIP("204.124.8.1")}, wire.NetAddress{IP: net.IPv4zero}, wire.NetAddress{IP: net.IPv4zero}, wire.NetAddress{IP: net.ParseIP("204.124.8.100")}, wire.NetAddress{IP: net.ParseIP("fd87:d87e:eb43:25::1")}, }, { // Remote connection from private IPv4 wire.NetAddress{IP: net.ParseIP("172.16.0.254")}, wire.NetAddress{IP: net.IPv4zero}, wire.NetAddress{IP: net.IPv4zero}, wire.NetAddress{IP: net.IPv4zero}, wire.NetAddress{IP: net.IPv4zero}, }, { // Remote connection from public IPv6 wire.NetAddress{IP: net.ParseIP("2602:100:abcd::102")}, wire.NetAddress{IP: net.IPv6zero}, wire.NetAddress{IP: net.ParseIP("2001:470::1")}, wire.NetAddress{IP: net.ParseIP("2001:470::1")}, wire.NetAddress{IP: net.ParseIP("2001:470::1")}, }, /* XXX { // Remote connection from Tor wire.NetAddress{IP: net.ParseIP("fd87:d87e:eb43::100")}, wire.NetAddress{IP: net.IPv4zero}, wire.NetAddress{IP: net.ParseIP("204.124.8.100")}, wire.NetAddress{IP: net.ParseIP("fd87:d87e:eb43:25::1")}, }, */ } amgr := addrmgr.New("testgetbestlocaladdress", nil) // Test against default when there's no address for x, test := range tests { got := amgr.GetBestLocalAddress(&test.remoteAddr) if !test.want0.IP.Equal(got.IP) { t.Errorf("TestGetBestLocalAddress test1 #%d failed for remote address %s: want %s got %s", x, test.remoteAddr.IP, test.want1.IP, got.IP) continue } } for _, localAddr := range localAddrs { amgr.AddLocalAddress(&localAddr, addrmgr.InterfacePrio) } // Test against want1 for x, test := range tests { got := amgr.GetBestLocalAddress(&test.remoteAddr) if !test.want1.IP.Equal(got.IP) { t.Errorf("TestGetBestLocalAddress test1 #%d failed for remote address %s: want %s got %s", x, test.remoteAddr.IP, test.want1.IP, got.IP) continue } } // Add a public IP to the list of local addresses. localAddr := wire.NetAddress{IP: net.ParseIP("204.124.8.100")} amgr.AddLocalAddress(&localAddr, addrmgr.InterfacePrio) // Test against want2 for x, test := range tests { got := amgr.GetBestLocalAddress(&test.remoteAddr) if !test.want2.IP.Equal(got.IP) { t.Errorf("TestGetBestLocalAddress test2 #%d failed for remote address %s: want %s got %s", x, test.remoteAddr.IP, test.want2.IP, got.IP) continue } } /* // Add a tor generated IP address localAddr = wire.NetAddress{IP: net.ParseIP("fd87:d87e:eb43:25::1")} amgr.AddLocalAddress(&localAddr, addrmgr.ManualPrio) // Test against want3 for x, test := range tests { got := amgr.GetBestLocalAddress(&test.remoteAddr) if !test.want3.IP.Equal(got.IP) { t.Errorf("TestGetBestLocalAddress test3 #%d failed for remote address %s: want %s got %s", x, test.remoteAddr.IP, test.want3.IP, got.IP) continue } } */ }