go_study/fabric-main/core/deliverservice/config_test.go

237 lines
6.7 KiB
Go

/*
Copyright IBM Corp. All Rights Reserved.
SPDX-License-Identifier: Apache-2.0
*/
package deliverservice_test
import (
"bytes"
"io/ioutil"
"os"
"path/filepath"
"testing"
"time"
"github.com/stretchr/testify/require"
"github.com/hyperledger/fabric/core/deliverservice"
"github.com/hyperledger/fabric/internal/pkg/comm"
"github.com/spf13/viper"
)
func TestSecureOptsConfig(t *testing.T) {
cwd, err := os.Getwd()
require.NoError(t, err)
certPath := filepath.Join(cwd, "testdata", "cert.pem")
keyPath := filepath.Join(cwd, "testdata", "key.pem")
certBytes, err := ioutil.ReadFile(filepath.Join("testdata", "cert.pem"))
require.NoError(t, err)
keyBytes, err := ioutil.ReadFile(filepath.Join("testdata", "key.pem"))
require.NoError(t, err)
t.Run("client specific cert", func(t *testing.T) {
viper.Reset()
defer viper.Reset()
viper.Set("peer.tls.enabled", true)
viper.Set("peer.tls.clientAuthRequired", true)
viper.Set("peer.tls.clientCert.file", certPath)
viper.Set("peer.tls.clientKey.file", keyPath)
coreConfig := deliverservice.GlobalConfig()
require.True(t, coreConfig.SecOpts.UseTLS)
require.True(t, coreConfig.SecOpts.RequireClientCert)
require.Equal(t, keyBytes, coreConfig.SecOpts.Key)
require.Equal(t, certBytes, coreConfig.SecOpts.Certificate)
})
t.Run("fallback cert", func(t *testing.T) {
viper.Reset()
defer viper.Reset()
viper.Set("peer.tls.enabled", true)
viper.Set("peer.tls.clientAuthRequired", true)
viper.Set("peer.tls.cert.file", certPath)
viper.Set("peer.tls.key.file", keyPath)
coreConfig := deliverservice.GlobalConfig()
require.True(t, coreConfig.SecOpts.UseTLS)
require.True(t, coreConfig.SecOpts.RequireClientCert)
require.Equal(t, keyBytes, coreConfig.SecOpts.Key)
require.Equal(t, certBytes, coreConfig.SecOpts.Certificate)
})
t.Run("no cert", func(t *testing.T) {
viper.Reset()
defer viper.Reset()
viper.Set("peer.tls.enabled", true)
viper.Set("peer.tls.clientAuthRequired", true)
require.Panics(t, func() { deliverservice.GlobalConfig() })
})
}
func TestGlobalConfig(t *testing.T) {
viper.Reset()
defer viper.Reset()
viper.Set("peer.tls.enabled", true)
viper.Set("peer.deliveryclient.reConnectBackoffThreshold", "25s")
viper.Set("peer.deliveryclient.reconnectTotalTimeThreshold", "20s")
viper.Set("peer.deliveryclient.connTimeout", "10s")
viper.Set("peer.keepalive.deliveryClient.interval", "5s")
viper.Set("peer.keepalive.deliveryClient.timeout", "2s")
coreConfig := deliverservice.GlobalConfig()
expectedConfig := &deliverservice.DeliverServiceConfig{
BlockGossipEnabled: true,
PeerTLSEnabled: true,
ReConnectBackoffThreshold: 25 * time.Second,
ReconnectTotalTimeThreshold: 20 * time.Second,
ConnectionTimeout: 10 * time.Second,
KeepaliveOptions: comm.KeepaliveOptions{
ClientInterval: time.Second * 5,
ClientTimeout: time.Second * 2,
ServerInterval: time.Hour * 2,
ServerTimeout: time.Second * 20,
ServerMinInterval: time.Minute,
},
SecOpts: comm.SecureOptions{
UseTLS: true,
},
}
require.Equal(t, expectedConfig, coreConfig)
}
func TestGlobalConfigDefault(t *testing.T) {
viper.Reset()
defer viper.Reset()
coreConfig := deliverservice.GlobalConfig()
expectedConfig := &deliverservice.DeliverServiceConfig{
BlockGossipEnabled: true,
PeerTLSEnabled: false,
ReConnectBackoffThreshold: deliverservice.DefaultReConnectBackoffThreshold,
ReconnectTotalTimeThreshold: deliverservice.DefaultReConnectTotalTimeThreshold,
ConnectionTimeout: deliverservice.DefaultConnectionTimeout,
KeepaliveOptions: comm.DefaultKeepaliveOptions,
}
require.Equal(t, expectedConfig, coreConfig)
}
func TestLoadOverridesMap(t *testing.T) {
defer viper.Reset()
t.Run("GreenPath", func(t *testing.T) {
config := `
peer:
deliveryclient:
addressOverrides:
- from: addressFrom1
to: addressTo1
caCertsFile: testdata/cert.pem
- from: addressFrom2
to: addressTo2
caCertsFile: testdata/cert.pem
`
viper.Reset()
viper.SetConfigType("yaml")
err := viper.ReadConfig(bytes.NewBuffer([]byte(config)))
require.NoError(t, err)
res, err := deliverservice.LoadOverridesMap()
require.NoError(t, err)
require.Len(t, res, 2)
ep1, ok := res["addressFrom1"]
require.True(t, ok)
require.Equal(t, "addressTo1", ep1.Address)
ep2, ok := res["addressFrom2"]
require.True(t, ok)
require.Equal(t, "addressTo2", ep2.Address)
})
t.Run("MissingCAFiles", func(t *testing.T) {
config := `
peer:
deliveryclient:
addressOverrides:
- from: addressFrom1
to: addressTo1
caCertsFile: missing/cert.pem
- from: addressFrom2
to: addressTo2
caCertsFile: testdata/cert.pem
`
viper.Reset()
viper.SetConfigType("yaml")
err := viper.ReadConfig(bytes.NewBuffer([]byte(config)))
require.NoError(t, err)
res, err := deliverservice.LoadOverridesMap()
require.NoError(t, err)
require.Len(t, res, 1)
})
t.Run("EmptyCAFiles", func(t *testing.T) {
config := `
peer:
deliveryclient:
addressOverrides:
- from: addressFrom1
to: addressTo1
- from: addressFrom2
to: addressTo2
`
viper.Reset()
viper.SetConfigType("yaml")
err := viper.ReadConfig(bytes.NewBuffer([]byte(config)))
require.NoError(t, err)
res, err := deliverservice.LoadOverridesMap()
require.NoError(t, err)
require.Len(t, res, 2)
})
t.Run("BadYaml", func(t *testing.T) {
config := `
peer:
deliveryclient:
addressOverrides: foo
`
viper.Reset()
viper.SetConfigType("yaml")
err := viper.ReadConfig(bytes.NewBuffer([]byte(config)))
require.NoError(t, err)
_, err = deliverservice.LoadOverridesMap()
require.Error(t, err)
require.Contains(t, err.Error(), "could not unmarshal peer.deliveryclient.addressOverrides:")
})
t.Run("EmptyYaml", func(t *testing.T) {
config := `
peer:
deliveryclient:
`
viper.Reset()
viper.SetConfigType("yaml")
err := viper.ReadConfig(bytes.NewBuffer([]byte(config)))
require.NoError(t, err)
res, err := deliverservice.LoadOverridesMap()
require.NoError(t, err)
require.Nil(t, res)
})
}