go_study/fabric-main/internal/peer/common/ordererclient_test.go

207 lines
5.6 KiB
Go

/*
Copyright IBM Corp. 2016-2017 All Rights Reserved.
SPDX-License-Identifier: Apache-2.0
*/
package common_test
import (
"io/ioutil"
"net"
"os"
"path"
"path/filepath"
"testing"
"time"
"github.com/hyperledger/fabric/common/crypto/tlsgen"
"github.com/hyperledger/fabric/internal/peer/common"
"github.com/hyperledger/fabric/internal/pkg/comm"
"github.com/spf13/viper"
"github.com/stretchr/testify/require"
)
func initOrdererTestEnv(t *testing.T) (cleanup func()) {
t.Helper()
cfgPath := t.TempDir()
certsDir := filepath.Join(cfgPath, "certs")
err := os.Mkdir(certsDir, 0o755)
require.NoError(t, err)
configFile, err := os.Create(filepath.Join(cfgPath, "test.yaml"))
require.NoError(t, err)
defer configFile.Close()
configStr := `
peer:
tls:
rootcert:
file: "certs/ca.crt"
clientKey:
file: "certs/client.key"
clientCert:
file: "certs/client.crt"
client:
connTimeout: 1s
orderer:
tls:
rootcert:
file: "certs/ca.crt"
clientKey:
file: "certs/client.key"
clientCert:
file: "certs/client.crt"
client:
connTimeout: 1s
`
_, err = configFile.WriteString(configStr)
require.NoError(t, err)
t.Setenv("FABRIC_CFG_PATH", cfgPath)
viper.Reset()
_ = common.InitConfig("test")
ca, err := tlsgen.NewCA()
require.NoError(t, err)
caCrtFile := path.Join(certsDir, "ca.crt")
err = ioutil.WriteFile(caCrtFile, ca.CertBytes(), 0o644)
require.NoError(t, err)
kp, err := ca.NewClientCertKeyPair()
require.NoError(t, err)
key := path.Join(certsDir, "client.key")
err = ioutil.WriteFile(key, kp.Key, 0o644)
require.NoError(t, err)
crt := path.Join(certsDir, "client.crt")
err = ioutil.WriteFile(crt, kp.Cert, 0o644)
require.NoError(t, err)
ekey := path.Join(certsDir, "empty.key")
err = ioutil.WriteFile(ekey, []byte{}, 0o644)
require.NoError(t, err)
ecrt := path.Join(certsDir, "empty.crt")
err = ioutil.WriteFile(ecrt, []byte{}, 0o644)
require.NoError(t, err)
configFile, err = os.Create(filepath.Join(certsDir, "bad.key"))
require.NoError(t, err)
defer configFile.Close()
_, err = configFile.WriteString(`
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgg6BAaCpwlmg/hEP4
QjUeWEu3crkxMvjq4vYh3LaDREuhRANCAAR+FujNKcGQW/CEpMU6Yp45ye2cbOwJ
-----END PRIVATE KEY-----
`)
require.NoError(t, err)
return func() {
viper.Reset()
}
}
func TestNewOrdererClientFromEnv(t *testing.T) {
cleanup := initOrdererTestEnv(t)
defer cleanup()
oClient, err := common.NewOrdererClientFromEnv()
require.NoError(t, err)
require.NotNil(t, oClient)
viper.Set("orderer.tls.enabled", true)
oClient, err = common.NewOrdererClientFromEnv()
require.NoError(t, err)
require.NotNil(t, oClient)
viper.Set("orderer.tls.enabled", true)
viper.Set("orderer.tls.clientAuthRequired", true)
oClient, err = common.NewOrdererClientFromEnv()
require.NoError(t, err)
require.NotNil(t, oClient)
// bad key file
badKeyFile := filepath.Join("certs", "bad.key")
viper.Set("orderer.tls.clientKey.file", badKeyFile)
oClient, err = common.NewOrdererClientFromEnv()
require.NoError(t, err)
_, err = oClient.Dial("127.0.0.1:0")
require.ErrorContains(t, err, "failed to load client certificate:")
require.ErrorContains(t, err, "tls: failed to parse private key")
// bad cert file path
viper.Set("orderer.tls.clientCert.file", "./nocert.crt")
oClient, err = common.NewOrdererClientFromEnv()
require.ErrorContains(t, err, "unable to load orderer.tls.clientCert.file")
require.ErrorContains(t, err, "failed to load config for OrdererClient")
require.Nil(t, oClient)
// bad key file path
viper.Set("orderer.tls.clientKey.file", "./nokey.key")
oClient, err = common.NewOrdererClientFromEnv()
require.ErrorContains(t, err, "unable to load orderer.tls.clientKey.file")
require.Nil(t, oClient)
// bad ca path
viper.Set("orderer.tls.rootcert.file", "noroot.crt")
oClient, err = common.NewOrdererClientFromEnv()
require.ErrorContains(t, err, "unable to load orderer.tls.rootcert.file")
require.Nil(t, oClient)
}
func TestOrdererClient(t *testing.T) {
cleanup := initOrdererTestEnv(t)
defer cleanup()
lis, err := net.Listen("tcp", "localhost:0")
if err != nil {
t.Fatalf("error creating listener for test: %v", err)
}
defer lis.Close()
srv, err := comm.NewGRPCServerFromListener(lis, comm.ServerConfig{})
if err != nil {
t.Fatalf("error creating gRPC server for test: %v", err)
}
go srv.Start()
defer srv.Stop()
viper.Set("orderer.address", lis.Addr().String())
oClient, err := common.NewOrdererClientFromEnv()
if err != nil {
t.Fatalf("failed to create OrdererClient for test: %v", err)
}
bc, err := oClient.Broadcast()
require.NoError(t, err)
require.NotNil(t, bc)
dc, err := oClient.Deliver()
require.NoError(t, err)
require.NotNil(t, dc)
}
func TestOrdererClientTimeout(t *testing.T) {
t.Run("OrdererClient.Broadcast() timeout", func(t *testing.T) {
cleanup := initOrdererTestEnv(t)
viper.Set("orderer.client.connTimeout", 10*time.Millisecond)
defer cleanup()
oClient, err := common.NewOrdererClientFromEnv()
if err != nil {
t.Fatalf("failed to create OrdererClient for test: %v", err)
}
_, err = oClient.Broadcast()
require.Contains(t, err.Error(), "orderer client failed to connect")
})
t.Run("OrdererClient.Deliver() timeout", func(t *testing.T) {
cleanup := initOrdererTestEnv(t)
viper.Set("orderer.client.connTimeout", 10*time.Millisecond)
defer cleanup()
oClient, err := common.NewOrdererClientFromEnv()
if err != nil {
t.Fatalf("failed to create OrdererClient for test: %v", err)
}
_, err = oClient.Deliver()
require.Contains(t, err.Error(), "orderer client failed to connect")
})
}