mirror of
https://github.com/etcd-io/etcd.git
synced 2024-09-27 06:25:44 +00:00
rafthttp: add transport tests
This commit is contained in:
parent
399e3cdf81
commit
9d445d2fcf
@ -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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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"})
|
||||||
|
Loading…
x
Reference in New Issue
Block a user