From fdad6630ea185556e3e316fc15989e260fa0ea38 Mon Sep 17 00:00:00 2001 From: Barak Michener Date: Wed, 17 Dec 2014 19:40:30 -0500 Subject: [PATCH] Add a simple test and mock for genDNS --- etcdmain/etcd.go | 12 +++++---- etcdmain/etcd_test.go | 58 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 5 deletions(-) diff --git a/etcdmain/etcd.go b/etcdmain/etcd.go index 026f661e0..a56615a82 100644 --- a/etcdmain/etcd.go +++ b/etcdmain/etcd.go @@ -103,6 +103,8 @@ var ( "v", "vv", } + + lookupSRV = net.LookupSRV ) func init() { @@ -422,7 +424,7 @@ func setupCluster(apurls []url.URL) (*etcdserver.Cluster, error) { clusterStr := genClusterString(*name, apurls) cls, err = etcdserver.NewClusterFromString(*durl, clusterStr) case set["dns-cluster-domain"]: - clusterStr, clusterToken, err := genDnsClusterString(*initialClusterToken) + clusterStr, clusterToken, err := genDNSClusterString(*initialClusterToken) if err != nil { return nil, err } @@ -447,11 +449,11 @@ func genClusterString(name string, urls types.URLs) string { // TODO(barakmich): Currently ignores priority and weight (as they don't make as much sense for a bootstrap) // Also doesn't do any lookups for the token (though it could) // Also sees hostnames and IPs as separate -- use one or the other for consistency. -func genDnsClusterString(defaultToken string) (string, string, error) { +func genDNSClusterString(defaultToken string) (string, string, error) { targetName := make(map[string]int) stringParts := make([]string, 0) tempName := int(0) - _, addrs, err := net.LookupSRV("etcd-server-ssl", "tcp", *dnsCluster) + _, addrs, err := lookupSRV("etcd-server-ssl", "tcp", *dnsCluster) if err != nil { return "", "", err } @@ -465,7 +467,7 @@ func genDnsClusterString(defaultToken string) (string, string, error) { } stringParts = append(stringParts, fmt.Sprintf("%d=https://%s:%d", v, srv.Target, srv.Port)) } - _, addrs, err = net.LookupSRV("etcd-server", "tcp", *dnsCluster) + _, addrs, err = lookupSRV("etcd-server", "tcp", *dnsCluster) if err != nil { return "", "", err } @@ -479,5 +481,5 @@ func genDnsClusterString(defaultToken string) (string, string, error) { } stringParts = append(stringParts, fmt.Sprintf("%d=http://%s:%d", v, srv.Target, srv.Port)) } - return defaultToken, strings.Join(stringParts, ","), nil + return strings.Join(stringParts, ","), defaultToken, nil } diff --git a/etcdmain/etcd_test.go b/etcdmain/etcd_test.go index dff57f618..ac461cb2f 100644 --- a/etcdmain/etcd_test.go +++ b/etcdmain/etcd_test.go @@ -17,6 +17,8 @@ package etcdmain import ( + "errors" + "net" "net/url" "testing" @@ -54,3 +56,59 @@ func TestGenClusterString(t *testing.T) { } } } + +func TestGenDNSClusterString(t *testing.T) { + tests := []struct { + withSSL []*net.SRV + withoutSSL []*net.SRV + expected string + }{ + { + []*net.SRV{}, + []*net.SRV{}, + "", + }, + { + []*net.SRV{ + &net.SRV{Target: "10.0.0.1", Port: 2480}, + &net.SRV{Target: "10.0.0.2", Port: 2480}, + &net.SRV{Target: "10.0.0.3", Port: 2480}, + }, + []*net.SRV{}, + "0=https://10.0.0.1:2480,1=https://10.0.0.2:2480,2=https://10.0.0.3:2480", + }, + { + []*net.SRV{ + &net.SRV{Target: "10.0.0.1", Port: 2480}, + &net.SRV{Target: "10.0.0.2", Port: 2480}, + &net.SRV{Target: "10.0.0.3", Port: 2480}, + }, + []*net.SRV{ + &net.SRV{Target: "10.0.0.1", Port: 7001}, + }, + "0=https://10.0.0.1:2480,1=https://10.0.0.2:2480,2=https://10.0.0.3:2480,0=http://10.0.0.1:7001", + }, + } + + for i, tt := range tests { + lookupSRV = func(service string, proto string, domain string) (string, []*net.SRV, error) { + if service == "etcd-server-ssl" { + return "", tt.withSSL, nil + } + if service == "etcd-server" { + return "", tt.withoutSSL, nil + } + return "", nil, errors.New("Unkown service in mock") + } + str, token, err := genDNSClusterString("token") + if err != nil { + t.Fatalf("%d: err: %#v", i, err) + } + if token != "token" { + t.Error("Token doesn't match default token") + } + if str != tt.expected { + t.Errorf("#%d: cluster = %s, want %s", i, str, tt.expected) + } + } +}