package config import ( "reflect" "testing" "time" "github.com/stretchr/testify/assert" ) func TestDefaultConfig(t *testing.T) { assert := assert.New(t) // set up some defaults cfg := DefaultConfig() assert.NotNil(cfg.P2P) assert.NotNil(cfg.Mempool) assert.NotNil(cfg.Consensus) // check the root dir stuff... cfg.SetRoot("/foo") cfg.Genesis = "bar" cfg.DBPath = "/opt/data" cfg.Mempool.WalPath = "wal/mem/" assert.Equal("/foo/bar", cfg.GenesisFile()) assert.Equal("/opt/data", cfg.DBDir()) assert.Equal("/foo/wal/mem", cfg.Mempool.WalDir()) } func TestConfigValidateBasic(t *testing.T) { cfg := DefaultConfig() assert.NoError(t, cfg.ValidateBasic()) // tamper with timeout_propose cfg.Consensus.TimeoutPropose = -10 * time.Second assert.Error(t, cfg.ValidateBasic()) } func TestTLSConfiguration(t *testing.T) { assert := assert.New(t) cfg := DefaultConfig() cfg.SetRoot("/home/user") cfg.RPC.TLSCertFile = "file.crt" assert.Equal("/home/user/config/file.crt", cfg.RPC.CertFile()) cfg.RPC.TLSKeyFile = "file.key" assert.Equal("/home/user/config/file.key", cfg.RPC.KeyFile()) cfg.RPC.TLSCertFile = "/abs/path/to/file.crt" assert.Equal("/abs/path/to/file.crt", cfg.RPC.CertFile()) cfg.RPC.TLSKeyFile = "/abs/path/to/file.key" assert.Equal("/abs/path/to/file.key", cfg.RPC.KeyFile()) } func TestBaseConfigValidateBasic(t *testing.T) { cfg := TestBaseConfig() assert.NoError(t, cfg.ValidateBasic()) // tamper with log format cfg.LogFormat = "invalid" assert.Error(t, cfg.ValidateBasic()) } func TestRPCConfigValidateBasic(t *testing.T) { cfg := TestRPCConfig() assert.NoError(t, cfg.ValidateBasic()) fieldsToTest := []string{ "GRPCMaxOpenConnections", "MaxOpenConnections", "MaxSubscriptionClients", "MaxSubscriptionsPerClient", "TimeoutBroadcastTxCommit", "MaxBodyBytes", "MaxHeaderBytes", } for _, fieldName := range fieldsToTest { reflect.ValueOf(cfg).Elem().FieldByName(fieldName).SetInt(-1) assert.Error(t, cfg.ValidateBasic()) reflect.ValueOf(cfg).Elem().FieldByName(fieldName).SetInt(0) } } func TestP2PConfigValidateBasic(t *testing.T) { cfg := TestP2PConfig() assert.NoError(t, cfg.ValidateBasic()) fieldsToTest := []string{ "MaxNumInboundPeers", "MaxNumOutboundPeers", "FlushThrottleTimeout", "MaxPacketMsgPayloadSize", "SendRate", "RecvRate", } for _, fieldName := range fieldsToTest { reflect.ValueOf(cfg).Elem().FieldByName(fieldName).SetInt(-1) assert.Error(t, cfg.ValidateBasic()) reflect.ValueOf(cfg).Elem().FieldByName(fieldName).SetInt(0) } } func TestMempoolConfigValidateBasic(t *testing.T) { cfg := TestMempoolConfig() assert.NoError(t, cfg.ValidateBasic()) fieldsToTest := []string{ "Size", "MaxTxsBytes", "CacheSize", "MaxTxBytes", } for _, fieldName := range fieldsToTest { reflect.ValueOf(cfg).Elem().FieldByName(fieldName).SetInt(-1) assert.Error(t, cfg.ValidateBasic()) reflect.ValueOf(cfg).Elem().FieldByName(fieldName).SetInt(0) } } func TestFastSyncConfigValidateBasic(t *testing.T) { cfg := TestFastSyncConfig() assert.NoError(t, cfg.ValidateBasic()) // tamper with version cfg.Version = "v1" assert.NoError(t, cfg.ValidateBasic()) cfg.Version = "invalid" assert.Error(t, cfg.ValidateBasic()) } func TestConsensusConfigValidateBasic(t *testing.T) { cfg := TestConsensusConfig() assert.NoError(t, cfg.ValidateBasic()) fieldsToTest := []string{ "TimeoutPropose", "TimeoutProposeDelta", "TimeoutPrevote", "TimeoutPrevoteDelta", "TimeoutPrecommit", "TimeoutPrecommitDelta", "TimeoutCommit", "CreateEmptyBlocksInterval", "PeerGossipSleepDuration", "PeerQueryMaj23SleepDuration", } for _, fieldName := range fieldsToTest { reflect.ValueOf(cfg).Elem().FieldByName(fieldName).SetInt(-1) assert.Error(t, cfg.ValidateBasic()) reflect.ValueOf(cfg).Elem().FieldByName(fieldName).SetInt(0) } } func TestInstrumentationConfigValidateBasic(t *testing.T) { cfg := TestInstrumentationConfig() assert.NoError(t, cfg.ValidateBasic()) // tamper with maximum open connections cfg.MaxOpenConnections = -1 assert.Error(t, cfg.ValidateBasic()) }