From 92ada513b19ba8644ec6a14594eacb40ced738fd Mon Sep 17 00:00:00 2001 From: Bob Stasyszyn Date: Thu, 19 Apr 2018 13:57:07 -0400 Subject: [PATCH] [FAB-9597] Discovery Service Integration Tests Added integration tests for Dynamic Discovery. Change-Id: I1d87e4f55f710bc9368959ef8c9cff72cdc93f31 Signed-off-by: Bob Stasyszyn --- test/integration/fab/discoveryclient_test.go | 142 ++++++++++++++++++ test/integration/sdk/sdk_dyndiscovery_test.go | 93 ++++++++++++ 2 files changed, 235 insertions(+) create mode 100644 test/integration/fab/discoveryclient_test.go create mode 100644 test/integration/sdk/sdk_dyndiscovery_test.go diff --git a/test/integration/fab/discoveryclient_test.go b/test/integration/fab/discoveryclient_test.go new file mode 100644 index 0000000000..351078773b --- /dev/null +++ b/test/integration/fab/discoveryclient_test.go @@ -0,0 +1,142 @@ +// +build devstable + +/* +Copyright SecureKey Technologies Inc. All Rights Reserved. + +SPDX-License-Identifier: Apache-2.0 +*/ + +package fab + +import ( + "testing" + "time" + + "github.com/hyperledger/fabric-sdk-go/pkg/fab/comm" + "github.com/hyperledger/fabric-sdk-go/pkg/fab/discovery" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + discclient "github.com/hyperledger/fabric-sdk-go/internal/github.com/hyperledger/fabric/discovery/client" + "github.com/hyperledger/fabric-sdk-go/pkg/context" + "github.com/hyperledger/fabric-sdk-go/pkg/fabsdk" +) + +const ( + peer1URL = "peer0.org1.example.com" + peer2URL = "peer0.org2.example.com" + org1AdminUser = "Admin" +) + +func TestDiscoveryClientPeers(t *testing.T) { + sdk := mainSDK + testSetup := mainTestSetup + + ctxProvider := sdk.Context(fabsdk.WithUser(org1User), fabsdk.WithOrg(org1Name)) + ctx, err := ctxProvider() + require.NoError(t, err, "error getting channel context") + + var client *discovery.Client + client, err = discovery.New(ctx) + require.NoError(t, err, "error creating discovery client") + + reqCtx, cancel := context.NewRequest(ctx, context.WithTimeout(10*time.Second)) + defer cancel() + + req := discclient.NewRequest().OfChannel(testSetup.ChannelID).AddPeersQuery() + + peerCfg1, err := comm.NetworkPeerConfigFromURL(ctx.EndpointConfig(), peer1URL) + require.NoErrorf(t, err, "error getting peer config for [%s]", peer1URL) + + responses, err := client.Send(reqCtx, req, peerCfg1.PeerConfig) + require.NoError(t, err, "error calling discover service send") + require.NotEmpty(t, responses, "expecting one response but got none") + + resp := responses[0] + chanResp := resp.ForChannel(testSetup.ChannelID) + + peers, err := chanResp.Peers() + require.NoError(t, err, "error getting peers") + require.NotEmpty(t, peers, "expecting at least one peer but got none") + + t.Logf("*** Peers for channel %s:\n", testSetup.ChannelID) + for _, peer := range peers { + aliveMsg := peer.AliveMessage.GetAliveMsg() + if !assert.NotNil(t, aliveMsg, "got nil AliveMessage") { + continue + } + if !assert.NotNil(t, aliveMsg.Membership, "got nil Membership") { + continue + } + + t.Logf("--- Endpoint: %s\n", aliveMsg.Membership.Endpoint) + + if !assert.NotNil(t, peer.StateInfoMessage, "got nil StateInfoMessage") { + continue + } + + stateInfo := peer.StateInfoMessage.GetStateInfo() + if !assert.NotNil(t, stateInfo, "got nil stateInfo") { + continue + } + + if !assert.NotNil(t, stateInfo.Properties, "got nil stateInfo.Properties") { + continue + } + + t.Logf("--- Ledger Height: %d\n", stateInfo.Properties.LedgerHeight) + t.Logf("--- LeftChannel: %t\n", stateInfo.Properties.LeftChannel) + t.Logf("--- Chaincodes:\n") + for _, cc := range stateInfo.Properties.Chaincodes { + t.Logf("------ %s:%s\n", cc.Name, cc.Version) + } + } +} + +func TestDiscoveryClientLocalPeers(t *testing.T) { + sdk := mainSDK + + // By default, query for local peers (outside of a channel) requires admin privileges. + // To bypass this restriction, set peer.discovery.orgMembersAllowedAccess=true in core.yaml. + ctxProvider := sdk.Context(fabsdk.WithUser(org1AdminUser), fabsdk.WithOrg(org1Name)) + ctx, err := ctxProvider() + require.NoError(t, err, "error getting channel context") + + var client *discovery.Client + client, err = discovery.New(ctx) + require.NoError(t, err, "error creating discovery client") + + reqCtx, cancel := context.NewRequest(ctx, context.WithTimeout(10*time.Second)) + defer cancel() + + req := discclient.NewRequest().AddLocalPeersQuery() + + peerCfg1, err := comm.NetworkPeerConfigFromURL(ctx.EndpointConfig(), peer1URL) + require.NoErrorf(t, err, "error getting peer config for [%s]", peer1URL) + + responses, err := client.Send(reqCtx, req, peerCfg1.PeerConfig) + require.NoError(t, err, "error calling discover service send") + require.NotEmpty(t, responses, "No responses") + + resp := responses[0] + + locResp := resp.ForLocal() + + peers, err := locResp.Peers() + require.NoError(t, err, "error getting local peers") + + t.Logf("*** Local Peers:\n") + for _, peer := range peers { + aliveMsg := peer.AliveMessage.GetAliveMsg() + if !assert.NotNil(t, aliveMsg, "got nil AliveMessage") { + continue + } + if !assert.NotNil(t, aliveMsg.Membership, "got nil Membership") { + continue + } + + t.Logf("--- Endpoint: %s\n", aliveMsg.Membership.Endpoint) + + assert.Nil(t, peer.StateInfoMessage, "expected nil StateInfoMessage for local peer") + } +} diff --git a/test/integration/sdk/sdk_dyndiscovery_test.go b/test/integration/sdk/sdk_dyndiscovery_test.go new file mode 100644 index 0000000000..faac75e8c1 --- /dev/null +++ b/test/integration/sdk/sdk_dyndiscovery_test.go @@ -0,0 +1,93 @@ +// +build devstable + +/* +Copyright SecureKey Technologies Inc. All Rights Reserved. + +SPDX-License-Identifier: Apache-2.0 +*/ + +package sdk + +import ( + "testing" + + "github.com/hyperledger/fabric-sdk-go/pkg/common/providers/fab" + "github.com/stretchr/testify/require" + + contextImpl "github.com/hyperledger/fabric-sdk-go/pkg/context" + "github.com/hyperledger/fabric-sdk-go/pkg/fabsdk/factory/defsvc" + + "github.com/hyperledger/fabric-sdk-go/pkg/client/common/discovery/dynamicdiscovery" + "github.com/hyperledger/fabric-sdk-go/pkg/core/config" + "github.com/hyperledger/fabric-sdk-go/pkg/fabsdk" +) + +func TestDynamicDiscovery(t *testing.T) { + testSetup := mainTestSetup + + // Create SDK setup for channel client with dynamic selection + sdk, err := fabsdk.New(config.FromFile("../../fixtures/config/config_test.yaml"), + fabsdk.WithServicePkg(&DynamicDiscoveryProviderFactory{})) + require.NoError(t, err, "Failed to create new SDK") + defer sdk.Close() + + err = testSetup.Initialize(sdk) + require.NoError(t, err, "Failed to initialize test setup") + + chProvider := sdk.ChannelContext(testSetup.ChannelID, fabsdk.WithUser(org1User), fabsdk.WithOrg(org1Name)) + chCtx, err := chProvider() + require.NoError(t, err, "Error creating channel context") + + peers, err := chCtx.DiscoveryService().GetPeers() + require.NoErrorf(t, err, "Error getting peers for channel [%s]", testSetup.ChannelID) + require.NotEmptyf(t, peers, "No peers were found for channel [%s]", testSetup.ChannelID) + + t.Logf("Peers of channel [%s]:", testSetup.ChannelID) + for _, p := range peers { + t.Logf("- [%s] - MSP [%s]", p.URL(), p.MSPID()) + } +} + +func TestDynamicLocalDiscovery(t *testing.T) { + testSetup := mainTestSetup + + // Create SDK setup for channel client with dynamic selection + sdk, err := fabsdk.New(config.FromFile("../../fixtures/config/config_test.yaml"), + fabsdk.WithServicePkg(&DynamicDiscoveryProviderFactory{})) + require.NoError(t, err, "Failed to create new SDK") + defer sdk.Close() + + err = testSetup.Initialize(sdk) + require.NoError(t, err, "Failed to initialize test setup") + + // By default, query for local peers (outside of a channel) requires admin privileges. + // To bypass this restriction, set peer.discovery.orgMembersAllowedAccess=true in core.yaml. + ctxProvider := sdk.Context(fabsdk.WithUser(org1AdminUser), fabsdk.WithOrg(org1Name)) + + locCtx, err := contextImpl.NewLocal(ctxProvider) + require.NoError(t, err, "Error creating local context") + + peers, err := locCtx.LocalDiscoveryService().GetPeers() + require.NoErrorf(t, err, "Error getting local peers for MSP [%s]", locCtx.Identifier().MSPID) + require.NotEmptyf(t, peers, "No local peers were found for MSP [%s]", locCtx.Identifier().MSPID) + + t.Logf("Local peers for MSP [%s]:", locCtx.Identifier().MSPID) + for _, p := range peers { + t.Logf("- [%s] - MSP [%s]", p.URL(), p.MSPID()) + } +} + +// DynamicDiscoveryProviderFactory is configured with dynamic (endorser) selection provider +type DynamicDiscoveryProviderFactory struct { + defsvc.ProviderFactory +} + +// CreateDiscoveryProvider returns a new dynamic discovery provider +func (f *DynamicDiscoveryProviderFactory) CreateDiscoveryProvider(config fab.EndpointConfig) (fab.DiscoveryProvider, error) { + return dynamicdiscovery.New(config), nil +} + +// CreateLocalDiscoveryProvider returns a new local dynamic discovery provider +func (f *DynamicDiscoveryProviderFactory) CreateLocalDiscoveryProvider(config fab.EndpointConfig) (fab.LocalDiscoveryProvider, error) { + return dynamicdiscovery.New(config), nil +}