func TestMembersAPIActionAdd(t *testing.T) { ep := url.URL{Scheme: "http", Host: "example.com"} act := &membersAPIActionAdd{ peerURLs: types.URLs([]url.URL{ url.URL{Scheme: "https", Host: "127.0.0.1:8081"}, url.URL{Scheme: "http", Host: "127.0.0.1:8080"}, }), } wantURL := &url.URL{ Scheme: "http", Host: "example.com", Path: "/v2/members", } wantHeader := http.Header{ "Content-Type": []string{"application/json"}, } wantBody := []byte(`{"peerURLs":["https://127.0.0.1:8081","http://127.0.0.1:8080"]}`) got := *act.HTTPRequest(ep) err := assertRequest(got, "POST", wantURL, wantHeader, wantBody) if err != nil { t.Error(err.Error()) } }
func TestHTTPMembersAPIAddSuccess(t *testing.T) { wantAction := &membersAPIActionAdd{ peerURLs: types.URLs([]url.URL{ url.URL{Scheme: "http", Host: "127.0.0.1:7002"}, }), } mAPI := &httpMembersAPI{ client: &actionAssertingHTTPClient{ t: t, act: wantAction, resp: http.Response{ StatusCode: http.StatusCreated, }, body: []byte(`{"id":"94088180e21eb87b","peerURLs":["http://127.0.0.1:7002"]}`), }, } wantResponseMember := &Member{ ID: "94088180e21eb87b", PeerURLs: []string{"http://127.0.0.1:7002"}, } m, err := mAPI.Add(context.Background(), "http://127.0.0.1:7002") if err != nil { t.Errorf("got non-nil err: %#v", err) } if !reflect.DeepEqual(wantResponseMember, m) { t.Errorf("incorrect Member: want=%#v got=%#v", wantResponseMember, m) } }
func TestTransportUpdate(t *testing.T) { peer := newFakePeer() tr := &transport{ peers: map[types.ID]Peer{types.ID(1): peer}, } u := "http://localhost:7001" tr.UpdatePeer(types.ID(1), []string{u}) wurls := types.URLs(testutil.MustNewURLs(t, []string{"http://localhost:7001"})) if !reflect.DeepEqual(peer.urls, wurls) { t.Errorf("urls = %+v, want %+v", peer.urls, wurls) } }
func TestMemberCreateRequestUnmarshal(t *testing.T) { body := []byte(`{"peerURLs": ["http://127.0.0.1:8081", "https://127.0.0.1:8080"]}`) want := MemberCreateRequest{ PeerURLs: types.URLs([]url.URL{ url.URL{Scheme: "http", Host: "127.0.0.1:8081"}, url.URL{Scheme: "https", Host: "127.0.0.1:8080"}, }), } var req MemberCreateRequest if err := json.Unmarshal(body, &req); err != nil { t.Fatalf("Unmarshal returned unexpected err=%v", err) } if !reflect.DeepEqual(want, req) { t.Fatalf("Failed to unmarshal MemberCreateRequest: want=%#v, got=%#v", want, req) } }
func TestMemberCreateRequestMarshal(t *testing.T) { req := memberCreateRequest{ PeerURLs: types.URLs([]url.URL{ url.URL{Scheme: "http", Host: "127.0.0.1:8081"}, url.URL{Scheme: "https", Host: "127.0.0.1:8080"}, }), } want := []byte(`{"peerURLs":["http://127.0.0.1:8081","https://127.0.0.1:8080"]}`) got, err := json.Marshal(&req) if err != nil { t.Fatalf("Marshal returned unexpected err=%v", err) } if !reflect.DeepEqual(want, got) { t.Fatalf("Failed to marshal memberCreateRequest: want=%s, got=%s", want, got) } }
// NewClusterFromString returns a Cluster instantiated from the given cluster token // and cluster string, by parsing members from a set of discovery-formatted // names-to-IPs, like: // mach0=http://1.1.1.1,mach0=http://2.2.2.2,mach1=http://3.3.3.3,mach2=http://4.4.4.4 func NewClusterFromString(token string, cluster string) (*Cluster, error) { c := newCluster(token) v, err := url.ParseQuery(strings.Replace(cluster, ",", "&", -1)) if err != nil { return nil, err } for name, urls := range v { if len(urls) == 0 || urls[0] == "" { return nil, fmt.Errorf("Empty URL given for %q", name) } purls := &flags.URLsValue{} if err := purls.Set(strings.Join(urls, ",")); err != nil { return nil, err } m := NewMember(name, types.URLs(*purls), c.token, nil) if _, ok := c.members[m.ID]; ok { return nil, fmt.Errorf("Member exists with identical ID %v", m) } c.members[m.ID] = m } c.genID() return c, nil }