Kaynağa Gözat

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 yıl önce
ebeveyn
işleme
b1192e5c48
2 değiştirilmiş dosya ile 25 ekleme ve 11 silme
  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 {