parent
231c5e8d1e
commit
857d24ced8
@ -0,0 +1,22 @@ |
||||
package p2p |
||||
|
||||
import "testing" |
||||
|
||||
func TestGroupID_String(t *testing.T) { |
||||
tests := []struct { |
||||
name string |
||||
id GroupID |
||||
want string |
||||
}{ |
||||
{"empty", GroupID(""), ""}, |
||||
{"ABC", GroupID("ABC"), "414243"}, |
||||
{"binary", GroupID([]byte{1, 2, 3}), "010203"}, |
||||
} |
||||
for _, tt := range tests { |
||||
t.Run(tt.name, func(t *testing.T) { |
||||
if got := tt.id.String(); got != tt.want { |
||||
t.Errorf("GroupID.String() = %v, want %v", got, tt.want) |
||||
} |
||||
}) |
||||
} |
||||
} |
@ -0,0 +1,132 @@ |
||||
package hostv2 |
||||
|
||||
//go:generate mockgen -source hostv2.go -destination=mock/hostv2_mock.go
|
||||
|
||||
import ( |
||||
"context" |
||||
"errors" |
||||
"reflect" |
||||
"testing" |
||||
|
||||
"github.com/golang/mock/gomock" |
||||
"github.com/harmony-one/harmony/p2p" |
||||
mock "github.com/harmony-one/harmony/p2p/host/hostv2/mock" |
||||
peer "github.com/libp2p/go-libp2p-peer" |
||||
libp2p_pubsub "github.com/libp2p/go-libp2p-pubsub" |
||||
libp2p_pubsub_pb "github.com/libp2p/go-libp2p-pubsub/pb" |
||||
) |
||||
|
||||
func TestHostV2_SendMessageToGroups(t *testing.T) { |
||||
t.Run("Basic", func(t *testing.T) { |
||||
mc := gomock.NewController(t) |
||||
defer mc.Finish() |
||||
groups := []p2p.GroupID{"ABC", "DEF"} |
||||
data := []byte{1, 2, 3} |
||||
pubsub := mock.NewMockPubSub(mc) |
||||
gomock.InOrder( |
||||
pubsub.EXPECT().Publish("ABC", data), |
||||
pubsub.EXPECT().Publish("DEF", data), |
||||
) |
||||
host := &HostV2{pubsub: pubsub} |
||||
if err := host.SendMessageToGroups(groups, data); err != nil { |
||||
t.Errorf("expected no error; got %v", err) |
||||
} |
||||
}) |
||||
t.Run("Error", func(t *testing.T) { |
||||
mc := gomock.NewController(t) |
||||
defer mc.Finish() |
||||
groups := []p2p.GroupID{"ABC", "DEF"} |
||||
data := []byte{1, 2, 3} |
||||
pubsub := mock.NewMockPubSub(mc) |
||||
gomock.InOrder( |
||||
pubsub.EXPECT().Publish("ABC", data).Return(errors.New("FIAL")), |
||||
pubsub.EXPECT().Publish("DEF", data), // Should not early-return
|
||||
) |
||||
host := &HostV2{pubsub: pubsub} |
||||
if err := host.SendMessageToGroups(groups, data); err == nil { |
||||
t.Error("expected an error but got none") |
||||
} |
||||
}) |
||||
} |
||||
|
||||
func TestGroupReceiver_Close(t *testing.T) { |
||||
mc := gomock.NewController(t) |
||||
defer mc.Finish() |
||||
sub := mock.NewMockSubscription(mc) |
||||
sub.EXPECT().Cancel() |
||||
receiver := GroupReceiver{sub: sub} |
||||
if err := receiver.Close(); err != nil { |
||||
t.Errorf("expected no error but got %v", err) |
||||
} |
||||
} |
||||
|
||||
func pubsubMessage(from peer.ID, data []byte) *libp2p_pubsub.Message { |
||||
m := libp2p_pubsub_pb.Message{From: []byte(from), Data: data} |
||||
return &libp2p_pubsub.Message{Message: &m} |
||||
} |
||||
|
||||
func TestGroupReceiver_Receive(t *testing.T) { |
||||
mc := gomock.NewController(t) |
||||
defer mc.Finish() |
||||
sub := mock.NewMockSubscription(mc) |
||||
ctx, _ := context.WithCancel(context.Background()) |
||||
gomock.InOrder( |
||||
sub.EXPECT().Next(ctx).Return(pubsubMessage("ABC", []byte{1, 2, 3}), nil), |
||||
sub.EXPECT().Next(ctx).Return(pubsubMessage("DEF", []byte{4, 5, 6}), nil), |
||||
sub.EXPECT().Next(ctx).Return(nil, errors.New("FIAL")), |
||||
) |
||||
receiver := GroupReceiver{sub: sub} |
||||
verify := func(sender peer.ID, msg []byte, shouldError bool) { |
||||
gotMsg, gotSender, err := receiver.Receive(ctx) |
||||
if (err != nil) != shouldError { |
||||
if shouldError { |
||||
t.Error("expected an error but got none") |
||||
} else { |
||||
t.Errorf("expected no error but got %v", err) |
||||
} |
||||
} |
||||
if gotSender != sender { |
||||
t.Errorf("expected sender %v but got %v", sender, gotSender) |
||||
} |
||||
if !reflect.DeepEqual(gotMsg, msg) { |
||||
t.Errorf("expected message %v but got %v", msg, gotMsg) |
||||
} |
||||
} |
||||
verify("ABC", []byte{1, 2, 3}, false) |
||||
verify("DEF", []byte{4, 5, 6}, false) |
||||
verify("", nil, true) |
||||
} |
||||
|
||||
func TestHostV2_GroupReceiver(t *testing.T) { |
||||
t.Run("Basic", func(t *testing.T) { |
||||
mc := gomock.NewController(t) |
||||
defer mc.Finish() |
||||
sub := &libp2p_pubsub.Subscription{} |
||||
pubsub := mock.NewMockPubSub(mc) |
||||
pubsub.EXPECT().Subscribe("ABC").Return(sub, nil) |
||||
host := &HostV2{pubsub: pubsub} |
||||
gotReceiver, err := host.GroupReceiver("ABC") |
||||
if r, ok := gotReceiver.(*GroupReceiver); !ok { |
||||
t.Errorf("expected a hostv2 GroupReceiver; got %v", gotReceiver) |
||||
} else if r.sub != sub { |
||||
t.Errorf("unexpected subscriber %v", r.sub) |
||||
} |
||||
if err != nil { |
||||
t.Errorf("expected no error; got %v", err) |
||||
} |
||||
}) |
||||
t.Run("Error", func(t *testing.T) { |
||||
mc := gomock.NewController(t) |
||||
defer mc.Finish() |
||||
pubsub := mock.NewMockPubSub(mc) |
||||
pubsub.EXPECT().Subscribe("ABC").Return(nil, errors.New("FIAL")) |
||||
host := &HostV2{pubsub: pubsub} |
||||
gotReceiver, err := host.GroupReceiver("ABC") |
||||
if gotReceiver != nil { |
||||
t.Errorf("expected a nil hostv2 GroupReceiver; got %v", gotReceiver) |
||||
} |
||||
if err == nil { |
||||
t.Error("expected an error; got none") |
||||
} |
||||
}) |
||||
} |
@ -0,0 +1,111 @@ |
||||
// Code generated by MockGen. DO NOT EDIT.
|
||||
// Source: hostv2.go
|
||||
|
||||
// Package mock_hostv2 is a generated GoMock package.
|
||||
package mock_hostv2 |
||||
|
||||
import ( |
||||
context "context" |
||||
gomock "github.com/golang/mock/gomock" |
||||
go_libp2p_pubsub "github.com/libp2p/go-libp2p-pubsub" |
||||
reflect "reflect" |
||||
) |
||||
|
||||
// MockPubSub is a mock of PubSub interface
|
||||
type MockPubSub struct { |
||||
ctrl *gomock.Controller |
||||
recorder *MockPubSubMockRecorder |
||||
} |
||||
|
||||
// MockPubSubMockRecorder is the mock recorder for MockPubSub
|
||||
type MockPubSubMockRecorder struct { |
||||
mock *MockPubSub |
||||
} |
||||
|
||||
// NewMockPubSub creates a new mock instance
|
||||
func NewMockPubSub(ctrl *gomock.Controller) *MockPubSub { |
||||
mock := &MockPubSub{ctrl: ctrl} |
||||
mock.recorder = &MockPubSubMockRecorder{mock} |
||||
return mock |
||||
} |
||||
|
||||
// EXPECT returns an object that allows the caller to indicate expected use
|
||||
func (m *MockPubSub) EXPECT() *MockPubSubMockRecorder { |
||||
return m.recorder |
||||
} |
||||
|
||||
// Publish mocks base method
|
||||
func (m *MockPubSub) Publish(topic string, data []byte) error { |
||||
ret := m.ctrl.Call(m, "Publish", topic, data) |
||||
ret0, _ := ret[0].(error) |
||||
return ret0 |
||||
} |
||||
|
||||
// Publish indicates an expected call of Publish
|
||||
func (mr *MockPubSubMockRecorder) Publish(topic, data interface{}) *gomock.Call { |
||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Publish", reflect.TypeOf((*MockPubSub)(nil).Publish), topic, data) |
||||
} |
||||
|
||||
// Subscribe mocks base method
|
||||
func (m *MockPubSub) Subscribe(topic string, opts ...go_libp2p_pubsub.SubOpt) (*go_libp2p_pubsub.Subscription, error) { |
||||
varargs := []interface{}{topic} |
||||
for _, a := range opts { |
||||
varargs = append(varargs, a) |
||||
} |
||||
ret := m.ctrl.Call(m, "Subscribe", varargs...) |
||||
ret0, _ := ret[0].(*go_libp2p_pubsub.Subscription) |
||||
ret1, _ := ret[1].(error) |
||||
return ret0, ret1 |
||||
} |
||||
|
||||
// Subscribe indicates an expected call of Subscribe
|
||||
func (mr *MockPubSubMockRecorder) Subscribe(topic interface{}, opts ...interface{}) *gomock.Call { |
||||
varargs := append([]interface{}{topic}, opts...) |
||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Subscribe", reflect.TypeOf((*MockPubSub)(nil).Subscribe), varargs...) |
||||
} |
||||
|
||||
// MockSubscription is a mock of Subscription interface
|
||||
type MockSubscription struct { |
||||
ctrl *gomock.Controller |
||||
recorder *MockSubscriptionMockRecorder |
||||
} |
||||
|
||||
// MockSubscriptionMockRecorder is the mock recorder for MockSubscription
|
||||
type MockSubscriptionMockRecorder struct { |
||||
mock *MockSubscription |
||||
} |
||||
|
||||
// NewMockSubscription creates a new mock instance
|
||||
func NewMockSubscription(ctrl *gomock.Controller) *MockSubscription { |
||||
mock := &MockSubscription{ctrl: ctrl} |
||||
mock.recorder = &MockSubscriptionMockRecorder{mock} |
||||
return mock |
||||
} |
||||
|
||||
// EXPECT returns an object that allows the caller to indicate expected use
|
||||
func (m *MockSubscription) EXPECT() *MockSubscriptionMockRecorder { |
||||
return m.recorder |
||||
} |
||||
|
||||
// Next mocks base method
|
||||
func (m *MockSubscription) Next(ctx context.Context) (*go_libp2p_pubsub.Message, error) { |
||||
ret := m.ctrl.Call(m, "Next", ctx) |
||||
ret0, _ := ret[0].(*go_libp2p_pubsub.Message) |
||||
ret1, _ := ret[1].(error) |
||||
return ret0, ret1 |
||||
} |
||||
|
||||
// Next indicates an expected call of Next
|
||||
func (mr *MockSubscriptionMockRecorder) Next(ctx interface{}) *gomock.Call { |
||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Next", reflect.TypeOf((*MockSubscription)(nil).Next), ctx) |
||||
} |
||||
|
||||
// Cancel mocks base method
|
||||
func (m *MockSubscription) Cancel() { |
||||
m.ctrl.Call(m, "Cancel") |
||||
} |
||||
|
||||
// Cancel indicates an expected call of Cancel
|
||||
func (mr *MockSubscriptionMockRecorder) Cancel() *gomock.Call { |
||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Cancel", reflect.TypeOf((*MockSubscription)(nil).Cancel)) |
||||
} |
Loading…
Reference in new issue