Skip to content
This repository has been archived by the owner on May 21, 2024. It is now read-only.

Commit

Permalink
p2p/enode: mock DNS resolver in URL parsing test (ethereum#20252)
Browse files Browse the repository at this point in the history
  • Loading branch information
fjl authored and elizabethengelman committed Dec 30, 2019
1 parent 92e94dc commit 03a3783
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 6 deletions.
17 changes: 11 additions & 6 deletions p2p/enode/urlv4.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,10 @@ import (
"github.com/ethereum/go-ethereum/p2p/enr"
)

var incompleteNodeURL = regexp.MustCompile("(?i)^(?:enode://)?([0-9a-f]+)$")
var (
incompleteNodeURL = regexp.MustCompile("(?i)^(?:enode://)?([0-9a-f]+)$")
lookupIPFunc = net.LookupIP
)

// MustParseV4 parses a node URL. It panics if the URL is not valid.
func MustParseV4(rawurl string) *Node {
Expand Down Expand Up @@ -107,7 +110,6 @@ func isNewV4(n *Node) bool {
func parseComplete(rawurl string) (*Node, error) {
var (
id *ecdsa.PublicKey
ip net.IP
tcpPort, udpPort uint64
)
u, err := url.Parse(rawurl)
Expand All @@ -125,11 +127,14 @@ func parseComplete(rawurl string) (*Node, error) {
return nil, fmt.Errorf("invalid public key (%v)", err)
}
// Parse the IP address.
ips, err := net.LookupIP(u.Hostname())
if err != nil {
return nil, err
ip := net.ParseIP(u.Hostname())
if ip == nil {
ips, err := lookupIPFunc(u.Hostname())
if err != nil {
return nil, err
}
ip = ips[0]
}
ip = ips[0]
// Ensure the IP is 4 bytes long for IPv4 addresses.
if ipv4 := ip.To4(); ipv4 != nil {
ip = ipv4
Expand Down
10 changes: 10 additions & 0 deletions p2p/enode/urlv4_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ package enode

import (
"crypto/ecdsa"
"errors"
"net"
"reflect"
"strings"
Expand All @@ -27,6 +28,15 @@ import (
"github.com/ethereum/go-ethereum/p2p/enr"
)

func init() {
lookupIPFunc = func(name string) ([]net.IP, error) {
if name == "node.example.org" {
return []net.IP{{33, 44, 55, 66}}, nil
}
return nil, errors.New("no such host")
}
}

var parseNodeTests = []struct {
input string
wantError string
Expand Down

0 comments on commit 03a3783

Please sign in to comment.