github.com/osdi23p228/fabric@v0.0.0-20221218062954-77808885f5db/core/deliverservice/config_test.go (about) 1 /* 2 Copyright IBM Corp. All Rights Reserved. 3 4 SPDX-License-Identifier: Apache-2.0 5 */ 6 7 package deliverservice_test 8 9 import ( 10 "bytes" 11 "io/ioutil" 12 "os" 13 "path/filepath" 14 "testing" 15 "time" 16 17 "github.com/stretchr/testify/assert" 18 "github.com/stretchr/testify/require" 19 20 "github.com/osdi23p228/fabric/core/deliverservice" 21 "github.com/osdi23p228/fabric/internal/pkg/comm" 22 "github.com/spf13/viper" 23 ) 24 25 func TestSecureOptsConfig(t *testing.T) { 26 cwd, err := os.Getwd() 27 require.NoError(t, err) 28 certPath := filepath.Join(cwd, "testdata", "cert.pem") 29 keyPath := filepath.Join(cwd, "testdata", "key.pem") 30 31 certBytes, err := ioutil.ReadFile(filepath.Join("testdata", "cert.pem")) 32 require.NoError(t, err) 33 34 keyBytes, err := ioutil.ReadFile(filepath.Join("testdata", "key.pem")) 35 require.NoError(t, err) 36 37 t.Run("client specific cert", func(t *testing.T) { 38 viper.Reset() 39 defer viper.Reset() 40 41 viper.Set("peer.tls.enabled", true) 42 viper.Set("peer.tls.clientAuthRequired", true) 43 viper.Set("peer.tls.clientCert.file", certPath) 44 viper.Set("peer.tls.clientKey.file", keyPath) 45 46 coreConfig := deliverservice.GlobalConfig() 47 48 assert.True(t, coreConfig.SecOpts.UseTLS) 49 assert.True(t, coreConfig.SecOpts.RequireClientCert) 50 assert.Equal(t, keyBytes, coreConfig.SecOpts.Key) 51 assert.Equal(t, certBytes, coreConfig.SecOpts.Certificate) 52 }) 53 54 t.Run("fallback cert", func(t *testing.T) { 55 viper.Reset() 56 defer viper.Reset() 57 58 viper.Set("peer.tls.enabled", true) 59 viper.Set("peer.tls.clientAuthRequired", true) 60 viper.Set("peer.tls.cert.file", certPath) 61 viper.Set("peer.tls.key.file", keyPath) 62 63 coreConfig := deliverservice.GlobalConfig() 64 65 assert.True(t, coreConfig.SecOpts.UseTLS) 66 assert.True(t, coreConfig.SecOpts.RequireClientCert) 67 assert.Equal(t, keyBytes, coreConfig.SecOpts.Key) 68 assert.Equal(t, certBytes, coreConfig.SecOpts.Certificate) 69 }) 70 71 t.Run("no cert", func(t *testing.T) { 72 viper.Reset() 73 defer viper.Reset() 74 75 viper.Set("peer.tls.enabled", true) 76 viper.Set("peer.tls.clientAuthRequired", true) 77 78 assert.Panics(t, func() { deliverservice.GlobalConfig() }) 79 }) 80 } 81 82 func TestGlobalConfig(t *testing.T) { 83 viper.Reset() 84 defer viper.Reset() 85 86 viper.Set("peer.tls.enabled", true) 87 viper.Set("peer.deliveryclient.reConnectBackoffThreshold", "25s") 88 viper.Set("peer.deliveryclient.reconnectTotalTimeThreshold", "20s") 89 viper.Set("peer.deliveryclient.connTimeout", "10s") 90 viper.Set("peer.keepalive.deliveryClient.interval", "5s") 91 viper.Set("peer.keepalive.deliveryClient.timeout", "2s") 92 93 coreConfig := deliverservice.GlobalConfig() 94 95 expectedConfig := &deliverservice.DeliverServiceConfig{ 96 PeerTLSEnabled: true, 97 ReConnectBackoffThreshold: 25 * time.Second, 98 ReconnectTotalTimeThreshold: 20 * time.Second, 99 ConnectionTimeout: 10 * time.Second, 100 KeepaliveOptions: comm.KeepaliveOptions{ 101 ClientInterval: time.Second * 5, 102 ClientTimeout: time.Second * 2, 103 ServerInterval: time.Hour * 2, 104 ServerTimeout: time.Second * 20, 105 ServerMinInterval: time.Minute, 106 }, 107 SecOpts: comm.SecureOptions{ 108 UseTLS: true, 109 }, 110 } 111 112 assert.Equal(t, expectedConfig, coreConfig) 113 } 114 115 func TestGlobalConfigDefault(t *testing.T) { 116 viper.Reset() 117 defer viper.Reset() 118 119 coreConfig := deliverservice.GlobalConfig() 120 121 expectedConfig := &deliverservice.DeliverServiceConfig{ 122 PeerTLSEnabled: false, 123 ReConnectBackoffThreshold: deliverservice.DefaultReConnectBackoffThreshold, 124 ReconnectTotalTimeThreshold: deliverservice.DefaultReConnectTotalTimeThreshold, 125 ConnectionTimeout: deliverservice.DefaultConnectionTimeout, 126 KeepaliveOptions: comm.DefaultKeepaliveOptions, 127 } 128 129 assert.Equal(t, expectedConfig, coreConfig) 130 } 131 132 func TestLoadOverridesMap(t *testing.T) { 133 defer viper.Reset() 134 135 t.Run("GreenPath", func(t *testing.T) { 136 config := ` 137 peer: 138 deliveryclient: 139 addressOverrides: 140 - from: addressFrom1 141 to: addressTo1 142 caCertsFile: testdata/cert.pem 143 - from: addressFrom2 144 to: addressTo2 145 caCertsFile: testdata/cert.pem 146 ` 147 148 viper.Reset() 149 viper.SetConfigType("yaml") 150 err := viper.ReadConfig(bytes.NewBuffer([]byte(config))) 151 require.NoError(t, err) 152 res, err := deliverservice.LoadOverridesMap() 153 require.NoError(t, err) 154 require.Len(t, res, 2) 155 ep1, ok := res["addressFrom1"] 156 require.True(t, ok) 157 assert.Equal(t, "addressTo1", ep1.Address) 158 ep2, ok := res["addressFrom2"] 159 require.True(t, ok) 160 assert.Equal(t, "addressTo2", ep2.Address) 161 }) 162 163 t.Run("MissingCAFiles", func(t *testing.T) { 164 config := ` 165 peer: 166 deliveryclient: 167 addressOverrides: 168 - from: addressFrom1 169 to: addressTo1 170 caCertsFile: missing/cert.pem 171 - from: addressFrom2 172 to: addressTo2 173 caCertsFile: testdata/cert.pem 174 ` 175 176 viper.Reset() 177 viper.SetConfigType("yaml") 178 err := viper.ReadConfig(bytes.NewBuffer([]byte(config))) 179 require.NoError(t, err) 180 res, err := deliverservice.LoadOverridesMap() 181 require.NoError(t, err) 182 assert.Len(t, res, 1) 183 }) 184 185 t.Run("EmptyCAFiles", func(t *testing.T) { 186 config := ` 187 peer: 188 deliveryclient: 189 addressOverrides: 190 - from: addressFrom1 191 to: addressTo1 192 - from: addressFrom2 193 to: addressTo2 194 ` 195 196 viper.Reset() 197 viper.SetConfigType("yaml") 198 err := viper.ReadConfig(bytes.NewBuffer([]byte(config))) 199 require.NoError(t, err) 200 res, err := deliverservice.LoadOverridesMap() 201 require.NoError(t, err) 202 assert.Len(t, res, 2) 203 }) 204 205 t.Run("BadYaml", func(t *testing.T) { 206 config := ` 207 peer: 208 deliveryclient: 209 addressOverrides: foo 210 ` 211 212 viper.Reset() 213 viper.SetConfigType("yaml") 214 err := viper.ReadConfig(bytes.NewBuffer([]byte(config))) 215 require.NoError(t, err) 216 _, err = deliverservice.LoadOverridesMap() 217 require.EqualError(t, err, "could not unmarshal peer.deliveryclient.addressOverrides: '': source data must be an array or slice, got string") 218 }) 219 220 t.Run("EmptyYaml", func(t *testing.T) { 221 config := ` 222 peer: 223 deliveryclient: 224 ` 225 226 viper.Reset() 227 viper.SetConfigType("yaml") 228 err := viper.ReadConfig(bytes.NewBuffer([]byte(config))) 229 require.NoError(t, err) 230 res, err := deliverservice.LoadOverridesMap() 231 require.NoError(t, err) 232 assert.Nil(t, res) 233 }) 234 }