Skip to content

Commit

Permalink
[FAB-9597] Discovery Service Integration Tests
Browse files Browse the repository at this point in the history
Added integration tests for Dynamic Discovery.

Change-Id: I1d87e4f55f710bc9368959ef8c9cff72cdc93f31
Signed-off-by: Bob Stasyszyn <Bob.Stasyszyn@securekey.com>
  • Loading branch information
bstasyszyn committed Apr 23, 2018
1 parent 637b655 commit 92ada51
Show file tree
Hide file tree
Showing 2 changed files with 235 additions and 0 deletions.
142 changes: 142 additions & 0 deletions test/integration/fab/discoveryclient_test.go
Original file line number Diff line number Diff line change
@@ -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")
}
}
93 changes: 93 additions & 0 deletions test/integration/sdk/sdk_dyndiscovery_test.go
Original file line number Diff line number Diff line change
@@ -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
}

0 comments on commit 92ada51

Please sign in to comment.