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

Commit 92ada51

Browse files
committed
[FAB-9597] Discovery Service Integration Tests
Added integration tests for Dynamic Discovery. Change-Id: I1d87e4f55f710bc9368959ef8c9cff72cdc93f31 Signed-off-by: Bob Stasyszyn <Bob.Stasyszyn@securekey.com>
1 parent 637b655 commit 92ada51

File tree

2 files changed

+235
-0
lines changed

2 files changed

+235
-0
lines changed
Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
// +build devstable
2+
3+
/*
4+
Copyright SecureKey Technologies Inc. All Rights Reserved.
5+
6+
SPDX-License-Identifier: Apache-2.0
7+
*/
8+
9+
package fab
10+
11+
import (
12+
"testing"
13+
"time"
14+
15+
"github.com/hyperledger/fabric-sdk-go/pkg/fab/comm"
16+
"github.com/hyperledger/fabric-sdk-go/pkg/fab/discovery"
17+
"github.com/stretchr/testify/assert"
18+
"github.com/stretchr/testify/require"
19+
20+
discclient "github.com/hyperledger/fabric-sdk-go/internal/github.com/hyperledger/fabric/discovery/client"
21+
"github.com/hyperledger/fabric-sdk-go/pkg/context"
22+
"github.com/hyperledger/fabric-sdk-go/pkg/fabsdk"
23+
)
24+
25+
const (
26+
peer1URL = "peer0.org1.example.com"
27+
peer2URL = "peer0.org2.example.com"
28+
org1AdminUser = "Admin"
29+
)
30+
31+
func TestDiscoveryClientPeers(t *testing.T) {
32+
sdk := mainSDK
33+
testSetup := mainTestSetup
34+
35+
ctxProvider := sdk.Context(fabsdk.WithUser(org1User), fabsdk.WithOrg(org1Name))
36+
ctx, err := ctxProvider()
37+
require.NoError(t, err, "error getting channel context")
38+
39+
var client *discovery.Client
40+
client, err = discovery.New(ctx)
41+
require.NoError(t, err, "error creating discovery client")
42+
43+
reqCtx, cancel := context.NewRequest(ctx, context.WithTimeout(10*time.Second))
44+
defer cancel()
45+
46+
req := discclient.NewRequest().OfChannel(testSetup.ChannelID).AddPeersQuery()
47+
48+
peerCfg1, err := comm.NetworkPeerConfigFromURL(ctx.EndpointConfig(), peer1URL)
49+
require.NoErrorf(t, err, "error getting peer config for [%s]", peer1URL)
50+
51+
responses, err := client.Send(reqCtx, req, peerCfg1.PeerConfig)
52+
require.NoError(t, err, "error calling discover service send")
53+
require.NotEmpty(t, responses, "expecting one response but got none")
54+
55+
resp := responses[0]
56+
chanResp := resp.ForChannel(testSetup.ChannelID)
57+
58+
peers, err := chanResp.Peers()
59+
require.NoError(t, err, "error getting peers")
60+
require.NotEmpty(t, peers, "expecting at least one peer but got none")
61+
62+
t.Logf("*** Peers for channel %s:\n", testSetup.ChannelID)
63+
for _, peer := range peers {
64+
aliveMsg := peer.AliveMessage.GetAliveMsg()
65+
if !assert.NotNil(t, aliveMsg, "got nil AliveMessage") {
66+
continue
67+
}
68+
if !assert.NotNil(t, aliveMsg.Membership, "got nil Membership") {
69+
continue
70+
}
71+
72+
t.Logf("--- Endpoint: %s\n", aliveMsg.Membership.Endpoint)
73+
74+
if !assert.NotNil(t, peer.StateInfoMessage, "got nil StateInfoMessage") {
75+
continue
76+
}
77+
78+
stateInfo := peer.StateInfoMessage.GetStateInfo()
79+
if !assert.NotNil(t, stateInfo, "got nil stateInfo") {
80+
continue
81+
}
82+
83+
if !assert.NotNil(t, stateInfo.Properties, "got nil stateInfo.Properties") {
84+
continue
85+
}
86+
87+
t.Logf("--- Ledger Height: %d\n", stateInfo.Properties.LedgerHeight)
88+
t.Logf("--- LeftChannel: %t\n", stateInfo.Properties.LeftChannel)
89+
t.Logf("--- Chaincodes:\n")
90+
for _, cc := range stateInfo.Properties.Chaincodes {
91+
t.Logf("------ %s:%s\n", cc.Name, cc.Version)
92+
}
93+
}
94+
}
95+
96+
func TestDiscoveryClientLocalPeers(t *testing.T) {
97+
sdk := mainSDK
98+
99+
// By default, query for local peers (outside of a channel) requires admin privileges.
100+
// To bypass this restriction, set peer.discovery.orgMembersAllowedAccess=true in core.yaml.
101+
ctxProvider := sdk.Context(fabsdk.WithUser(org1AdminUser), fabsdk.WithOrg(org1Name))
102+
ctx, err := ctxProvider()
103+
require.NoError(t, err, "error getting channel context")
104+
105+
var client *discovery.Client
106+
client, err = discovery.New(ctx)
107+
require.NoError(t, err, "error creating discovery client")
108+
109+
reqCtx, cancel := context.NewRequest(ctx, context.WithTimeout(10*time.Second))
110+
defer cancel()
111+
112+
req := discclient.NewRequest().AddLocalPeersQuery()
113+
114+
peerCfg1, err := comm.NetworkPeerConfigFromURL(ctx.EndpointConfig(), peer1URL)
115+
require.NoErrorf(t, err, "error getting peer config for [%s]", peer1URL)
116+
117+
responses, err := client.Send(reqCtx, req, peerCfg1.PeerConfig)
118+
require.NoError(t, err, "error calling discover service send")
119+
require.NotEmpty(t, responses, "No responses")
120+
121+
resp := responses[0]
122+
123+
locResp := resp.ForLocal()
124+
125+
peers, err := locResp.Peers()
126+
require.NoError(t, err, "error getting local peers")
127+
128+
t.Logf("*** Local Peers:\n")
129+
for _, peer := range peers {
130+
aliveMsg := peer.AliveMessage.GetAliveMsg()
131+
if !assert.NotNil(t, aliveMsg, "got nil AliveMessage") {
132+
continue
133+
}
134+
if !assert.NotNil(t, aliveMsg.Membership, "got nil Membership") {
135+
continue
136+
}
137+
138+
t.Logf("--- Endpoint: %s\n", aliveMsg.Membership.Endpoint)
139+
140+
assert.Nil(t, peer.StateInfoMessage, "expected nil StateInfoMessage for local peer")
141+
}
142+
}
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
// +build devstable
2+
3+
/*
4+
Copyright SecureKey Technologies Inc. All Rights Reserved.
5+
6+
SPDX-License-Identifier: Apache-2.0
7+
*/
8+
9+
package sdk
10+
11+
import (
12+
"testing"
13+
14+
"github.com/hyperledger/fabric-sdk-go/pkg/common/providers/fab"
15+
"github.com/stretchr/testify/require"
16+
17+
contextImpl "github.com/hyperledger/fabric-sdk-go/pkg/context"
18+
"github.com/hyperledger/fabric-sdk-go/pkg/fabsdk/factory/defsvc"
19+
20+
"github.com/hyperledger/fabric-sdk-go/pkg/client/common/discovery/dynamicdiscovery"
21+
"github.com/hyperledger/fabric-sdk-go/pkg/core/config"
22+
"github.com/hyperledger/fabric-sdk-go/pkg/fabsdk"
23+
)
24+
25+
func TestDynamicDiscovery(t *testing.T) {
26+
testSetup := mainTestSetup
27+
28+
// Create SDK setup for channel client with dynamic selection
29+
sdk, err := fabsdk.New(config.FromFile("../../fixtures/config/config_test.yaml"),
30+
fabsdk.WithServicePkg(&DynamicDiscoveryProviderFactory{}))
31+
require.NoError(t, err, "Failed to create new SDK")
32+
defer sdk.Close()
33+
34+
err = testSetup.Initialize(sdk)
35+
require.NoError(t, err, "Failed to initialize test setup")
36+
37+
chProvider := sdk.ChannelContext(testSetup.ChannelID, fabsdk.WithUser(org1User), fabsdk.WithOrg(org1Name))
38+
chCtx, err := chProvider()
39+
require.NoError(t, err, "Error creating channel context")
40+
41+
peers, err := chCtx.DiscoveryService().GetPeers()
42+
require.NoErrorf(t, err, "Error getting peers for channel [%s]", testSetup.ChannelID)
43+
require.NotEmptyf(t, peers, "No peers were found for channel [%s]", testSetup.ChannelID)
44+
45+
t.Logf("Peers of channel [%s]:", testSetup.ChannelID)
46+
for _, p := range peers {
47+
t.Logf("- [%s] - MSP [%s]", p.URL(), p.MSPID())
48+
}
49+
}
50+
51+
func TestDynamicLocalDiscovery(t *testing.T) {
52+
testSetup := mainTestSetup
53+
54+
// Create SDK setup for channel client with dynamic selection
55+
sdk, err := fabsdk.New(config.FromFile("../../fixtures/config/config_test.yaml"),
56+
fabsdk.WithServicePkg(&DynamicDiscoveryProviderFactory{}))
57+
require.NoError(t, err, "Failed to create new SDK")
58+
defer sdk.Close()
59+
60+
err = testSetup.Initialize(sdk)
61+
require.NoError(t, err, "Failed to initialize test setup")
62+
63+
// By default, query for local peers (outside of a channel) requires admin privileges.
64+
// To bypass this restriction, set peer.discovery.orgMembersAllowedAccess=true in core.yaml.
65+
ctxProvider := sdk.Context(fabsdk.WithUser(org1AdminUser), fabsdk.WithOrg(org1Name))
66+
67+
locCtx, err := contextImpl.NewLocal(ctxProvider)
68+
require.NoError(t, err, "Error creating local context")
69+
70+
peers, err := locCtx.LocalDiscoveryService().GetPeers()
71+
require.NoErrorf(t, err, "Error getting local peers for MSP [%s]", locCtx.Identifier().MSPID)
72+
require.NotEmptyf(t, peers, "No local peers were found for MSP [%s]", locCtx.Identifier().MSPID)
73+
74+
t.Logf("Local peers for MSP [%s]:", locCtx.Identifier().MSPID)
75+
for _, p := range peers {
76+
t.Logf("- [%s] - MSP [%s]", p.URL(), p.MSPID())
77+
}
78+
}
79+
80+
// DynamicDiscoveryProviderFactory is configured with dynamic (endorser) selection provider
81+
type DynamicDiscoveryProviderFactory struct {
82+
defsvc.ProviderFactory
83+
}
84+
85+
// CreateDiscoveryProvider returns a new dynamic discovery provider
86+
func (f *DynamicDiscoveryProviderFactory) CreateDiscoveryProvider(config fab.EndpointConfig) (fab.DiscoveryProvider, error) {
87+
return dynamicdiscovery.New(config), nil
88+
}
89+
90+
// CreateLocalDiscoveryProvider returns a new local dynamic discovery provider
91+
func (f *DynamicDiscoveryProviderFactory) CreateLocalDiscoveryProvider(config fab.EndpointConfig) (fab.LocalDiscoveryProvider, error) {
92+
return dynamicdiscovery.New(config), nil
93+
}

0 commit comments

Comments
 (0)