github.com/hechain20/hechain@v0.0.0-20220316014945-b544036ba106/internal/pkg/gateway/registry_test.go (about)

     1  /*
     2  Copyright 2021 IBM All Rights Reserved.
     3  
     4  SPDX-License-Identifier: Apache-2.0
     5  */
     6  
     7  package gateway
     8  
     9  import (
    10  	"testing"
    11  
    12  	"github.com/hechain20/hechain/bccsp/sw"
    13  	"github.com/hechain20/hechain/common/channelconfig"
    14  	"github.com/hechain20/hechain/common/crypto/tlsgen"
    15  	"github.com/hechain20/hechain/core/config/configtest"
    16  	"github.com/hechain20/hechain/internal/configtxgen/encoder"
    17  	"github.com/hechain20/hechain/internal/configtxgen/genesisconfig"
    18  	cb "github.com/hyperledger/fabric-protos-go/common"
    19  	dp "github.com/hyperledger/fabric-protos-go/discovery"
    20  	"github.com/hyperledger/fabric-protos-go/msp"
    21  	"github.com/stretchr/testify/require"
    22  )
    23  
    24  const channelName = "mychannel"
    25  
    26  func TestOrdererCache(t *testing.T) {
    27  	def := &testDef{
    28  		config: buildConfig(t, []string{"orderer1"}),
    29  	}
    30  	test := prepareTest(t, def)
    31  
    32  	orderers, err := test.server.registry.orderers(channelName)
    33  	require.NoError(t, err)
    34  	require.Len(t, orderers, 1)
    35  	require.Len(t, orderers[0].tlsRootCerts, 3) // 1 tlsrootCA + 2 tlsintermediateCAs
    36  
    37  	// trigger the config update callback, updating the orderers
    38  	bundle, err := createChannelConfigBundle(channelName, []string{"orderer1:7050", "orderer2:7050", "orderer3:7050"})
    39  	require.NoError(t, err)
    40  	test.server.registry.configUpdate(bundle)
    41  	orderers, err = test.server.registry.orderers(channelName)
    42  	require.NoError(t, err)
    43  	require.Len(t, orderers, 3)
    44  	require.Len(t, orderers[2].tlsRootCerts, 2) // 1 tlsrootCA + 1 tlsintermediateCA from sampleconfig folder
    45  }
    46  
    47  func TestStaleOrdererConnections(t *testing.T) {
    48  	def := &testDef{
    49  		config: buildConfig(t, []string{"orderer1", "orderer2", "orderer3"}),
    50  	}
    51  	test := prepareTest(t, def)
    52  
    53  	orderers, err := test.server.registry.orderers(channelName)
    54  	require.NoError(t, err)
    55  	require.Len(t, orderers, 3)
    56  
    57  	closed := make([]bool, len(orderers))
    58  	for i, o := range orderers {
    59  		o.closeConnection = func(index int) func() error {
    60  			return func() error {
    61  				closed[index] = true
    62  				return nil
    63  			}
    64  		}(i)
    65  	}
    66  	// trigger the config update callback, updating the orderers
    67  	bundle, err := createChannelConfigBundle(channelName, []string{"orderer1:7050", "orderer3:7050"})
    68  	require.NoError(t, err)
    69  	test.server.registry.configUpdate(bundle)
    70  	orderers, err = test.server.registry.orderers(channelName)
    71  	require.NoError(t, err)
    72  	require.Len(t, orderers, 2)
    73  	require.False(t, closed[0])
    74  	require.True(t, closed[1])
    75  	require.False(t, closed[2])
    76  }
    77  
    78  func TestStaleMultiChannelOrdererConnections(t *testing.T) {
    79  	channel1 := "channel1"
    80  
    81  	def := &testDef{
    82  		config: buildConfig(t, []string{"orderer1", "orderer2"}),
    83  	}
    84  	test := prepareTest(t, def)
    85  
    86  	orderers, err := test.server.registry.orderers(channelName)
    87  	require.NoError(t, err)
    88  	require.Len(t, orderers, 2)
    89  
    90  	// trigger the config update callback, updating the orderers
    91  	bundle, err := createChannelConfigBundle(channel1, []string{"orderer1:7050", "orderer3:7050", "orderer4:7050"})
    92  	require.NoError(t, err)
    93  	test.server.registry.configUpdate(bundle)
    94  	orderers, err = test.server.registry.orderers(channel1)
    95  	require.NoError(t, err)
    96  	require.Len(t, orderers, 3)
    97  
    98  	closed := make([]bool, len(orderers))
    99  	for i, o := range orderers {
   100  		o.closeConnection = func(index int) func() error {
   101  			return func() error {
   102  				closed[index] = true
   103  				return nil
   104  			}
   105  		}(i)
   106  	}
   107  
   108  	// new config update removes orderer1 and orderer3 from channel1 - should only trigger the closure of orderer3
   109  	bundle, err = createChannelConfigBundle(channel1, []string{"orderer4:7050"})
   110  	require.NoError(t, err)
   111  	test.server.registry.configUpdate(bundle)
   112  	orderers, err = test.server.registry.orderers(channel1)
   113  	require.NoError(t, err)
   114  	require.Len(t, orderers, 1)
   115  
   116  	require.False(t, closed[0]) // orderer1
   117  	require.True(t, closed[1])  // orderer3
   118  	require.False(t, closed[2]) // orderer4
   119  }
   120  
   121  func buildConfig(t *testing.T, orderers []string) *dp.ConfigResult {
   122  	ca, err := tlsgen.NewCA()
   123  	require.NoError(t, err)
   124  	ica1, err := ca.NewIntermediateCA()
   125  	require.NoError(t, err)
   126  	ica2, err := ica1.NewIntermediateCA()
   127  	require.NoError(t, err)
   128  	var endpoints []*dp.Endpoint
   129  	for _, o := range orderers {
   130  		endpoints = append(endpoints, &dp.Endpoint{Host: o, Port: 7050})
   131  	}
   132  
   133  	return &dp.ConfigResult{
   134  		Orderers: map[string]*dp.Endpoints{
   135  			"msp1": {
   136  				Endpoint: endpoints,
   137  			},
   138  		},
   139  		Msps: map[string]*msp.FabricMSPConfig{
   140  			"msp1": {
   141  				TlsRootCerts:         [][]byte{ca.CertBytes()},
   142  				TlsIntermediateCerts: [][]byte{ica1.CertBytes(), ica2.CertBytes()},
   143  			},
   144  		},
   145  	}
   146  }
   147  
   148  func createChannelConfigBundle(channel string, endpoints []string) (*channelconfig.Bundle, error) {
   149  	conf := genesisconfig.Load(genesisconfig.SampleDevModeSoloProfile, configtest.GetDevConfigDir())
   150  	conf.Capabilities = map[string]bool{"V2_0": true}
   151  	conf.Orderer.Organizations[0].OrdererEndpoints = endpoints
   152  
   153  	cg, err := encoder.NewChannelGroup(conf)
   154  	if err != nil {
   155  		return nil, err
   156  	}
   157  
   158  	cryptoProvider, err := sw.NewDefaultSecurityLevelWithKeystore(sw.NewDummyKeyStore())
   159  	if err != nil {
   160  		return nil, err
   161  	}
   162  
   163  	return channelconfig.NewBundle(channel, &cb.Config{ChannelGroup: cg}, cryptoProvider)
   164  }