github.com/hechain20/hechain@v0.0.0-20220316014945-b544036ba106/internal/peer/common/ordererclient_test.go (about) 1 /* 2 Copyright hechain. 2016-2017 All Rights Reserved. 3 4 SPDX-License-Identifier: Apache-2.0 5 */ 6 package common_test 7 8 import ( 9 "io/ioutil" 10 "net" 11 "os" 12 "path" 13 "path/filepath" 14 "testing" 15 "time" 16 17 "github.com/hechain20/hechain/common/crypto/tlsgen" 18 "github.com/hechain20/hechain/internal/peer/common" 19 "github.com/hechain20/hechain/internal/pkg/comm" 20 "github.com/spf13/viper" 21 "github.com/stretchr/testify/require" 22 ) 23 24 func initOrdererTestEnv(t *testing.T) (cleanup func()) { 25 t.Helper() 26 cfgPath, err := ioutil.TempDir("", "ordererTestEnv") 27 require.NoError(t, err) 28 certsDir := filepath.Join(cfgPath, "certs") 29 err = os.Mkdir(certsDir, 0o755) 30 require.NoError(t, err) 31 32 configFile, err := os.Create(filepath.Join(cfgPath, "test.yaml")) 33 require.NoError(t, err) 34 defer configFile.Close() 35 36 configStr := ` 37 peer: 38 tls: 39 rootcert: 40 file: "certs/ca.crt" 41 clientKey: 42 file: "certs/client.key" 43 clientCert: 44 file: "certs/client.crt" 45 client: 46 connTimeout: 1s 47 48 orderer: 49 tls: 50 rootcert: 51 file: "certs/ca.crt" 52 clientKey: 53 file: "certs/client.key" 54 clientCert: 55 file: "certs/client.crt" 56 client: 57 connTimeout: 1s 58 ` 59 _, err = configFile.WriteString(configStr) 60 require.NoError(t, err) 61 62 os.Setenv("FABRIC_CFG_PATH", cfgPath) 63 viper.Reset() 64 _ = common.InitConfig("test") 65 ca, err := tlsgen.NewCA() 66 require.NoError(t, err) 67 68 caCrtFile := path.Join(certsDir, "ca.crt") 69 err = ioutil.WriteFile(caCrtFile, ca.CertBytes(), 0o644) 70 require.NoError(t, err) 71 72 kp, err := ca.NewClientCertKeyPair() 73 require.NoError(t, err) 74 75 key := path.Join(certsDir, "client.key") 76 err = ioutil.WriteFile(key, kp.Key, 0o644) 77 require.NoError(t, err) 78 79 crt := path.Join(certsDir, "client.crt") 80 err = ioutil.WriteFile(crt, kp.Cert, 0o644) 81 require.NoError(t, err) 82 83 ekey := path.Join(certsDir, "empty.key") 84 err = ioutil.WriteFile(ekey, []byte{}, 0o644) 85 require.NoError(t, err) 86 87 ecrt := path.Join(certsDir, "empty.crt") 88 err = ioutil.WriteFile(ecrt, []byte{}, 0o644) 89 require.NoError(t, err) 90 91 configFile, err = os.Create(filepath.Join(certsDir, "bad.key")) 92 require.NoError(t, err) 93 defer configFile.Close() 94 95 _, err = configFile.WriteString(` 96 -----BEGIN PRIVATE KEY----- 97 MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgg6BAaCpwlmg/hEP4 98 QjUeWEu3crkxMvjq4vYh3LaDREuhRANCAAR+FujNKcGQW/CEpMU6Yp45ye2cbOwJ 99 -----END PRIVATE KEY----- 100 `) 101 require.NoError(t, err) 102 103 return func() { 104 err := os.Unsetenv("FABRIC_CFG_PATH") 105 require.NoError(t, err) 106 defer os.RemoveAll(cfgPath) 107 viper.Reset() 108 } 109 } 110 111 func TestNewOrdererClientFromEnv(t *testing.T) { 112 cleanup := initOrdererTestEnv(t) 113 defer cleanup() 114 115 oClient, err := common.NewOrdererClientFromEnv() 116 require.NoError(t, err) 117 require.NotNil(t, oClient) 118 119 viper.Set("orderer.tls.enabled", true) 120 oClient, err = common.NewOrdererClientFromEnv() 121 require.NoError(t, err) 122 require.NotNil(t, oClient) 123 124 viper.Set("orderer.tls.enabled", true) 125 viper.Set("orderer.tls.clientAuthRequired", true) 126 oClient, err = common.NewOrdererClientFromEnv() 127 require.NoError(t, err) 128 require.NotNil(t, oClient) 129 130 // bad key file 131 badKeyFile := filepath.Join("certs", "bad.key") 132 viper.Set("orderer.tls.clientKey.file", badKeyFile) 133 oClient, err = common.NewOrdererClientFromEnv() 134 require.NoError(t, err) 135 _, err = oClient.Dial("127.0.0.1:0") 136 require.ErrorContains(t, err, "failed to load client certificate:") 137 require.ErrorContains(t, err, "tls: failed to parse private key") 138 139 // bad cert file path 140 viper.Set("orderer.tls.clientCert.file", "./nocert.crt") 141 oClient, err = common.NewOrdererClientFromEnv() 142 require.ErrorContains(t, err, "unable to load orderer.tls.clientCert.file") 143 require.ErrorContains(t, err, "failed to load config for OrdererClient") 144 require.Nil(t, oClient) 145 146 // bad key file path 147 viper.Set("orderer.tls.clientKey.file", "./nokey.key") 148 oClient, err = common.NewOrdererClientFromEnv() 149 require.ErrorContains(t, err, "unable to load orderer.tls.clientKey.file") 150 require.Nil(t, oClient) 151 152 // bad ca path 153 viper.Set("orderer.tls.rootcert.file", "noroot.crt") 154 oClient, err = common.NewOrdererClientFromEnv() 155 require.ErrorContains(t, err, "unable to load orderer.tls.rootcert.file") 156 require.Nil(t, oClient) 157 } 158 159 func TestOrdererClient(t *testing.T) { 160 cleanup := initOrdererTestEnv(t) 161 defer cleanup() 162 163 lis, err := net.Listen("tcp", "localhost:0") 164 if err != nil { 165 t.Fatalf("error creating listener for test: %v", err) 166 } 167 defer lis.Close() 168 srv, err := comm.NewGRPCServerFromListener(lis, comm.ServerConfig{}) 169 if err != nil { 170 t.Fatalf("error creating gRPC server for test: %v", err) 171 } 172 go srv.Start() 173 defer srv.Stop() 174 viper.Set("orderer.address", lis.Addr().String()) 175 oClient, err := common.NewOrdererClientFromEnv() 176 if err != nil { 177 t.Fatalf("failed to create OrdererClient for test: %v", err) 178 } 179 bc, err := oClient.Broadcast() 180 require.NoError(t, err) 181 require.NotNil(t, bc) 182 dc, err := oClient.Deliver() 183 require.NoError(t, err) 184 require.NotNil(t, dc) 185 } 186 187 func TestOrdererClientTimeout(t *testing.T) { 188 t.Run("OrdererClient.Broadcast() timeout", func(t *testing.T) { 189 cleanup := initOrdererTestEnv(t) 190 viper.Set("orderer.client.connTimeout", 10*time.Millisecond) 191 defer cleanup() 192 oClient, err := common.NewOrdererClientFromEnv() 193 if err != nil { 194 t.Fatalf("failed to create OrdererClient for test: %v", err) 195 } 196 _, err = oClient.Broadcast() 197 require.Contains(t, err.Error(), "orderer client failed to connect") 198 }) 199 t.Run("OrdererClient.Deliver() timeout", func(t *testing.T) { 200 cleanup := initOrdererTestEnv(t) 201 viper.Set("orderer.client.connTimeout", 10*time.Millisecond) 202 defer cleanup() 203 oClient, err := common.NewOrdererClientFromEnv() 204 if err != nil { 205 t.Fatalf("failed to create OrdererClient for test: %v", err) 206 } 207 _, err = oClient.Deliver() 208 require.Contains(t, err.Error(), "orderer client failed to connect") 209 }) 210 }