From dc6aef0d021165be9bce746df2d4c311e71b6d33 Mon Sep 17 00:00:00 2001 From: Yicheng Qin Date: Sat, 10 Jan 2015 21:33:32 -0800 Subject: [PATCH] etcdhttp: add NewPeerHandler test --- etcdmain/etcd.go | 2 +- etcdserver/etcdhttp/peer.go | 8 ++++---- etcdserver/etcdhttp/peer_test.go | 31 +++++++++++++++++++++++++++++++ integration/cluster_test.go | 2 +- 4 files changed, 37 insertions(+), 6 deletions(-) diff --git a/etcdmain/etcd.go b/etcdmain/etcd.go index 685cbfd05..56413bfa0 100644 --- a/etcdmain/etcd.go +++ b/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) { diff --git a/etcdserver/etcdhttp/peer.go b/etcdserver/etcdhttp/peer.go index 4481ab113..ef168ab2f 100644 --- a/etcdserver/etcdhttp/peer.go +++ b/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 } diff --git a/etcdserver/etcdhttp/peer_test.go b/etcdserver/etcdhttp/peer_test.go index 29e8b0dc1..6280b7067 100644 --- a/etcdserver/etcdhttp/peer_test.go +++ b/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 diff --git a/integration/cluster_test.go b/integration/cluster_test.go index cacd55621..0af1b970f 100644 --- a/integration/cluster_test.go +++ b/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{