rafthttp: add transport tests

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

View File

@ -16,6 +16,7 @@ package rafthttp
import ( import (
"net/http" "net/http"
"reflect"
"testing" "testing"
"time" "time"
@ -25,12 +26,51 @@ import (
"github.com/coreos/etcd/raft/raftpb" "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) { func TestTransportAdd(t *testing.T) {
ls := stats.NewLeaderStats("") ls := stats.NewLeaderStats("")
tr := &transport{ tr := &transport{
roundTripper: &roundTripperRecorder{}, roundTripper: &roundTripperRecorder{},
leaderStats: ls, leaderStats: ls,
peers: make(map[types.ID]*peer), peers: make(map[types.ID]Peer),
} }
tr.AddPeer(1, []string{"http://a"}) tr.AddPeer(1, []string{"http://a"})
defer tr.Stop() defer tr.Stop()
@ -55,7 +95,7 @@ func TestTransportRemove(t *testing.T) {
tr := &transport{ tr := &transport{
roundTripper: &roundTripperRecorder{}, roundTripper: &roundTripperRecorder{},
leaderStats: stats.NewLeaderStats(""), leaderStats: stats.NewLeaderStats(""),
peers: make(map[types.ID]*peer), peers: make(map[types.ID]Peer),
} }
tr.AddPeer(1, []string{"http://a"}) tr.AddPeer(1, []string{"http://a"})
tr.RemovePeer(types.ID(1)) 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) { func TestTransportErrorc(t *testing.T) {
errorc := make(chan error, 1) errorc := make(chan error, 1)
tr := &transport{ tr := &transport{
roundTripper: newRespRoundTripper(http.StatusForbidden, nil), roundTripper: newRespRoundTripper(http.StatusForbidden, nil),
leaderStats: stats.NewLeaderStats(""), leaderStats: stats.NewLeaderStats(""),
peers: make(map[types.ID]*peer), peers: make(map[types.ID]Peer),
errorc: errorc, errorc: errorc,
} }
tr.AddPeer(1, []string{"http://a"}) tr.AddPeer(1, []string{"http://a"})