Bläddra i källkod

pkg/netutil: fix false negative comparison

Sort the resolved URLs before DeepEqual, so it will not compare URLs
that may be out of order due to resolution.
Yicheng Qin 10 år sedan
förälder
incheckning
b1192e5c48
2 ändrade filer med 25 tillägg och 11 borttagningar
  1. 8 9
      pkg/netutil/netutil.go
  2. 17 2
      pkg/netutil/netutil_test.go

+ 8 - 9
pkg/netutil/netutil.go

@@ -20,9 +20,11 @@ import (
 	"net/http"
 	"net/url"
 	"reflect"
+	"sort"
 	"strings"
 
 	"github.com/coreos/etcd/Godeps/_workspace/src/github.com/coreos/pkg/capnslog"
+	"github.com/coreos/etcd/pkg/types"
 )
 
 var (
@@ -67,15 +69,12 @@ func URLsEqual(a []url.URL, b []url.URL) bool {
 	if len(a) != len(b) {
 		return false
 	}
-	for i, urlA := range a {
-		urlB := b[i]
-
-		if !reflect.DeepEqual(urlA, urlB) {
-			urls := []url.URL{urlA, urlB}
-			ResolveTCPAddrs(urls)
-			if !reflect.DeepEqual(urls[0], urls[1]) {
-				return false
-			}
+	ResolveTCPAddrs(a, b)
+	sort.Sort(types.URLs(a))
+	sort.Sort(types.URLs(b))
+	for i := range a {
+		if !reflect.DeepEqual(a[i], b[i]) {
+			return false
 		}
 	}
 

+ 17 - 2
pkg/netutil/netutil_test.go

@@ -139,16 +139,21 @@ func TestResolveTCPAddrs(t *testing.T) {
 
 func TestURLsEqual(t *testing.T) {
 	defer func() { resolveTCPAddr = net.ResolveTCPAddr }()
+	hostm := map[string]string{
+		"example.com": "10.0.10.1",
+		"first.com":   "10.0.11.1",
+		"second.com":  "10.0.11.2",
+	}
 	resolveTCPAddr = func(network, addr string) (*net.TCPAddr, error) {
 		host, port, err := net.SplitHostPort(addr)
-		if host != "example.com" {
+		if _, ok := hostm[host]; !ok {
 			return nil, errors.New("cannot resolve host.")
 		}
 		i, err := strconv.Atoi(port)
 		if err != nil {
 			return nil, err
 		}
-		return &net.TCPAddr{IP: net.ParseIP("10.0.10.1"), Port: i, Zone: ""}, nil
+		return &net.TCPAddr{IP: net.ParseIP(hostm[host]), Port: i, Zone: ""}, nil
 	}
 
 	tests := []struct {
@@ -226,6 +231,16 @@ func TestURLsEqual(t *testing.T) {
 			b:      []url.URL{{Scheme: "http", Host: "10.0.0.1:2379"}, {Scheme: "http", Host: "127.0.0.1:2380"}},
 			expect: false,
 		},
+		{
+			a:      []url.URL{{Scheme: "http", Host: "first.com:2379"}, {Scheme: "http", Host: "second.com:2380"}},
+			b:      []url.URL{{Scheme: "http", Host: "10.0.11.1:2379"}, {Scheme: "http", Host: "10.0.11.2:2380"}},
+			expect: true,
+		},
+		{
+			a:      []url.URL{{Scheme: "http", Host: "second.com:2380"}, {Scheme: "http", Host: "first.com:2379"}},
+			b:      []url.URL{{Scheme: "http", Host: "10.0.11.1:2379"}, {Scheme: "http", Host: "10.0.11.2:2380"}},
+			expect: true,
+		},
 	}
 
 	for _, test := range tests {