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 }