Selaa lähdekoodia

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 vuotta sitten
vanhempi
commit
b1192e5c48
2 muutettua tiedostoa jossa 25 lisäystä ja 11 poistoa
  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 {