Skip to content
This repository was archived by the owner on Apr 25, 2025. It is now read-only.

Commit 8e5aa5d

Browse files
committed
[FAB-8755] Event Client Cleanup
- Enhancments to unit tests - Ensure debug level is used for logging debug - Fix bug where incorrect payload was being signed in deliver connection - Add insecure option to connection Change-Id: Ib5e6030e739add5f27795f11cadb57b0b0b9fcde Signed-off-by: Bob Stasyszyn <Bob.Stasyszyn@securekey.com>
1 parent 352430f commit 8e5aa5d

File tree

17 files changed

+272
-231
lines changed

17 files changed

+272
-231
lines changed

pkg/fab/comm/connection.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ func newDialOpts(config core.Config, url string, params *params) ([]grpc.DialOpt
137137

138138
dialOpts = append(dialOpts, grpc.WithDefaultCallOptions(grpc.FailFast(params.failFast)))
139139

140-
if urlutil.IsTLSEnabled(url) {
140+
if urlutil.AttemptSecured(url, params.insecure) {
141141
tlsConfig, err := comm.TLSConfig(params.certificate, params.hostOverride, config)
142142
if err != nil {
143143
return nil, err

pkg/fab/comm/connectionopts.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ type params struct {
1919
certificate *x509.Certificate
2020
keepAliveParams keepalive.ClientParameters
2121
failFast bool
22+
insecure bool
2223
connectTimeout time.Duration
2324
}
2425

@@ -74,6 +75,16 @@ func WithConnectTimeout(value time.Duration) options.Opt {
7475
}
7576
}
7677

78+
// WithInsecure indicates to fall back to an insecure connection if the
79+
// connection URL does not specify a protocol
80+
func WithInsecure() options.Opt {
81+
return func(p options.Params) {
82+
if setter, ok := p.(insecureSetter); ok {
83+
setter.SetInsecure(true)
84+
}
85+
}
86+
}
87+
7788
func (p *params) SetHostOverride(value string) {
7889
logger.Debugf("HostOverride: %s", value)
7990
p.hostOverride = value
@@ -99,6 +110,11 @@ func (p *params) SetConnectTimeout(value time.Duration) {
99110
p.connectTimeout = value
100111
}
101112

113+
func (p *params) SetInsecure(value bool) {
114+
logger.Debugf("Insecure: %t", value)
115+
p.insecure = value
116+
}
117+
102118
type hostOverrideSetter interface {
103119
SetHostOverride(value string)
104120
}
@@ -115,6 +131,10 @@ type failFastSetter interface {
115131
SetFailFast(value bool)
116132
}
117133

134+
type insecureSetter interface {
135+
SetInsecure(value bool)
136+
}
137+
118138
type connectTimeoutSetter interface {
119139
SetConnectTimeout(value time.Duration)
120140
}

pkg/fab/events/client/client.go

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,6 @@ func New(permitBlockEvents bool, dispatcher eventservice.Dispatcher, opts ...opt
5959
return &Client{
6060
Service: *eventservice.New(dispatcher, opts...),
6161
params: *params,
62-
connEvent: make(chan *fab.ConnectionEvent),
6362
connectionState: int32(Disconnected),
6463
permitBlockEvents: permitBlockEvents,
6564
}
@@ -117,9 +116,7 @@ func (c *Client) Close() {
117116

118117
logger.Debugf("Stopping client...")
119118

120-
if c.connEventCh != nil {
121-
close(c.connEventCh)
122-
}
119+
c.closeConnectEventChan()
123120

124121
logger.Debugf("Sending disconnect request...")
125122

@@ -302,10 +299,7 @@ func (c *Client) monitorConnection() {
302299
break
303300
}
304301

305-
if c.connEventCh != nil {
306-
logger.Debugln("Sending connection event to subscriber.")
307-
c.connEventCh <- event
308-
}
302+
c.notifyConnectEventChan(event)
309303

310304
if event.Connected {
311305
logger.Debugf("Event client has connected")
@@ -346,6 +340,29 @@ func (c *Client) reconnect() {
346340
}
347341
}
348342

343+
func (c *Client) closeConnectEventChan() {
344+
c.Lock()
345+
defer c.Unlock()
346+
if c.connEventCh != nil {
347+
close(c.connEventCh)
348+
}
349+
}
350+
351+
func (c *Client) connectEventChan() chan *fab.ConnectionEvent {
352+
c.RLock()
353+
defer c.RUnlock()
354+
return c.connEventCh
355+
}
356+
357+
func (c *Client) notifyConnectEventChan(event *fab.ConnectionEvent) {
358+
c.RLock()
359+
defer c.RUnlock()
360+
if c.connEventCh != nil {
361+
logger.Debugln("Sending connection event to subscriber.")
362+
c.connEventCh <- event
363+
}
364+
}
365+
349366
func (s ConnectionState) String() string {
350367
switch s {
351368
case Disconnected:

pkg/fab/events/deliverclient/connection/connection.go

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ func (c *DeliverConnection) Send(seekInfo *ab.SeekInfo) error {
9595
return errors.New("connection is closed")
9696
}
9797

98-
logger.Debugf("Sending %v\n", seekInfo)
98+
logger.Debugf("Sending %#v", seekInfo)
9999

100100
env, err := c.createSignedEnvelope(seekInfo)
101101
if err != nil {
@@ -110,32 +110,34 @@ func (c *DeliverConnection) Receive(eventch chan<- interface{}) {
110110
for {
111111
stream := c.deliverStream()
112112
if stream == nil {
113-
logger.Warnf("The stream has closed. Terminating loop.\n")
113+
logger.Warnf("The stream has closed. Terminating loop.")
114114
break
115115
}
116116

117117
in, err := stream.Recv()
118118

119+
logger.Debugf("Got deliver response: %#v", in)
120+
119121
if c.Closed() {
120-
logger.Debugf("The connection has closed. Terminating loop.\n")
122+
logger.Debugf("The connection has closed with error [%s]. Terminating loop.", err)
121123
break
122124
}
123125

124126
if err == io.EOF {
125127
// This signifies that the stream has been terminated at the client-side. No need to send an event.
126-
logger.Debugf("Received EOF from stream.\n")
128+
logger.Debugf("Received EOF from stream.")
127129
break
128130
}
129131

130132
if err != nil {
131-
logger.Errorf("Received error from stream: [%s]. Sending disconnected event.\n", err)
133+
logger.Errorf("Received error from stream: [%s]. Sending disconnected event.", err)
132134
eventch <- clientdisp.NewDisconnectedEvent(err)
133135
break
134136
}
135137

136138
eventch <- in
137139
}
138-
logger.Debugf("Exiting stream listener\n")
140+
logger.Debugf("Exiting stream listener")
139141
}
140142

141143
func (c *DeliverConnection) createSignedEnvelope(msg proto.Message) (*cb.Envelope, error) {
@@ -145,7 +147,6 @@ func (c *DeliverConnection) createSignedEnvelope(msg proto.Message) (*cb.Envelop
145147

146148
payloadChannelHeader := utils.MakeChannelHeader(cb.HeaderType_DELIVER_SEEK_INFO, msgVersion, c.ChannelID(), epoch)
147149
payloadChannelHeader.TlsCertHash = c.TLSCertHash()
148-
var err error
149150

150151
data, err := proto.Marshal(msg)
151152
if err != nil {
@@ -172,7 +173,7 @@ func (c *DeliverConnection) createSignedEnvelope(msg proto.Message) (*cb.Envelop
172173
Data: data,
173174
})
174175

175-
signature, err := c.Context().SigningManager().Sign(data, c.Context().PrivateKey())
176+
signature, err := c.Context().SigningManager().Sign(paylBytes, c.Context().PrivateKey())
176177
if err != nil {
177178
return nil, err
178179
}

pkg/fab/events/deliverclient/connection/connection_test.go

Lines changed: 31 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import (
1515

1616
"google.golang.org/grpc/keepalive"
1717

18-
fabcontext "github.com/hyperledger/fabric-sdk-go/pkg/common/context"
1918
"github.com/hyperledger/fabric-sdk-go/pkg/fab/comm"
2019
clientdisp "github.com/hyperledger/fabric-sdk-go/pkg/fab/events/client/dispatcher"
2120
"github.com/hyperledger/fabric-sdk-go/pkg/fab/events/deliverclient/seek"
@@ -68,6 +67,33 @@ func TestConnection(t *testing.T) {
6867
t.Fatalf("error creating new connection: %s", err)
6968
}
7069

70+
conn.Close()
71+
72+
// Calling close again should be ignored
73+
conn.Close()
74+
}
75+
76+
func TestForbiddenConnection(t *testing.T) {
77+
expectedStatus := cb.Status_FORBIDDEN
78+
deliverServer.SetStatus(expectedStatus)
79+
defer deliverServer.SetStatus(cb.Status_UNKNOWN)
80+
81+
channelID := "mychannel"
82+
conn, err := New(newMockContext(), channelID, Deliver, peerURL,
83+
comm.WithConnectTimeout(3*time.Second),
84+
comm.WithFailFast(true),
85+
comm.WithKeepAliveParams(
86+
keepalive.ClientParameters{
87+
Time: 10 * time.Second,
88+
Timeout: 10 * time.Second,
89+
PermitWithoutStream: true,
90+
},
91+
),
92+
)
93+
if err != nil {
94+
t.Fatalf("error creating new connection: %s", err)
95+
}
96+
7197
eventch := make(chan interface{})
7298

7399
go conn.Receive(eventch)
@@ -77,21 +103,15 @@ func TestConnection(t *testing.T) {
77103
if !ok {
78104
t.Fatalf("unexpected closed connection")
79105
}
80-
deliverResponse, ok := e.(*pb.DeliverResponse)
81-
if !ok {
82-
t.Fatalf("expected deliver response but got %T", e)
83-
}
84-
if deliverResponse.GetStatus() != cb.Status_SUCCESS {
85-
t.Fatalf("expected deliver response status [%s] but got [%s]", cb.Status_SUCCESS, deliverResponse.GetStatus())
106+
statusResponse := e.(*pb.DeliverResponse).Type.(*pb.DeliverResponse_Status)
107+
if statusResponse.Status != expectedStatus {
108+
t.Fatalf("expecting status %s but got %s", expectedStatus, statusResponse.Status)
86109
}
87110
case <-time.After(5 * time.Second):
88111
t.Fatalf("timed out waiting for event")
89112
}
90113

91114
conn.Close()
92-
93-
// Calling close again should be ignored
94-
conn.Close()
95115
}
96116

97117
func TestSend(t *testing.T) {
@@ -116,19 +136,6 @@ func TestDisconnected(t *testing.T) {
116136

117137
deliverServer.Disconnect(errors.New("simulating disconnect"))
118138

119-
select {
120-
case e, ok := <-eventch:
121-
if !ok {
122-
t.Fatalf("unexpected closed connection")
123-
}
124-
statusResponse := e.(*pb.DeliverResponse).Type.(*pb.DeliverResponse_Status)
125-
if statusResponse.Status != cb.Status_SUCCESS {
126-
t.Fatalf("expecting status %s but got %s", cb.Status_SUCCESS, statusResponse.Status)
127-
}
128-
case <-time.After(5 * time.Second):
129-
t.Fatalf("timed out waiting for event")
130-
}
131-
132139
if err := conn.Send(seek.InfoNewest()); err != nil {
133140
t.Fatalf("error sending seek request for channel [%s]: err", err)
134141
}
@@ -167,22 +174,6 @@ func testSend(t *testing.T, streamType streamType) {
167174

168175
go conn.Receive(eventch)
169176

170-
select {
171-
case e, ok := <-eventch:
172-
if !ok {
173-
t.Fatalf("unexpected closed connection")
174-
}
175-
deliverResponse, ok := e.(*pb.DeliverResponse)
176-
if !ok {
177-
t.Fatalf("expected deliver response but got %T", e)
178-
}
179-
if deliverResponse.GetStatus() != cb.Status_SUCCESS {
180-
t.Fatalf("expected deliver response status [%s] but got [%s]", cb.Status_SUCCESS, deliverResponse.GetStatus())
181-
}
182-
case <-time.After(5 * time.Second):
183-
t.Fatalf("timed out waiting for event")
184-
}
185-
186177
if err := conn.Send(seek.InfoNewest()); err != nil {
187178
t.Fatalf("error sending seek request for channel [%s]: err", err)
188179
}
@@ -231,6 +222,6 @@ func TestMain(m *testing.M) {
231222
os.Exit(m.Run())
232223
}
233224

234-
func newMockContext() fabcontext.Client {
225+
func newMockContext() *fabmocks.MockContext {
235226
return fabmocks.NewMockContext(fabmocks.NewMockUser("user1"))
236227
}

pkg/fab/events/deliverclient/deliverclient.go

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ package deliverclient
88

99
import (
1010
"math"
11-
"sync"
1211
"time"
1312

1413
ab "github.com/hyperledger/fabric-sdk-go/internal/github.com/hyperledger/fabric/protos/orderer"
@@ -38,14 +37,8 @@ var deliverFilteredProvider = func(channelID string, context fabcontext.Client,
3837

3938
// Client connects to a peer and receives channel events, such as bock, filtered block, chaincode, and transaction status events.
4039
type Client struct {
41-
sync.RWMutex
4240
client.Client
4341
params
44-
connEvent chan *fab.ConnectionEvent
45-
connectionState int32
46-
stopped int32
47-
registerOnce sync.Once
48-
blockEventsPermitted bool
4942
}
5043

5144
// New returns a new deliver event client
@@ -76,7 +69,7 @@ func New(context fabcontext.Client, channelID string, discoveryService fab.Disco
7669
}
7770

7871
func (c *Client) seek() error {
79-
logger.Debugf("sending seek request....\n")
72+
logger.Debugf("Sending seek request....")
8073

8174
seekInfo, err := c.seekInfo()
8275
if err != nil {
@@ -93,11 +86,11 @@ func (c *Client) seek() error {
9386
}
9487

9588
if err != nil {
96-
logger.Errorf("unable to send seek request: %s\n", err)
89+
logger.Errorf("Unable to send seek request: %s", err)
9790
return err
9891
}
9992

100-
logger.Debugf("successfully sent seek\n")
93+
logger.Debugf("Successfully sent seek")
10194
return nil
10295
}
10396

pkg/fab/events/deliverclient/deliverclient_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ func TestClientConnect(t *testing.T) {
5858
withConnectionProvider(
5959
clientmocks.NewProviderFactory().Provider(
6060
delivermocks.NewConnection(
61-
clientmocks.WithLedger(servicemocks.NewMockLedger(servicemocks.BlockEventFactory)),
61+
clientmocks.WithLedger(servicemocks.NewMockLedger(delivermocks.BlockEventFactory)),
6262
),
6363
),
6464
true,
@@ -185,7 +185,7 @@ func testConnect(t *testing.T, maxConnectAttempts uint, expectedOutcome clientmo
185185
withConnectionProvider(
186186
cp.FlakeyProvider(
187187
connAttemptResult,
188-
clientmocks.WithLedger(servicemocks.NewMockLedger(servicemocks.BlockEventFactory)),
188+
clientmocks.WithLedger(servicemocks.NewMockLedger(delivermocks.BlockEventFactory)),
189189
clientmocks.WithFactory(func(opts ...clientmocks.Opt) clientmocks.Connection {
190190
return delivermocks.NewConnection(opts...)
191191
}),
@@ -216,7 +216,7 @@ func testReconnect(t *testing.T, reconnect bool, maxReconnectAttempts uint, expe
216216
cp := clientmocks.NewProviderFactory()
217217

218218
connectch := make(chan *fab.ConnectionEvent)
219-
ledger := servicemocks.NewMockLedger(servicemocks.BlockEventFactory)
219+
ledger := servicemocks.NewMockLedger(delivermocks.BlockEventFactory)
220220

221221
eventClient, err := New(
222222
newMockContext(), "mychannel",
@@ -276,7 +276,7 @@ func testReconnectRegistration(t *testing.T, connectResults clientmocks.ConnectA
276276
channelID := "mychannel"
277277
ccID := "mycc"
278278

279-
ledger := servicemocks.NewMockLedger(servicemocks.BlockEventFactory)
279+
ledger := servicemocks.NewMockLedger(delivermocks.BlockEventFactory)
280280

281281
// Add 2 blocks to the ledger befor the client has connected
282282
ledger.NewBlock(channelID,

0 commit comments

Comments
 (0)