Browse Source

etcdhttp: add NewPeerHandler test

Yicheng Qin 11 years ago
parent
commit
dc6aef0d02
4 changed files with 37 additions and 6 deletions
  1. 1 1
      etcdmain/etcd.go
  2. 4 4
      etcdserver/etcdhttp/peer.go
  3. 31 0
      etcdserver/etcdhttp/peer_test.go
  4. 1 1
      integration/cluster_test.go

+ 1 - 1
etcdmain/etcd.go

@@ -171,7 +171,7 @@ func startEtcd(cfg *config) (<-chan struct{}, error) {
 		Handler: etcdhttp.NewClientHandler(s),
 		Info:    cfg.corsInfo,
 	}
-	ph := etcdhttp.NewPeerHandler(s)
+	ph := etcdhttp.NewPeerHandler(s.Cluster, s.RaftHandler())
 	// Start the peer server in a goroutine
 	for _, l := range plns {
 		go func(l net.Listener) {

+ 4 - 4
etcdserver/etcdhttp/peer.go

@@ -30,15 +30,15 @@ const (
 )
 
 // NewPeerHandler generates an http.Handler to handle etcd peer (raft) requests.
-func NewPeerHandler(server *etcdserver.EtcdServer) http.Handler {
+func NewPeerHandler(clusterInfo etcdserver.ClusterInfo, raftHandler http.Handler) http.Handler {
 	mh := &peerMembersHandler{
-		clusterInfo: server.Cluster,
+		clusterInfo: clusterInfo,
 	}
 
 	mux := http.NewServeMux()
 	mux.HandleFunc("/", http.NotFound)
-	mux.Handle(rafthttp.RaftPrefix, server.RaftHandler())
-	mux.Handle(rafthttp.RaftPrefix+"/", server.RaftHandler())
+	mux.Handle(rafthttp.RaftPrefix, raftHandler)
+	mux.Handle(rafthttp.RaftPrefix+"/", raftHandler)
 	mux.Handle(peerMembersPrefix, mh)
 	return mux
 }

+ 31 - 0
etcdserver/etcdhttp/peer_test.go

@@ -18,14 +18,45 @@ package etcdhttp
 
 import (
 	"encoding/json"
+	"io/ioutil"
 	"net/http"
 	"net/http/httptest"
 	"path"
 	"testing"
 
 	"github.com/coreos/etcd/etcdserver"
+	"github.com/coreos/etcd/rafthttp"
 )
 
+// TestNewPeerHandler tests that NewPeerHandler returns a handler that
+// handles raft-prefix requests well.
+func TestNewPeerHandlerOnRaftPrefix(t *testing.T) {
+	h := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+		w.Write([]byte("test data"))
+	})
+	ph := NewPeerHandler(&fakeCluster{}, h)
+	srv := httptest.NewServer(ph)
+	defer srv.Close()
+
+	tests := []string{
+		rafthttp.RaftPrefix,
+		rafthttp.RaftPrefix + "/hello",
+	}
+	for i, tt := range tests {
+		resp, err := http.Get(srv.URL + tt)
+		if err != nil {
+			t.Fatalf("unexpected http.Get error: %v", err)
+		}
+		body, err := ioutil.ReadAll(resp.Body)
+		if err != nil {
+			t.Fatalf("unexpected ioutil.ReadAll error: %v", err)
+		}
+		if w := "test data"; string(body) != w {
+			t.Errorf("#%d: body = %s, want %s", i, body, w)
+		}
+	}
+}
+
 func TestServeMembersFails(t *testing.T) {
 	tests := []struct {
 		method string

+ 1 - 1
integration/cluster_test.go

@@ -487,7 +487,7 @@ func (m *member) Launch() error {
 	m.s.SyncTicker = time.Tick(500 * time.Millisecond)
 	m.s.Start()
 
-	m.raftHandler = &testutil.PauseableHandler{Next: etcdhttp.NewPeerHandler(m.s)}
+	m.raftHandler = &testutil.PauseableHandler{Next: etcdhttp.NewPeerHandler(m.s.Cluster, m.s.RaftHandler())}
 
 	for _, ln := range m.PeerListeners {
 		hs := &httptest.Server{