rafthttp: add transport tests

release-2.1
Yicheng Qin 2015-02-26 00:13:35 -08:00
parent 399e3cdf81
commit 9d445d2fcf
2 changed files with 60 additions and 8 deletions

View File

@ -52,8 +52,8 @@ type transport struct {
serverStats *stats.ServerStats
leaderStats *stats.LeaderStats
mu sync.RWMutex // protect the peer map
peers map[types.ID]*peer // remote peers
mu sync.RWMutex // protect the peer map
peers map[types.ID]Peer // remote peers
errorc chan error
}
@ -65,7 +65,7 @@ func NewTransporter(rt http.RoundTripper, id, cid types.ID, r Raft, errorc chan
raft: r,
serverStats: ss,
leaderStats: ls,
peers: make(map[types.ID]*peer),
peers: make(map[types.ID]Peer),
errorc: errorc,
}
}
@ -181,12 +181,12 @@ type Pausable interface {
// for testing
func (t *transport) Pause() {
for _, p := range t.peers {
p.Pause()
p.(Pausable).Pause()
}
}
func (t *transport) Resume() {
for _, p := range t.peers {
p.Resume()
p.(Pausable).Resume()
}
}

View File

@ -16,6 +16,7 @@ package rafthttp
import (
"net/http"
"reflect"
"testing"
"time"
@ -25,12 +26,51 @@ import (
"github.com/coreos/etcd/raft/raftpb"
)
// TestTransportSend tests that transport can send messages using correct
// underlying peer, and drop local or unknown-target messages.
func TestTransportSend(t *testing.T) {
ss := &stats.ServerStats{}
ss.Initialize()
peer1 := newFakePeer()
peer2 := newFakePeer()
tr := &transport{
serverStats: ss,
peers: map[types.ID]Peer{types.ID(1): peer1, types.ID(2): peer2},
}
wmsgsIgnored := []raftpb.Message{
// bad local message
{Type: raftpb.MsgBeat},
// bad remote message
{Type: raftpb.MsgProp, To: 3},
}
wmsgsTo1 := []raftpb.Message{
// good message
{Type: raftpb.MsgProp, To: 1},
{Type: raftpb.MsgApp, To: 1},
}
wmsgsTo2 := []raftpb.Message{
// good message
{Type: raftpb.MsgProp, To: 2},
{Type: raftpb.MsgApp, To: 2},
}
tr.Send(wmsgsIgnored)
tr.Send(wmsgsTo1)
tr.Send(wmsgsTo2)
if !reflect.DeepEqual(peer1.msgs, wmsgsTo1) {
t.Errorf("msgs to peer 1 = %+v, want %+v", peer1.msgs, wmsgsTo1)
}
if !reflect.DeepEqual(peer2.msgs, wmsgsTo2) {
t.Errorf("msgs to peer 2 = %+v, want %+v", peer2.msgs, wmsgsTo2)
}
}
func TestTransportAdd(t *testing.T) {
ls := stats.NewLeaderStats("")
tr := &transport{
roundTripper: &roundTripperRecorder{},
leaderStats: ls,
peers: make(map[types.ID]*peer),
peers: make(map[types.ID]Peer),
}
tr.AddPeer(1, []string{"http://a"})
defer tr.Stop()
@ -55,7 +95,7 @@ func TestTransportRemove(t *testing.T) {
tr := &transport{
roundTripper: &roundTripperRecorder{},
leaderStats: stats.NewLeaderStats(""),
peers: make(map[types.ID]*peer),
peers: make(map[types.ID]Peer),
}
tr.AddPeer(1, []string{"http://a"})
tr.RemovePeer(types.ID(1))
@ -66,12 +106,24 @@ func TestTransportRemove(t *testing.T) {
}
}
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})
if w := "http://localhost:7001/raft"; peer.u != w {
t.Errorf("url = %s, want %s", peer.u, w)
}
}
func TestTransportErrorc(t *testing.T) {
errorc := make(chan error, 1)
tr := &transport{
roundTripper: newRespRoundTripper(http.StatusForbidden, nil),
leaderStats: stats.NewLeaderStats(""),
peers: make(map[types.ID]*peer),
peers: make(map[types.ID]Peer),
errorc: errorc,
}
tr.AddPeer(1, []string{"http://a"})