github.com/lzy4123/fabric@v2.1.1+incompatible/internal/peer/common/peerclient_test.go (about) 1 /* 2 Copyright IBM Corp. All Rights Reserved. 3 4 SPDX-License-Identifier: Apache-2.0 5 */ 6 package common_test 7 8 import ( 9 "crypto/tls" 10 "net" 11 "os" 12 "path/filepath" 13 "testing" 14 "time" 15 16 "github.com/hyperledger/fabric/internal/peer/common" 17 "github.com/hyperledger/fabric/internal/pkg/comm" 18 "github.com/spf13/viper" 19 "github.com/stretchr/testify/assert" 20 ) 21 22 func initPeerTestEnv(t *testing.T) (cleanup func()) { 23 t.Helper() 24 cfgPath := "./testdata" 25 os.Setenv("FABRIC_CFG_PATH", cfgPath) 26 viper.Reset() 27 _ = common.InitConfig("test") 28 29 return func() { 30 err := os.Unsetenv("FABRIC_CFG_PATH") 31 assert.NoError(t, err) 32 viper.Reset() 33 } 34 } 35 36 func TestNewPeerClientFromEnv(t *testing.T) { 37 cleanup := initPeerTestEnv(t) 38 defer cleanup() 39 40 pClient, err := common.NewPeerClientFromEnv() 41 assert.NoError(t, err) 42 assert.NotNil(t, pClient) 43 44 viper.Set("peer.tls.enabled", true) 45 pClient, err = common.NewPeerClientFromEnv() 46 assert.NoError(t, err) 47 assert.NotNil(t, pClient) 48 49 viper.Set("peer.tls.enabled", true) 50 viper.Set("peer.tls.clientAuthRequired", true) 51 pClient, err = common.NewPeerClientFromEnv() 52 assert.NoError(t, err) 53 assert.NotNil(t, pClient) 54 55 // bad key file 56 badKeyFile := filepath.Join("certs", "bad.key") 57 viper.Set("peer.tls.clientKey.file", badKeyFile) 58 pClient, err = common.NewPeerClientFromEnv() 59 assert.Contains(t, err.Error(), "failed to create PeerClient from config") 60 assert.Nil(t, pClient) 61 62 // bad cert file path 63 viper.Set("peer.tls.clientCert.file", "./nocert.crt") 64 pClient, err = common.NewPeerClientFromEnv() 65 assert.Contains(t, err.Error(), "unable to load peer.tls.clientCert.file") 66 assert.Contains(t, err.Error(), "failed to load config for PeerClient") 67 assert.Nil(t, pClient) 68 69 // bad key file path 70 viper.Set("peer.tls.clientKey.file", "./nokey.key") 71 pClient, err = common.NewPeerClientFromEnv() 72 assert.Contains(t, err.Error(), "unable to load peer.tls.clientKey.file") 73 assert.Nil(t, pClient) 74 75 // bad ca path 76 viper.Set("peer.tls.rootcert.file", "noroot.crt") 77 pClient, err = common.NewPeerClientFromEnv() 78 assert.Contains(t, err.Error(), "unable to load peer.tls.rootcert.file") 79 assert.Nil(t, pClient) 80 } 81 82 func TestPeerClient(t *testing.T) { 83 cleanup := initPeerTestEnv(t) 84 defer cleanup() 85 86 lis, err := net.Listen("tcp", "localhost:0") 87 if err != nil { 88 t.Fatalf("error creating server for test: %v", err) 89 } 90 defer lis.Close() 91 srv, err := comm.NewGRPCServerFromListener(lis, comm.ServerConfig{}) 92 if err != nil { 93 t.Fatalf("error creating gRPC server for test: %v", err) 94 } 95 go srv.Start() 96 defer srv.Stop() 97 viper.Set("peer.address", lis.Addr().String()) 98 pClient1, err := common.NewPeerClientFromEnv() 99 if err != nil { 100 t.Fatalf("failed to create PeerClient for test: %v", err) 101 } 102 eClient, err := pClient1.Endorser() 103 assert.NoError(t, err) 104 assert.NotNil(t, eClient) 105 eClient, err = common.GetEndorserClient("", "") 106 assert.NoError(t, err) 107 assert.NotNil(t, eClient) 108 109 dClient, err := pClient1.Deliver() 110 assert.NoError(t, err) 111 assert.NotNil(t, dClient) 112 dClient, err = common.GetDeliverClient("", "") 113 assert.NoError(t, err) 114 assert.NotNil(t, dClient) 115 } 116 117 func TestPeerClientTimeout(t *testing.T) { 118 t.Run("PeerClient.GetEndorser() timeout", func(t *testing.T) { 119 cleanup := initPeerTestEnv(t) 120 viper.Set("peer.client.connTimeout", 10*time.Millisecond) 121 defer cleanup() 122 pClient, err := common.NewPeerClientFromEnv() 123 if err != nil { 124 t.Fatalf("failed to create PeerClient for test: %v", err) 125 } 126 _, err = pClient.Endorser() 127 assert.Contains(t, err.Error(), "endorser client failed to connect") 128 }) 129 t.Run("GetEndorserClient() timeout", func(t *testing.T) { 130 cleanup := initPeerTestEnv(t) 131 viper.Set("peer.client.connTimeout", 10*time.Millisecond) 132 defer cleanup() 133 _, err := common.GetEndorserClient("", "") 134 assert.Contains(t, err.Error(), "endorser client failed to connect") 135 }) 136 t.Run("PeerClient.Deliver() timeout", func(t *testing.T) { 137 cleanup := initPeerTestEnv(t) 138 viper.Set("peer.client.connTimeout", 10*time.Millisecond) 139 defer cleanup() 140 pClient, err := common.NewPeerClientFromEnv() 141 if err != nil { 142 t.Fatalf("failed to create PeerClient for test: %v", err) 143 } 144 _, err = pClient.Deliver() 145 assert.Contains(t, err.Error(), "deliver client failed to connect") 146 }) 147 t.Run("GetDeliverClient() timeout", func(t *testing.T) { 148 cleanup := initPeerTestEnv(t) 149 viper.Set("peer.client.connTimeout", 10*time.Millisecond) 150 defer cleanup() 151 _, err := common.GetDeliverClient("", "") 152 assert.Contains(t, err.Error(), "deliver client failed to connect") 153 }) 154 t.Run("PeerClient.Certificate()", func(t *testing.T) { 155 cleanup := initPeerTestEnv(t) 156 defer cleanup() 157 pClient, err := common.NewPeerClientFromEnv() 158 if err != nil { 159 t.Fatalf("failed to create PeerClient for test: %v", err) 160 } 161 cert := pClient.Certificate() 162 assert.NotNil(t, cert) 163 }) 164 t.Run("GetCertificate()", func(t *testing.T) { 165 cleanup := initPeerTestEnv(t) 166 defer cleanup() 167 cert, err := common.GetCertificate() 168 assert.NotEqual(t, cert, &tls.Certificate{}) 169 assert.NoError(t, err) 170 }) 171 } 172 173 func TestNewPeerClientForAddress(t *testing.T) { 174 cleanup := initPeerTestEnv(t) 175 defer cleanup() 176 177 // TLS disabled 178 viper.Set("peer.tls.enabled", false) 179 180 // success case 181 pClient, err := common.NewPeerClientForAddress("testPeer", "") 182 assert.NoError(t, err) 183 assert.NotNil(t, pClient) 184 185 // failure - no peer address supplied 186 pClient, err = common.NewPeerClientForAddress("", "") 187 assert.Contains(t, err.Error(), "peer address must be set") 188 assert.Nil(t, pClient) 189 190 // TLS enabled 191 viper.Set("peer.tls.enabled", true) 192 193 // Enable clientAuthRequired 194 viper.Set("peer.tls.clientAuthRequired", true) 195 196 // success case 197 pClient, err = common.NewPeerClientForAddress("tlsPeer", "./testdata/certs/ca.crt") 198 assert.NoError(t, err) 199 assert.NotNil(t, pClient) 200 201 // failure - bad tls root cert file 202 pClient, err = common.NewPeerClientForAddress("badPeer", "bad.crt") 203 assert.Contains(t, err.Error(), "unable to load TLS root cert file from bad.crt") 204 assert.Nil(t, pClient) 205 206 // failure - empty tls root cert file 207 pClient, err = common.NewPeerClientForAddress("badPeer", "") 208 assert.Contains(t, err.Error(), "tls root cert file must be set") 209 assert.Nil(t, pClient) 210 211 // failure - empty tls root cert file 212 viper.Set("peer.tls.clientCert.file", "./nocert.crt") 213 pClient, err = common.NewPeerClientForAddress("badPeer", "") 214 assert.Contains(t, err.Error(), "unable to load peer.tls.clientCert.file") 215 assert.Nil(t, pClient) 216 217 // bad key file 218 viper.Set("peer.tls.clientKey.file", "./nokey.key") 219 viper.Set("peer.client.connTimeout", time.Duration(0)) 220 pClient, err = common.NewPeerClientForAddress("badPeer", "") 221 assert.Contains(t, err.Error(), "unable to load peer.tls.clientKey.file") 222 assert.Nil(t, pClient) 223 224 } 225 226 func TestGetClients_AddressError(t *testing.T) { 227 cleanup := initPeerTestEnv(t) 228 defer cleanup() 229 230 viper.Set("peer.tls.enabled", true) 231 232 // failure 233 eClient, err := common.GetEndorserClient("peer0", "") 234 assert.Contains(t, err.Error(), "tls root cert file must be set") 235 assert.Nil(t, eClient) 236 237 dClient, err := common.GetDeliverClient("peer0", "") 238 assert.Contains(t, err.Error(), "tls root cert file must be set") 239 assert.Nil(t, dClient) 240 }