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

Commit eaa71c4

Browse files
committed
[FAB-8482] Context and ChannelContext integration tests
- Updated all integration-tests to use sdk.Context and sdk.ChannelContext - Exposed errors while building contexts (added context.ClientProvider and context.ChannelProvider) - Removed dependencies on fabsdk.NewClient - Marked fabsdk.NewClient deprecated - Deleted ClientContext.Session() - Deleted ChananelService.Ledger() - Added DiscoveryFilter to channel client In next commit will remove sdk.NewClient usage in ccpolicyprovider. Change-Id: I41de27036205000e2b0a633a72b413c09639a068 Signed-off-by: Sudesh Shetty <sudesh.shetty@securekey.com>
1 parent d9320d1 commit eaa71c4

29 files changed

+471
-234
lines changed

pkg/client/channel/chclient.go

Lines changed: 41 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,12 @@ const (
3636
// An application that requires interaction with multiple channels should create a separate
3737
// instance of the channel client for each channel. Channel client supports non-admin functions only.
3838
type Client struct {
39-
context context.Channel
40-
membership fab.ChannelMembership
41-
transactor fab.Transactor
42-
eventHub fab.EventHub
43-
greylist *greylist.Filter
39+
context context.Channel
40+
membership fab.ChannelMembership
41+
transactor fab.Transactor
42+
eventHub fab.EventHub
43+
greylist *greylist.Filter
44+
discoveryFilter fab.TargetFilter
4445
}
4546

4647
type customChannelContext struct {
@@ -52,40 +53,66 @@ func (ccc *customChannelContext) DiscoveryService() fab.DiscoveryService {
5253
return ccc.discoveryService
5354
}
5455

56+
// ClientOption describes a functional parameter for the New constructor
57+
type ClientOption func(*Client) error
58+
59+
// WithTargetFilter option to configure new
60+
func WithTargetFilter(filter fab.TargetFilter) ClientOption {
61+
return func(client *Client) error {
62+
client.discoveryFilter = filter
63+
return nil
64+
}
65+
}
66+
5567
// New returns a Client instance.
56-
func New(c context.Channel) (*Client, error) {
68+
func New(channelProvider context.ChannelProvider, opts ...ClientOption) (*Client, error) {
69+
70+
channelContext, err := channelProvider()
71+
if err != nil {
72+
return nil, errors.WithMessage(err, "failed to create channel context")
73+
}
5774

58-
greylistProvider := greylist.New(c.Config().TimeoutOrDefault(core.DiscoveryGreylistExpiry))
75+
greylistProvider := greylist.New(channelContext.Config().TimeoutOrDefault(core.DiscoveryGreylistExpiry))
5976

60-
if c.ChannelService() == nil {
77+
if channelContext.ChannelService() == nil {
6178
return nil, errors.New("channel service not initialized")
6279
}
6380

64-
eventHub, err := c.ChannelService().EventHub()
81+
eventHub, err := channelContext.ChannelService().EventHub()
6582
if err != nil {
6683
return nil, errors.WithMessage(err, "event hub creation failed")
6784
}
6885

69-
transactor, err := c.ChannelService().Transactor()
86+
transactor, err := channelContext.ChannelService().Transactor()
7087
if err != nil {
7188
return nil, errors.WithMessage(err, "transactor creation failed")
7289
}
7390

74-
membership, err := c.ChannelService().Membership()
91+
membership, err := channelContext.ChannelService().Membership()
7592
if err != nil {
7693
return nil, errors.WithMessage(err, "membership creation failed")
7794
}
7895

79-
customDiscoveryService := discovery.NewDiscoveryFilterService(c.DiscoveryService(), greylistProvider)
80-
8196
channelClient := Client{
82-
context: &customChannelContext{Channel: c, discoveryService: customDiscoveryService},
8397
membership: membership,
8498
transactor: transactor,
8599
eventHub: eventHub,
86100
greylist: greylistProvider,
87101
}
88102

103+
for _, param := range opts {
104+
param(&channelClient)
105+
}
106+
107+
//target filter
108+
discoveryService := discovery.NewDiscoveryFilterService(channelContext.DiscoveryService(), channelClient.discoveryFilter)
109+
110+
//greylist filter
111+
customDiscoveryService := discovery.NewDiscoveryFilterService(discoveryService, greylistProvider)
112+
113+
//update context
114+
channelClient.context = &customChannelContext{Channel: channelContext, discoveryService: customDiscoveryService}
115+
89116
return &channelClient, nil
90117
}
91118

pkg/client/channel/chclient_test.go

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -462,7 +462,7 @@ func TestDiscoveryGreylist(t *testing.T) {
462462
assert.Nil(t, err, "Got error %s", err)
463463

464464
fabCtx := setupCustomTestContext(t, selectionService, discoveryService, nil)
465-
ctx := contextImpl.NewChannel(fabCtx, channelID)
465+
ctx := createChannelContext(fabCtx, channelID)
466466

467467
chClient, err := New(ctx)
468468
assert.Nil(t, err, "Got error %s", err)
@@ -483,7 +483,7 @@ func TestDiscoveryGreylist(t *testing.T) {
483483
assert.EqualValues(t, status.NoPeersFound.ToInt32(), s.Code, "expected No Peers Found status on greylist")
484484
assert.Equal(t, 1, testPeer1.ProcessProposalCalls, "expected peer 1 to be greylisted")
485485
// Wait for greylist expiry
486-
time.Sleep(ctx.Providers().Config().TimeoutOrDefault(core.DiscoveryGreylistExpiry))
486+
time.Sleep(chClient.context.Config().TimeoutOrDefault(core.DiscoveryGreylistExpiry))
487487
testPeer1.ProcessProposalCalls = 0
488488
testPeer1.Error = status.New(status.EndorserServerStatus, int32(common.Status_SERVICE_UNAVAILABLE), "test", nil)
489489
// Try again
@@ -524,7 +524,7 @@ func setupTestContext() context.Client {
524524
return ctx
525525
}
526526

527-
func setupCustomTestContext(t *testing.T, selectionService fab.SelectionService, discoveryService fab.DiscoveryService, orderers []fab.Orderer) context.Client {
527+
func setupCustomTestContext(t *testing.T, selectionService fab.SelectionService, discoveryService fab.DiscoveryService, orderers []fab.Orderer) context.ClientProvider {
528528
user := fcmocks.NewMockUser("test")
529529
ctx := fcmocks.NewMockContext(user)
530530

@@ -546,7 +546,7 @@ func setupCustomTestContext(t *testing.T, selectionService fab.SelectionService,
546546
discoveryProvider := ctx.MockProviderContext.DiscoveryProvider()
547547
discoveryProvider.(*fcmocks.MockStaticDiscoveryProvider).SetCustomDiscoveryService(discoveryService)
548548

549-
return ctx
549+
return createClientContext(ctx)
550550
}
551551

552552
func setupTestDiscovery(discErr error, peers []fab.Peer) (fab.DiscoveryService, error) {
@@ -588,7 +588,7 @@ func setupChannelClientWithError(discErr error, selectionErr error, peers []fab.
588588

589589
fabCtx := setupCustomTestContext(t, selectionService, discoveryService, nil)
590590

591-
ctx := contextImpl.NewChannel(fabCtx, channelID)
591+
ctx := createChannelContext(fabCtx, channelID)
592592

593593
ch, err := New(ctx)
594594
if err != nil {
@@ -609,7 +609,7 @@ func setupChannelClientWithNodes(peers []fab.Peer,
609609

610610
fabCtx := setupCustomTestContext(t, selectionService, discoveryService, orderers)
611611

612-
ctx := contextImpl.NewChannel(fabCtx, channelID)
612+
ctx := createChannelContext(fabCtx, channelID)
613613

614614
ch, err := New(ctx)
615615
assert.Nil(t, err, "Failed to create new channel client")
@@ -638,3 +638,18 @@ func createAndSendTestTransactionProposal(sender fab.ProposalSender, chrequest *
638638
tpr, err := sender.SendTransactionProposal(tpreq, targets)
639639
return tpr, tpreq.TxnID, err
640640
}
641+
642+
func createChannelContext(clientContext context.ClientProvider, channelID string) context.ChannelProvider {
643+
644+
channelProvider := func() (context.Channel, error) {
645+
return contextImpl.NewChannel(clientContext, channelID)
646+
}
647+
648+
return channelProvider
649+
}
650+
651+
func createClientContext(client context.Client) context.ClientProvider {
652+
return func() (context.Client, error) {
653+
return client, nil
654+
}
655+
}

pkg/client/ledger/ledger.go

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -53,23 +53,28 @@ func (f *MSPFilter) Accept(peer fab.Peer) bool {
5353
}
5454

5555
// New returns a Client instance.
56-
func New(c context.Client, chName string, opts ...ClientOption) (*Client, error) {
56+
func New(clientProvider context.ClientProvider, channelID string, opts ...ClientOption) (*Client, error) {
5757

58-
l, err := channel.NewLedger(c, chName)
58+
clientContext, err := clientProvider()
5959
if err != nil {
6060
return nil, err
6161
}
6262

63-
discoveryService, err := c.DiscoveryProvider().NewDiscoveryService(chName)
63+
l, err := channel.NewLedger(clientContext, channelID)
64+
if err != nil {
65+
return nil, err
66+
}
67+
68+
discoveryService, err := clientContext.DiscoveryProvider().NewDiscoveryService(channelID)
6469
if err != nil {
6570
return nil, err
6671
}
6772

6873
ledgerClient := Client{
69-
context: c,
74+
context: clientContext,
7075
discovery: discoveryService,
7176
ledger: l,
72-
chName: chName,
77+
chName: channelID,
7378
}
7479

7580
for _, opt := range opts {
@@ -82,10 +87,10 @@ func New(c context.Client, chName string, opts ...ClientOption) (*Client, error)
8287
// check if target filter was set - if not set the default
8388
if ledgerClient.filter == nil {
8489
// Default target filter is based on user msp
85-
if c.MspID() == "" {
90+
if clientContext.MspID() == "" {
8691
return nil, errors.New("mspID not available in user context")
8792
}
88-
filter := &MSPFilter{mspID: c.MspID()}
93+
filter := &MSPFilter{mspID: clientContext.MspID()}
8994
ledgerClient.filter = filter
9095
}
9196

pkg/client/resmgmt/resmgmt.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,12 @@ func WithDefaultTargetFilter(filter TargetFilter) ClientOption {
125125
}
126126

127127
// New returns a ResourceMgmtClient instance
128-
func New(ctx context.Client, opts ...ClientOption) (*Client, error) {
128+
func New(clientProvider context.ClientProvider, opts ...ClientOption) (*Client, error) {
129+
130+
ctx, err := clientProvider()
131+
if err != nil {
132+
return nil, errors.WithMessage(err, "failed to create resmgmt client")
133+
}
129134

130135
resource := resource.New(ctx)
131136

pkg/client/resmgmt/resmgmt_test.go

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -119,11 +119,12 @@ func TestNoSigningUserFailure(t *testing.T) {
119119
config := getNetworkConfig(t)
120120
fabCtx.SetConfig(config)
121121

122-
ctx := contextImpl.Client{
122+
clientCtx := createClientContext(contextImpl.Client{
123123
Providers: fabCtx,
124124
Identity: fabCtx,
125-
}
126-
_, err := New(ctx)
125+
})
126+
127+
_, err := New(clientCtx)
127128
if err == nil {
128129
t.Fatal("Should have failed due to missing msp")
129130
}
@@ -1139,10 +1140,7 @@ func setupResMgmtClient(fabCtx context.Client, discErr error, t *testing.T, opts
11391140
}
11401141
chProvider.SetTransactor(&transactor)
11411142

1142-
ctx := contextImpl.Client{
1143-
Providers: fabCtx,
1144-
Identity: fabCtx,
1145-
}
1143+
ctx := createClientContext(fabCtx)
11461144

11471145
resClient, err := New(ctx, opts...)
11481146
if err != nil {
@@ -1248,11 +1246,12 @@ func TestSaveChannelFailure(t *testing.T) {
12481246
resource := fcmocks.NewMockInvalidResource()
12491247
fabCtx := setupTestContext("user", "Org1Msp1")
12501248

1251-
ctx := contextImpl.Client{
1249+
clientCtx := createClientContext(contextImpl.Client{
12521250
Providers: fabCtx,
12531251
Identity: fabCtx,
1254-
}
1255-
cc, err := New(ctx)
1252+
})
1253+
1254+
cc, err := New(clientCtx)
12561255
if err != nil {
12571256
t.Fatalf("Failed to create new channel management client: %s", err)
12581257
}
@@ -1314,3 +1313,9 @@ func TestSaveChannelWithMultipleSigningIdenities(t *testing.T) {
13141313
t.Fatalf("Failed to save channel with multiple signing identities: %s", err)
13151314
}
13161315
}
1316+
1317+
func createClientContext(fabCtx context.Client) context.ClientProvider {
1318+
return func() (context.Client, error) {
1319+
return fabCtx, nil
1320+
}
1321+
}

pkg/common/context/context.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,6 @@ import (
1111
"github.com/hyperledger/fabric-sdk-go/pkg/context/api/fab"
1212
)
1313

14-
// Session primarily represents the session and identity context
15-
type Session interface {
16-
Identity
17-
}
18-
1914
// Identity supplies the serialized identity and key reference.
2015
type Identity interface {
2116
MspID() string
@@ -42,3 +37,9 @@ type Channel interface {
4237
SelectionService() fab.SelectionService
4338
ChannelService() fab.ChannelService
4439
}
40+
41+
//ClientProvider returns client context
42+
type ClientProvider func() (Client, error)
43+
44+
//ChannelProvider returns channel client context
45+
type ChannelProvider func() (Channel, error)

pkg/context/api/fab/context.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ type IdentityContext interface {
2020
// ChannelService supplies services related to a channel.
2121
type ChannelService interface {
2222
Config() (ChannelConfig, error)
23-
Ledger() (ChannelLedger, error)
2423
Transactor() (Transactor, error)
2524
EventHub() (EventHub, error) // TODO support new event delivery
2625
Membership() (ChannelMembership, error)

pkg/context/context.go

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"github.com/hyperledger/fabric-sdk-go/pkg/common/context"
1313
"github.com/hyperledger/fabric-sdk-go/pkg/context/api/core"
1414
"github.com/hyperledger/fabric-sdk-go/pkg/context/api/fab"
15+
"github.com/pkg/errors"
1516
)
1617

1718
// Client supplies the configuration and signing identity to client objects.
@@ -174,6 +175,7 @@ func WithChannelProvider(channelProvider fab.ChannelProvider) SDKContextParams {
174175
}
175176

176177
//NewProvider creates new context client provider
178+
// Not be used by end developers, fabsdk package use only
177179
func NewProvider(params ...SDKContextParams) *Provider {
178180
ctxProvider := Provider{}
179181
for _, param := range params {
@@ -183,27 +185,33 @@ func NewProvider(params ...SDKContextParams) *Provider {
183185
}
184186

185187
//NewChannel creates new channel context client
186-
func NewChannel(client context.Client, channelID string) *Channel {
188+
// Not be used by end developers, fabsdk package use only
189+
func NewChannel(clientProvider context.ClientProvider, channelID string) (*Channel, error) {
190+
191+
client, err := clientProvider()
192+
if err != nil {
193+
return nil, errors.WithMessage(err, "failed to get client context to create channel client")
194+
}
187195

188196
channelService, err := client.ChannelProvider().ChannelService(client, channelID)
189197
if err != nil {
190-
return &Channel{Client: client}
198+
return nil, errors.WithMessage(err, "failed to get channel service to create channel client")
191199
}
192200

193201
discoveryService, err := client.DiscoveryProvider().NewDiscoveryService(channelID)
194202
if err != nil {
195-
return &Channel{Client: client}
203+
return nil, errors.WithMessage(err, "failed to get discovery service to create channel client")
196204
}
197205

198206
selectionService, err := client.SelectionProvider().NewSelectionService(channelID)
199207
if err != nil {
200-
return &Channel{Client: client}
208+
return nil, errors.WithMessage(err, "failed to get selection service to create channel client")
201209
}
202210

203211
return &Channel{
204212
Client: client,
205213
selection: selectionService,
206214
discovery: discoveryService,
207215
channelService: channelService,
208-
}
216+
}, nil
209217
}

pkg/fab/mocks/mockchprovider.go

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,3 @@ func (cs *MockChannelService) Config() (fab.ChannelConfig, error) {
8484
func (cs *MockChannelService) Membership() (fab.ChannelMembership, error) {
8585
return NewMockMembership(), nil
8686
}
87-
88-
// Ledger ...
89-
func (cs *MockChannelService) Ledger() (fab.ChannelLedger, error) {
90-
return nil, nil
91-
}

pkg/fab/mocks/mocktransactor.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,9 @@ func (t *MockTransactor) CreateTransactionHeader() (fab.TransactionHeader, error
2727
// SendTransactionProposal sends a TransactionProposal to the target peers.
2828
func (t *MockTransactor) SendTransactionProposal(proposal *fab.TransactionProposal, targets []fab.ProposalProcessor) ([]*fab.TransactionProposalResponse, error) {
2929
response := make([]*fab.TransactionProposalResponse, 1, 1)
30-
response[0] = &fab.TransactionProposalResponse{Endorser: "example.com", Status: 99, ProposalResponse: nil}
30+
response[0] = &fab.TransactionProposalResponse{Endorser: "example.com", Status: 99,
31+
ProposalResponse: &pb.ProposalResponse{Response: &pb.Response{Payload: []byte("abc")}},
32+
}
3133
return response, nil
3234
}
3335

0 commit comments

Comments
 (0)