github.com/Finschia/ostracon@v1.1.5/config/config_test.go (about) 1 package config 2 3 import ( 4 "reflect" 5 "testing" 6 "time" 7 8 "github.com/stretchr/testify/assert" 9 "github.com/stretchr/testify/require" 10 ) 11 12 func TestDefaultConfig(t *testing.T) { 13 assert := assert.New(t) 14 15 // set up some defaults 16 cfg := DefaultConfig() 17 assert.NotNil(cfg.P2P) 18 assert.NotNil(cfg.Mempool) 19 assert.NotNil(cfg.Consensus) 20 21 // check the root dir stuff... 22 cfg.SetRoot("/foo") 23 cfg.Genesis = "bar" 24 cfg.DBPath = "/opt/data" 25 cfg.Mempool.WalPath = "wal/mem/" 26 27 assert.Equal("/foo/bar", cfg.GenesisFile()) 28 assert.Equal("/opt/data", cfg.DBDir()) 29 assert.Equal("/foo/wal/mem", cfg.Mempool.WalDir()) 30 } 31 32 func TestConfigValidateBasic(t *testing.T) { 33 cfg := DefaultConfig() 34 assert.NoError(t, cfg.ValidateBasic()) 35 36 // tamper with timeout_propose 37 cfg.Consensus.TimeoutPropose = -10 * time.Second 38 assert.Error(t, cfg.ValidateBasic()) 39 } 40 41 func TestTLSConfiguration(t *testing.T) { 42 assert := assert.New(t) 43 cfg := DefaultConfig() 44 cfg.SetRoot("/home/user") 45 46 cfg.RPC.TLSCertFile = "file.crt" 47 assert.Equal("/home/user/config/file.crt", cfg.RPC.CertFile()) 48 cfg.RPC.TLSKeyFile = "file.key" 49 assert.Equal("/home/user/config/file.key", cfg.RPC.KeyFile()) 50 51 cfg.RPC.TLSCertFile = "/abs/path/to/file.crt" 52 assert.Equal("/abs/path/to/file.crt", cfg.RPC.CertFile()) 53 cfg.RPC.TLSKeyFile = "/abs/path/to/file.key" 54 assert.Equal("/abs/path/to/file.key", cfg.RPC.KeyFile()) 55 } 56 57 func TestBaseConfigValidateBasic(t *testing.T) { 58 cfg := TestBaseConfig() 59 assert.NoError(t, cfg.ValidateBasic()) 60 61 // tamper with log format 62 cfg.LogFormat = "invalid" 63 assert.Error(t, cfg.ValidateBasic()) 64 } 65 66 func TestRPCConfigValidateBasic(t *testing.T) { 67 cfg := TestRPCConfig() 68 assert.NoError(t, cfg.ValidateBasic()) 69 70 fieldsToTest := []string{ 71 "GRPCMaxOpenConnections", 72 "MaxOpenConnections", 73 "MaxSubscriptionClients", 74 "MaxSubscriptionsPerClient", 75 "TimeoutBroadcastTxCommit", 76 "MaxBodyBytes", 77 "MaxBatchRequestNum", 78 "MaxHeaderBytes", 79 } 80 81 for _, fieldName := range fieldsToTest { 82 reflect.ValueOf(cfg).Elem().FieldByName(fieldName).SetInt(-1) 83 assert.Error(t, cfg.ValidateBasic()) 84 reflect.ValueOf(cfg).Elem().FieldByName(fieldName).SetInt(0) 85 } 86 } 87 88 func TestP2PConfigValidateBasic(t *testing.T) { 89 cfg := TestP2PConfig() 90 assert.NoError(t, cfg.ValidateBasic()) 91 92 fieldsToTest := []string{ 93 "MaxNumInboundPeers", 94 "MaxNumOutboundPeers", 95 "FlushThrottleTimeout", 96 "MaxPacketMsgPayloadSize", 97 "SendRate", 98 "RecvRate", 99 } 100 101 for _, fieldName := range fieldsToTest { 102 reflect.ValueOf(cfg).Elem().FieldByName(fieldName).SetInt(-1) 103 assert.Error(t, cfg.ValidateBasic()) 104 reflect.ValueOf(cfg).Elem().FieldByName(fieldName).SetInt(0) 105 } 106 } 107 108 func TestMempoolConfigValidateBasic(t *testing.T) { 109 cfg := TestMempoolConfig() 110 assert.NoError(t, cfg.ValidateBasic()) 111 112 fieldsToTest := []string{ 113 "Size", 114 "MaxTxsBytes", 115 "CacheSize", 116 "MaxTxBytes", 117 } 118 119 for _, fieldName := range fieldsToTest { 120 reflect.ValueOf(cfg).Elem().FieldByName(fieldName).SetInt(-1) 121 assert.Error(t, cfg.ValidateBasic()) 122 reflect.ValueOf(cfg).Elem().FieldByName(fieldName).SetInt(0) 123 } 124 } 125 126 func TestStateSyncConfigValidateBasic(t *testing.T) { 127 cfg := TestStateSyncConfig() 128 require.NoError(t, cfg.ValidateBasic()) 129 130 testVerify := func(expectedError string) { 131 actual := cfg.ValidateBasic() 132 require.Error(t, actual) 133 require.Equal(t, expectedError, actual.Error()) 134 } 135 136 // Enabled 137 cfg.Enable = true 138 testVerify("rpc_servers is required") 139 cfg.RPCServers = []string{""} 140 testVerify("at least two rpc_servers entries is required") 141 cfg.RPCServers = []string{"", ""} 142 testVerify("found empty rpc_servers entry") 143 cfg.RPCServers = []string{"a", "b"} 144 cfg.DiscoveryTime = 1 * time.Second 145 testVerify("discovery time must be 0s or greater than five seconds") 146 cfg.DiscoveryTime = 0 147 cfg.TrustPeriod = 0 148 testVerify("trusted_period is required") 149 cfg.TrustPeriod = 1 150 testVerify("trusted_height is required") 151 cfg.TrustHeight = 1 152 testVerify("trusted_hash is required") 153 cfg.TrustHash = "0" 154 testVerify("invalid trusted_hash: encoding/hex: odd length hex string") 155 cfg.TrustHash = "00" 156 // Success with Enabled 157 require.NoError(t, cfg.ValidateBasic()) 158 } 159 160 func TestFastSyncConfigValidateBasic(t *testing.T) { 161 cfg := TestFastSyncConfig() 162 assert.NoError(t, cfg.ValidateBasic()) 163 164 // tamper with version 165 cfg.Version = "v1" 166 assert.NoError(t, cfg.ValidateBasic()) 167 168 cfg.Version = "invalid" 169 assert.Error(t, cfg.ValidateBasic()) 170 } 171 172 //nolint:lll 173 func TestConsensusConfig_ValidateBasic(t *testing.T) { 174 // nolint: lll 175 testcases := map[string]struct { 176 modify func(*ConsensusConfig) 177 expectErr bool 178 }{ 179 "TimeoutPropose": {func(c *ConsensusConfig) { c.TimeoutPropose = time.Second }, false}, 180 "TimeoutPropose negative": {func(c *ConsensusConfig) { c.TimeoutPropose = -1 }, true}, 181 "TimeoutProposeDelta": {func(c *ConsensusConfig) { c.TimeoutProposeDelta = time.Second }, false}, 182 "TimeoutProposeDelta negative": {func(c *ConsensusConfig) { c.TimeoutProposeDelta = -1 }, true}, 183 "TimeoutPrevote": {func(c *ConsensusConfig) { c.TimeoutPrevote = time.Second }, false}, 184 "TimeoutPrevote negative": {func(c *ConsensusConfig) { c.TimeoutPrevote = -1 }, true}, 185 "TimeoutPrevoteDelta": {func(c *ConsensusConfig) { c.TimeoutPrevoteDelta = time.Second }, false}, 186 "TimeoutPrevoteDelta negative": {func(c *ConsensusConfig) { c.TimeoutPrevoteDelta = -1 }, true}, 187 "TimeoutPrecommit": {func(c *ConsensusConfig) { c.TimeoutPrecommit = time.Second }, false}, 188 "TimeoutPrecommit negative": {func(c *ConsensusConfig) { c.TimeoutPrecommit = -1 }, true}, 189 "TimeoutPrecommitDelta": {func(c *ConsensusConfig) { c.TimeoutPrecommitDelta = time.Second }, false}, 190 "TimeoutPrecommitDelta negative": {func(c *ConsensusConfig) { c.TimeoutPrecommitDelta = -1 }, true}, 191 "TimeoutCommit": {func(c *ConsensusConfig) { c.TimeoutCommit = time.Second }, false}, 192 "TimeoutCommit negative": {func(c *ConsensusConfig) { c.TimeoutCommit = -1 }, true}, 193 "PeerGossipSleepDuration": {func(c *ConsensusConfig) { c.PeerGossipSleepDuration = time.Second }, false}, 194 "PeerGossipSleepDuration negative": {func(c *ConsensusConfig) { c.PeerGossipSleepDuration = -1 }, true}, 195 "PeerQueryMaj23SleepDuration": {func(c *ConsensusConfig) { c.PeerQueryMaj23SleepDuration = time.Second }, false}, 196 "PeerQueryMaj23SleepDuration negative": {func(c *ConsensusConfig) { c.PeerQueryMaj23SleepDuration = -1 }, true}, 197 "DoubleSignCheckHeight negative": {func(c *ConsensusConfig) { c.DoubleSignCheckHeight = -1 }, true}, 198 } 199 for desc, tc := range testcases { 200 tc := tc // appease linter 201 t.Run(desc, func(t *testing.T) { 202 cfg := DefaultConsensusConfig() 203 tc.modify(cfg) 204 205 err := cfg.ValidateBasic() 206 if tc.expectErr { 207 assert.Error(t, err) 208 } else { 209 assert.NoError(t, err) 210 } 211 }) 212 } 213 } 214 215 func TestInstrumentationConfigValidateBasic(t *testing.T) { 216 cfg := TestInstrumentationConfig() 217 assert.NoError(t, cfg.ValidateBasic()) 218 219 // tamper with maximum open connections 220 cfg.MaxOpenConnections = -1 221 assert.Error(t, cfg.ValidateBasic()) 222 }