Skip to content

Commit 8629463

Browse files
committed
[FAB-3899] Improve test coverage - events
This CR improves the test coverage for the events/producer package from 15% to around 85% and the events package from not counted to 70%. Change-Id: Ifb0c9207f936c1bf5d845616405b4e8134579655 Signed-off-by: Will Lahti <[email protected]>
1 parent fd026e9 commit 8629463

File tree

5 files changed

+592
-14
lines changed

5 files changed

+592
-14
lines changed

events/consumer/consumer.go

+28-4
Original file line numberDiff line numberDiff line change
@@ -90,8 +90,12 @@ func (ec *EventsClient) send(emsg *ehpb.Event) error {
9090

9191
// RegisterAsync - registers interest in a event and doesn't wait for a response
9292
func (ec *EventsClient) RegisterAsync(ies []*ehpb.Interest) error {
93-
emsg := &ehpb.Event{Event: &ehpb.Event_Register{Register: &ehpb.Register{Events: ies}}}
94-
var err error
93+
creator, err := getCreatorFromLocalMSP()
94+
if err != nil {
95+
return fmt.Errorf("error getting creator from MSP: %s", err)
96+
}
97+
emsg := &ehpb.Event{Event: &ehpb.Event_Register{Register: &ehpb.Register{Events: ies}}, Creator: creator}
98+
9599
if err = ec.send(emsg); err != nil {
96100
consumerLogger.Errorf("error on Register send %s\n", err)
97101
}
@@ -131,8 +135,12 @@ func (ec *EventsClient) register(ies []*ehpb.Interest) error {
131135

132136
// UnregisterAsync - Unregisters interest in a event and doesn't wait for a response
133137
func (ec *EventsClient) UnregisterAsync(ies []*ehpb.Interest) error {
134-
emsg := &ehpb.Event{Event: &ehpb.Event_Unregister{Unregister: &ehpb.Unregister{Events: ies}}}
135-
var err error
138+
creator, err := getCreatorFromLocalMSP()
139+
if err != nil {
140+
return fmt.Errorf("error getting creator from MSP: %s", err)
141+
}
142+
emsg := &ehpb.Event{Event: &ehpb.Event_Unregister{Unregister: &ehpb.Unregister{Events: ies}}, Creator: creator}
143+
136144
if err = ec.send(emsg); err != nil {
137145
err = fmt.Errorf("error on unregister send %s\n", err)
138146
}
@@ -223,3 +231,19 @@ func (ec *EventsClient) Stop() error {
223231
}
224232
return ec.stream.CloseSend()
225233
}
234+
235+
func getCreatorFromLocalMSP() ([]byte, error) {
236+
localMsp := mspmgmt.GetLocalMSP()
237+
if localMsp == nil {
238+
return nil, errors.New("nil local MSP manager")
239+
}
240+
signer, err := localMsp.GetDefaultSigningIdentity()
241+
if err != nil {
242+
return nil, fmt.Errorf("could not obtain the default signing identity, err %s", err)
243+
}
244+
creator, err := signer.Serialize()
245+
if err != nil {
246+
return nil, fmt.Errorf("error serializing the signer: %s", err)
247+
}
248+
return creator, nil
249+
}

events/events_test.go

+11-3
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import (
2828
"github.com/hyperledger/fabric/core/config"
2929
"github.com/hyperledger/fabric/events/consumer"
3030
"github.com/hyperledger/fabric/events/producer"
31+
"github.com/hyperledger/fabric/msp/mgmt/testtools"
3132
"github.com/hyperledger/fabric/protos/common"
3233
ehpb "github.com/hyperledger/fabric/protos/peer"
3334
"github.com/hyperledger/fabric/protos/utils"
@@ -165,7 +166,7 @@ func TestReceiveMessage(t *testing.T) {
165166
case <-adapter.notfy:
166167
case <-time.After(2 * time.Second):
167168
t.Fail()
168-
t.Logf("timed out on messge")
169+
t.Logf("timed out on message")
169170
}
170171
}
171172
func TestReceiveAnyMessage(t *testing.T) {
@@ -190,7 +191,7 @@ func TestReceiveAnyMessage(t *testing.T) {
190191
case <-adapter.notfy:
191192
case <-time.After(5 * time.Second):
192193
t.Fail()
193-
t.Logf("timed out on messge")
194+
t.Logf("timed out on message")
194195
}
195196
}
196197
}
@@ -327,6 +328,14 @@ func BenchmarkMessages(b *testing.B) {
327328
}
328329

329330
func TestMain(m *testing.M) {
331+
// setup crypto algorithms
332+
// setup the MSP manager so that we can sign/verify
333+
err := msptesttools.LoadMSPSetupForTesting()
334+
if err != nil {
335+
fmt.Printf("Could not initialize msp, err %s", err)
336+
os.Exit(-1)
337+
return
338+
}
330339
SetupTestConfig()
331340
var opts []grpc.ServerOption
332341
if viper.GetBool("peer.tls.enabled") {
@@ -353,7 +362,6 @@ func TestMain(m *testing.M) {
353362
ehServer := producer.NewEventsServer(100, 0)
354363
ehpb.RegisterEventsServer(grpcServer, ehServer)
355364

356-
fmt.Printf("Starting events server\n")
357365
go grpcServer.Serve(lis)
358366

359367
var regTimeout = 5 * time.Second

events/producer/events.go

+2-3
Original file line numberDiff line numberDiff line change
@@ -272,8 +272,7 @@ func AddEventType(eventType pb.EventType) error {
272272
}
273273

274274
func registerHandler(ie *pb.Interest, h *handler) error {
275-
logger.Debugf("registerHandler %s", ie.EventType)
276-
275+
logger.Debugf("registering event type: %s", ie.EventType)
277276
gEventProcessor.Lock()
278277
defer gEventProcessor.Unlock()
279278
if hl, ok := gEventProcessor.eventConsumers[ie.EventType]; !ok {
@@ -286,7 +285,7 @@ func registerHandler(ie *pb.Interest, h *handler) error {
286285
}
287286

288287
func deRegisterHandler(ie *pb.Interest, h *handler) error {
289-
logger.Debugf("deRegisterHandler %s", ie.EventType)
288+
logger.Debugf("deregistering event type: %s", ie.EventType)
290289

291290
gEventProcessor.Lock()
292291
defer gEventProcessor.Unlock()

events/producer/events_test.go

+166
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,166 @@
1+
/*
2+
Copyright IBM Corp. 2017 All Rights Reserved.
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
package producer
18+
19+
import (
20+
"context"
21+
"io"
22+
"testing"
23+
"time"
24+
25+
"github.com/hyperledger/fabric/core/comm"
26+
"github.com/hyperledger/fabric/protos/peer"
27+
ehpb "github.com/hyperledger/fabric/protos/peer"
28+
"github.com/hyperledger/fabric/protos/utils"
29+
"github.com/spf13/viper"
30+
"github.com/stretchr/testify/assert"
31+
"google.golang.org/grpc"
32+
)
33+
34+
var peerAddress = "0.0.0.0:60303"
35+
36+
type client struct {
37+
conn *grpc.ClientConn
38+
stream peer.Events_ChatClient
39+
}
40+
41+
func newClient() *client {
42+
conn, err := comm.NewClientConnectionWithAddress(peerAddress, true, false, nil)
43+
if err != nil {
44+
panic(err)
45+
}
46+
47+
stream, err := peer.NewEventsClient(conn).Chat(context.Background())
48+
if err != nil {
49+
panic(err)
50+
}
51+
52+
cl := &client{
53+
conn: conn,
54+
stream: stream,
55+
}
56+
go cl.processEvents()
57+
return cl
58+
}
59+
60+
func (c *client) register(ies []*peer.Interest) error {
61+
emsg := &peer.Event{Event: &peer.Event_Register{Register: &peer.Register{Events: ies}}, Creator: signerSerialized}
62+
se, err := utils.GetSignedEvent(emsg, signer)
63+
if err != nil {
64+
return err
65+
}
66+
return c.stream.Send(se)
67+
}
68+
69+
func (c *client) unregister(ies []*peer.Interest) error {
70+
emsg := &peer.Event{Event: &peer.Event_Unregister{Unregister: &peer.Unregister{Events: ies}}, Creator: signerSerialized}
71+
se, err := utils.GetSignedEvent(emsg, signer)
72+
if err != nil {
73+
return err
74+
}
75+
return c.stream.Send(se)
76+
}
77+
78+
func (c *client) processEvents() error {
79+
defer c.stream.CloseSend()
80+
for {
81+
_, err := c.stream.Recv()
82+
if err == io.EOF {
83+
return nil
84+
}
85+
if err != nil {
86+
return err
87+
}
88+
}
89+
}
90+
91+
func TestEvents(t *testing.T) {
92+
test := func(duration time.Duration) {
93+
t.Log(duration)
94+
f := func() {
95+
Send(nil)
96+
}
97+
assert.Panics(t, f)
98+
Send(&peer.Event{})
99+
gEventProcessorBck := gEventProcessor
100+
gEventProcessor = nil
101+
e, err := createEvent()
102+
assert.NoError(t, err)
103+
Send(e)
104+
gEventProcessor = gEventProcessorBck
105+
Send(e)
106+
}
107+
for _, timeout := range []time.Duration{0, -1, 1} {
108+
gEventProcessor.timeout = timeout
109+
test(timeout)
110+
}
111+
}
112+
113+
func TestDeRegister(t *testing.T) {
114+
f := func() {
115+
deRegisterHandler(nil, nil)
116+
}
117+
assert.Panics(t, f)
118+
assert.Error(t, deRegisterHandler(&peer.Interest{EventType: 100}, nil))
119+
assert.Error(t, deRegisterHandler(&peer.Interest{EventType: peer.EventType_BLOCK}, nil))
120+
}
121+
122+
func TestRegister(t *testing.T) {
123+
f := func() {
124+
registerHandler(nil, nil)
125+
}
126+
assert.Panics(t, f)
127+
128+
// attempt to register handlers (invalid type or nil handlers)
129+
assert.Error(t, registerHandler(&peer.Interest{EventType: 100}, nil))
130+
131+
// attempt to register valid handler
132+
recvChan := make(chan *streamEvent)
133+
stream := &mockstream{c: recvChan}
134+
handler, err := newEventHandler(stream)
135+
assert.Nil(t, err, "error should have been nil")
136+
assert.NoError(t, registerHandler(&peer.Interest{EventType: peer.EventType_BLOCK}, handler))
137+
}
138+
139+
func TestProcessEvents(t *testing.T) {
140+
cl := newClient()
141+
interests := []*peer.Interest{
142+
{EventType: peer.EventType_BLOCK},
143+
{EventType: peer.EventType_CHAINCODE, RegInfo: &peer.Interest_ChaincodeRegInfo{ChaincodeRegInfo: &peer.ChaincodeReg{ChaincodeId: "0xffffffff", EventName: "event1"}}},
144+
{EventType: peer.EventType_CHAINCODE, RegInfo: &peer.Interest_ChaincodeRegInfo{ChaincodeRegInfo: &peer.ChaincodeReg{ChaincodeId: "0xffffffff", EventName: "event2"}}},
145+
}
146+
cl.register(interests)
147+
e, err := createEvent()
148+
assert.NoError(t, err)
149+
go Send(e)
150+
time.Sleep(time.Second * 2)
151+
cl.unregister(interests)
152+
time.Sleep(time.Second * 2)
153+
}
154+
155+
func TestInitializeEvents_twice(t *testing.T) {
156+
initializeEventsTwice := func() {
157+
initializeEvents(
158+
uint(viper.GetInt("peer.events.buffersize")),
159+
viper.GetDuration("peer.events.timeout"))
160+
}
161+
assert.Panics(t, initializeEventsTwice)
162+
}
163+
164+
func TestAddEventType_alreadyDefined(t *testing.T) {
165+
assert.Error(t, AddEventType(ehpb.EventType_CHAINCODE), "chaincode type already defined")
166+
}

0 commit comments

Comments
 (0)