Skip to content

Commit 59fe5a6

Browse files
author
Nao Nishijima
committed
[FAB-4046] UT improvements in events/consumer
This patch adds a UT test for events/consumer. The coverage is 69.4%. Change-Id: I870d4eea56b76b6e897610d000dd73e04930467b Signed-off-by: Nao Nishijima <[email protected]>
1 parent 1ee6eed commit 59fe5a6

File tree

1 file changed

+276
-0
lines changed

1 file changed

+276
-0
lines changed

events/consumer/consumer_test.go

+276
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,276 @@
1+
/*
2+
Copyright Hitachi America, Ltd. All Rights Reserved.
3+
4+
SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
package consumer
8+
9+
import (
10+
"fmt"
11+
"net"
12+
"os"
13+
"sync"
14+
"testing"
15+
"time"
16+
17+
coreutil "github.com/hyperledger/fabric/core/testutil"
18+
"github.com/hyperledger/fabric/events/producer"
19+
"github.com/hyperledger/fabric/msp/mgmt/testtools"
20+
ehpb "github.com/hyperledger/fabric/protos/peer"
21+
"github.com/spf13/viper"
22+
"github.com/stretchr/testify/assert"
23+
"google.golang.org/grpc"
24+
)
25+
26+
type MockAdapter struct {
27+
sync.RWMutex
28+
notify chan struct{}
29+
count int
30+
}
31+
32+
type ZeroAdapter struct {
33+
sync.RWMutex
34+
notify chan struct{}
35+
count int
36+
}
37+
38+
type BadAdapter struct {
39+
sync.RWMutex
40+
notify chan struct{}
41+
count int
42+
}
43+
44+
var peerAddress = "0.0.0.0:7303"
45+
var ehServer *producer.EventsServer
46+
var ies = []*ehpb.Interest{{EventType: ehpb.EventType_CHAINCODE, RegInfo: &ehpb.Interest_ChaincodeRegInfo{ChaincodeRegInfo: &ehpb.ChaincodeReg{ChaincodeId: "0xffffffff", EventName: "event1"}}}}
47+
48+
var adapter *MockAdapter
49+
var obcEHClient *EventsClient
50+
51+
var zeroAdapter *ZeroAdapter
52+
var zeroObcEHClient *EventsClient
53+
54+
var badAdapter *BadAdapter
55+
var badObcEHClient *EventsClient
56+
57+
func (a *ZeroAdapter) GetInterestedEvents() ([]*ehpb.Interest, error) {
58+
return []*ehpb.Interest{}, nil
59+
}
60+
func (a *ZeroAdapter) Recv(msg *ehpb.Event) (bool, error) {
61+
panic("not implemented")
62+
}
63+
func (a *ZeroAdapter) Disconnected(err error) {
64+
panic("not implemented")
65+
}
66+
67+
func (a *BadAdapter) GetInterestedEvents() ([]*ehpb.Interest, error) {
68+
return []*ehpb.Interest{}, fmt.Errorf("Error")
69+
}
70+
func (a *BadAdapter) Recv(msg *ehpb.Event) (bool, error) {
71+
panic("not implemented")
72+
}
73+
func (a *BadAdapter) Disconnected(err error) {
74+
panic("not implemented")
75+
}
76+
77+
func (a *MockAdapter) GetInterestedEvents() ([]*ehpb.Interest, error) {
78+
return []*ehpb.Interest{
79+
&ehpb.Interest{EventType: ehpb.EventType_BLOCK},
80+
}, nil
81+
}
82+
83+
func (a *MockAdapter) Recv(msg *ehpb.Event) (bool, error) {
84+
return true, nil
85+
}
86+
87+
func (a *MockAdapter) Disconnected(err error) {}
88+
89+
func TestNewEventsClient(t *testing.T) {
90+
var cases = []struct {
91+
name string
92+
time int
93+
expected bool
94+
}{
95+
{
96+
name: "success",
97+
time: 5,
98+
expected: true,
99+
},
100+
{
101+
name: "fail. regTimout < 100ms",
102+
time: 0,
103+
expected: false,
104+
},
105+
{
106+
name: "fail. regTimeout > 60s",
107+
time: 61,
108+
expected: false,
109+
},
110+
}
111+
112+
for _, test := range cases {
113+
t.Run(test.name, func(t *testing.T) {
114+
t.Logf("Running test: %s", test.name)
115+
var regTimeout = time.Duration(test.time) * time.Second
116+
done := make(chan struct{})
117+
adapter = &MockAdapter{notify: done}
118+
119+
_, err := NewEventsClient(peerAddress, regTimeout, adapter)
120+
if test.expected {
121+
assert.NoError(t, err)
122+
} else {
123+
assert.Error(t, err)
124+
}
125+
})
126+
}
127+
}
128+
129+
func TestNewEventsClientConnectionWithAddress(t *testing.T) {
130+
var cases = []struct {
131+
name string
132+
address string
133+
expected bool
134+
}{
135+
{
136+
name: "success",
137+
address: peerAddress,
138+
expected: true,
139+
},
140+
{
141+
name: "fail",
142+
address: "",
143+
expected: false,
144+
},
145+
}
146+
147+
for _, test := range cases {
148+
t.Run(test.name, func(t *testing.T) {
149+
t.Logf("Running test: %s", test.name)
150+
_, err := newEventsClientConnectionWithAddress(test.address)
151+
if test.expected {
152+
assert.NoError(t, err)
153+
} else {
154+
assert.Error(t, err)
155+
}
156+
})
157+
}
158+
}
159+
160+
func TestUnregisterAsync(t *testing.T) {
161+
var err error
162+
done := make(chan struct{})
163+
adapter := &MockAdapter{notify: done}
164+
165+
obcEHClient, _ = NewEventsClient(peerAddress, 5, adapter)
166+
167+
if err = obcEHClient.Start(); err != nil {
168+
obcEHClient.Stop()
169+
t.Fail()
170+
}
171+
172+
obcEHClient.RegisterAsync(ies)
173+
err = obcEHClient.UnregisterAsync(ies)
174+
assert.NoError(t, err)
175+
176+
obcEHClient.Stop()
177+
178+
}
179+
180+
func TestStart(t *testing.T) {
181+
var err error
182+
var regTimeout = 5 * time.Second
183+
done := make(chan struct{})
184+
185+
var cases = []struct {
186+
name string
187+
address string
188+
adapter EventAdapter
189+
expected bool
190+
}{
191+
{
192+
name: "success",
193+
address: peerAddress,
194+
adapter: &MockAdapter{notify: done},
195+
expected: true,
196+
},
197+
{
198+
name: "fail no peerAddress",
199+
address: "",
200+
adapter: &MockAdapter{notify: done},
201+
expected: false,
202+
},
203+
{
204+
name: "fail bad adapter",
205+
address: peerAddress,
206+
adapter: &BadAdapter{notify: done},
207+
expected: false,
208+
},
209+
{
210+
name: "fail zero adapter",
211+
address: peerAddress,
212+
adapter: &ZeroAdapter{notify: done},
213+
expected: false,
214+
},
215+
}
216+
217+
for _, test := range cases {
218+
t.Run(test.name, func(t *testing.T) {
219+
t.Logf("Running test: %s", test.name)
220+
obcEHClient, _ = NewEventsClient(test.address, regTimeout, test.adapter)
221+
err = obcEHClient.Start()
222+
if test.expected {
223+
assert.NoError(t, err)
224+
} else {
225+
assert.Error(t, err)
226+
}
227+
obcEHClient.Stop()
228+
})
229+
}
230+
}
231+
232+
func TestStop(t *testing.T) {
233+
var err error
234+
var regTimeout = 5 * time.Second
235+
done := make(chan struct{})
236+
adapter := &MockAdapter{notify: done}
237+
238+
obcEHClient, _ = NewEventsClient(peerAddress, regTimeout, adapter)
239+
240+
if err = obcEHClient.Start(); err != nil {
241+
t.Fail()
242+
t.Logf("Error client start %s", err)
243+
}
244+
err = obcEHClient.Stop()
245+
assert.NoError(t, err)
246+
247+
}
248+
249+
func TestMain(m *testing.M) {
250+
err := msptesttools.LoadMSPSetupForTesting()
251+
if err != nil {
252+
fmt.Printf("Could not initialize msp, err %s", err)
253+
os.Exit(-1)
254+
return
255+
}
256+
257+
coreutil.SetupTestConfig()
258+
var opts []grpc.ServerOption
259+
grpcServer := grpc.NewServer(opts...)
260+
261+
lis, err := net.Listen("tcp", peerAddress)
262+
if err != nil {
263+
fmt.Printf("Error starting events listener %s....not doing tests", err)
264+
return
265+
}
266+
267+
ehServer := producer.NewEventsServer(
268+
uint(viper.GetInt("peer.events.buffersize")),
269+
viper.GetDuration("peer.events.timeout"))
270+
ehpb.RegisterEventsServer(grpcServer, ehServer)
271+
272+
go grpcServer.Serve(lis)
273+
274+
time.Sleep(2 * time.Second)
275+
os.Exit(m.Run())
276+
}

0 commit comments

Comments
 (0)