Przeglądaj źródła

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 lat temu
rodzic
commit
b1192e5c48
2 zmienionych plików z 25 dodań i 11 usunięć
  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 {