From 62fc3e2c497d983a6266221985e52ff56ad74ed1 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Mon, 23 Apr 2018 12:35:09 +0200 Subject: [PATCH 1/6] Context-accessible logger field --- CHANGELOG.md | 1 + baseapp/baseapp.go | 8 ++++---- examples/democoin/x/pow/handler_test.go | 3 ++- examples/democoin/x/pow/keeper_test.go | 3 ++- examples/democoin/x/simplestake/keeper_test.go | 5 +++-- types/context.go | 13 ++++++++++--- types/context_test.go | 5 +++-- x/auth/ante_test.go | 11 ++++++----- x/auth/context_test.go | 3 ++- x/auth/mapper_test.go | 3 ++- x/bank/keeper_test.go | 7 ++++--- x/ibc/ibc_test.go | 3 ++- x/stake/test_common.go | 3 ++- 13 files changed, 43 insertions(+), 25 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7fe6c4cf2a..a1799ea5ab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,7 @@ FEATURES: * Create genesis transactions with `gaiad init gen-tx` * New genesis account keys are automatically added to the client keybase (introduce `--client-home` flag) * Initialize with genesis txs using `--gen-txs` flag +* Context now has access to the applicaiton logger BREAKING CHANGES diff --git a/baseapp/baseapp.go b/baseapp/baseapp.go index 51e96ae207..21b45e0aff 100644 --- a/baseapp/baseapp.go +++ b/baseapp/baseapp.go @@ -210,9 +210,9 @@ func (app *BaseApp) initFromStore(mainKey sdk.StoreKey) error { // NewContext returns a new Context with the correct store, the given header, and nil txBytes. func (app *BaseApp) NewContext(isCheckTx bool, header abci.Header) sdk.Context { if isCheckTx { - return sdk.NewContext(app.checkState.ms, header, true, nil) + return sdk.NewContext(app.checkState.ms, header, true, nil, log.NewNopLogger()) } - return sdk.NewContext(app.deliverState.ms, header, false, nil) + return sdk.NewContext(app.deliverState.ms, header, false, nil, log.NewNopLogger()) } type state struct { @@ -228,7 +228,7 @@ func (app *BaseApp) setCheckState(header abci.Header) { ms := app.cms.CacheMultiStore() app.checkState = &state{ ms: ms, - ctx: sdk.NewContext(ms, header, true, nil), + ctx: sdk.NewContext(ms, header, true, nil, log.NewNopLogger()), } } @@ -236,7 +236,7 @@ func (app *BaseApp) setDeliverState(header abci.Header) { ms := app.cms.CacheMultiStore() app.deliverState = &state{ ms: ms, - ctx: sdk.NewContext(ms, header, false, nil), + ctx: sdk.NewContext(ms, header, false, nil, log.NewNopLogger()), } } diff --git a/examples/democoin/x/pow/handler_test.go b/examples/democoin/x/pow/handler_test.go index 0fffb8f5b2..30aeafa2a5 100644 --- a/examples/democoin/x/pow/handler_test.go +++ b/examples/democoin/x/pow/handler_test.go @@ -6,6 +6,7 @@ import ( "github.com/stretchr/testify/assert" abci "github.com/tendermint/abci/types" + "github.com/tendermint/tmlibs/log" sdk "github.com/cosmos/cosmos-sdk/types" wire "github.com/cosmos/cosmos-sdk/wire" @@ -19,7 +20,7 @@ func TestPowHandler(t *testing.T) { auth.RegisterBaseAccount(cdc) am := auth.NewAccountMapper(cdc, capKey, &auth.BaseAccount{}) - ctx := sdk.NewContext(ms, abci.Header{}, false, nil) + ctx := sdk.NewContext(ms, abci.Header{}, false, nil, log.NewNopLogger()) config := NewConfig("pow", int64(1)) ck := bank.NewKeeper(am) keeper := NewKeeper(capKey, config, ck, DefaultCodespace) diff --git a/examples/democoin/x/pow/keeper_test.go b/examples/democoin/x/pow/keeper_test.go index cb021eb16b..a4afb876a9 100644 --- a/examples/democoin/x/pow/keeper_test.go +++ b/examples/democoin/x/pow/keeper_test.go @@ -7,6 +7,7 @@ import ( abci "github.com/tendermint/abci/types" dbm "github.com/tendermint/tmlibs/db" + "github.com/tendermint/tmlibs/log" "github.com/cosmos/cosmos-sdk/store" sdk "github.com/cosmos/cosmos-sdk/types" @@ -32,7 +33,7 @@ func TestPowKeeperGetSet(t *testing.T) { auth.RegisterBaseAccount(cdc) am := auth.NewAccountMapper(cdc, capKey, &auth.BaseAccount{}) - ctx := sdk.NewContext(ms, abci.Header{}, false, nil) + ctx := sdk.NewContext(ms, abci.Header{}, false, nil, log.NewNopLogger()) config := NewConfig("pow", int64(1)) ck := bank.NewKeeper(am) keeper := NewKeeper(capKey, config, ck, DefaultCodespace) diff --git a/examples/democoin/x/simplestake/keeper_test.go b/examples/democoin/x/simplestake/keeper_test.go index 75e9fcdedd..302a2e58b6 100644 --- a/examples/democoin/x/simplestake/keeper_test.go +++ b/examples/democoin/x/simplestake/keeper_test.go @@ -10,6 +10,7 @@ import ( abci "github.com/tendermint/abci/types" crypto "github.com/tendermint/go-crypto" dbm "github.com/tendermint/tmlibs/db" + "github.com/tendermint/tmlibs/log" "github.com/cosmos/cosmos-sdk/store" sdk "github.com/cosmos/cosmos-sdk/types" @@ -32,7 +33,7 @@ func setupMultiStore() (sdk.MultiStore, *sdk.KVStoreKey, *sdk.KVStoreKey) { func TestKeeperGetSet(t *testing.T) { ms, _, capKey := setupMultiStore() - ctx := sdk.NewContext(ms, abci.Header{}, false, nil) + ctx := sdk.NewContext(ms, abci.Header{}, false, nil, log.NewNopLogger()) stakeKeeper := NewKeeper(capKey, bank.NewKeeper(nil), DefaultCodespace) addr := sdk.Address([]byte("some-address")) @@ -59,7 +60,7 @@ func TestBonding(t *testing.T) { cdc := wire.NewCodec() auth.RegisterBaseAccount(cdc) - ctx := sdk.NewContext(ms, abci.Header{}, false, nil) + ctx := sdk.NewContext(ms, abci.Header{}, false, nil, log.NewNopLogger()) accountMapper := auth.NewAccountMapper(cdc, authKey, &auth.BaseAccount{}) coinKeeper := bank.NewKeeper(accountMapper) diff --git a/types/context.go b/types/context.go index 8c91175bc6..e28523ebeb 100644 --- a/types/context.go +++ b/types/context.go @@ -7,10 +7,9 @@ import ( "github.com/golang/protobuf/proto" abci "github.com/tendermint/abci/types" + "github.com/tendermint/tmlibs/log" ) -// TODO: Add a default logger. - /* The intent of Context is for it to be an immutable object that can be cloned and updated cheaply with WithValue() and passed forward to the @@ -31,7 +30,7 @@ type Context struct { } // create a new context -func NewContext(ms MultiStore, header abci.Header, isCheckTx bool, txBytes []byte) Context { +func NewContext(ms MultiStore, header abci.Header, isCheckTx bool, txBytes []byte, logger log.Logger) Context { c := Context{ Context: context.Background(), pst: newThePast(), @@ -43,6 +42,7 @@ func NewContext(ms MultiStore, header abci.Header, isCheckTx bool, txBytes []byt c = c.WithChainID(header.ChainID) c = c.WithIsCheckTx(isCheckTx) c = c.WithTxBytes(txBytes) + c = c.WithLogger(logger) return c } @@ -126,6 +126,7 @@ const ( contextKeyChainID contextKeyIsCheckTx contextKeyTxBytes + contextKeyLogger ) // NOTE: Do not expose MultiStore. @@ -151,6 +152,9 @@ func (c Context) IsCheckTx() bool { func (c Context) TxBytes() []byte { return c.Value(contextKeyTxBytes).([]byte) } +func (c Context) Logger() log.Logger { + return c.Value(contextKeyLogger).(log.Logger) +} func (c Context) WithMultiStore(ms MultiStore) Context { return c.withValue(contextKeyMultiStore, ms) } @@ -170,6 +174,9 @@ func (c Context) WithIsCheckTx(isCheckTx bool) Context { func (c Context) WithTxBytes(txBytes []byte) Context { return c.withValue(contextKeyTxBytes, txBytes) } +func (c Context) WithLogger(logger log.Logger) Context { + return c.withValue(contextKeyLogger, logger) +} // Cache the multistore and return a new cached context. The cached context is // written to the context when writeCache is called. diff --git a/types/context_test.go b/types/context_test.go index b40e79dc2a..ebed046cef 100644 --- a/types/context_test.go +++ b/types/context_test.go @@ -6,6 +6,7 @@ import ( "github.com/stretchr/testify/assert" dbm "github.com/tendermint/tmlibs/db" + "github.com/tendermint/tmlibs/log" "github.com/cosmos/cosmos-sdk/store" "github.com/cosmos/cosmos-sdk/types" @@ -14,7 +15,7 @@ import ( func TestContextGetOpShouldNeverPanic(t *testing.T) { var ms types.MultiStore - ctx := types.NewContext(ms, abci.Header{}, false, nil) + ctx := types.NewContext(ms, abci.Header{}, false, nil, log.NewNopLogger()) indices := []int64{ -10, 1, 0, 10, 20, } @@ -29,7 +30,7 @@ func defaultContext(key types.StoreKey) types.Context { cms := store.NewCommitMultiStore(db) cms.MountStoreWithDB(key, types.StoreTypeIAVL, db) cms.LoadLatestVersion() - ctx := types.NewContext(cms, abci.Header{}, false, nil) + ctx := types.NewContext(cms, abci.Header{}, false, nil, log.NewNopLogger()) return ctx } diff --git a/x/auth/ante_test.go b/x/auth/ante_test.go index 3baf8ee716..ec296b12be 100644 --- a/x/auth/ante_test.go +++ b/x/auth/ante_test.go @@ -7,6 +7,7 @@ import ( "github.com/stretchr/testify/require" abci "github.com/tendermint/abci/types" crypto "github.com/tendermint/go-crypto" + "github.com/tendermint/tmlibs/log" sdk "github.com/cosmos/cosmos-sdk/types" wire "github.com/cosmos/cosmos-sdk/wire" @@ -73,7 +74,7 @@ func TestAnteHandlerSigErrors(t *testing.T) { RegisterBaseAccount(cdc) mapper := NewAccountMapper(cdc, capKey, &BaseAccount{}) anteHandler := NewAnteHandler(mapper, BurnFeeHandler) - ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil) + ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil, log.NewNopLogger()) // keys and addresses priv1, addr1 := privAndAddr() @@ -114,7 +115,7 @@ func TestAnteHandlerSequences(t *testing.T) { RegisterBaseAccount(cdc) mapper := NewAccountMapper(cdc, capKey, &BaseAccount{}) anteHandler := NewAnteHandler(mapper, BurnFeeHandler) - ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil) + ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil, log.NewNopLogger()) // keys and addresses priv1, addr1 := privAndAddr() @@ -180,7 +181,7 @@ func TestAnteHandlerFees(t *testing.T) { RegisterBaseAccount(cdc) mapper := NewAccountMapper(cdc, capKey, &BaseAccount{}) anteHandler := NewAnteHandler(mapper, BurnFeeHandler) - ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil) + ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil, log.NewNopLogger()) // keys and addresses priv1, addr1 := privAndAddr() @@ -217,7 +218,7 @@ func TestAnteHandlerBadSignBytes(t *testing.T) { RegisterBaseAccount(cdc) mapper := NewAccountMapper(cdc, capKey, &BaseAccount{}) anteHandler := NewAnteHandler(mapper, BurnFeeHandler) - ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil) + ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil, log.NewNopLogger()) // keys and addresses priv1, addr1 := privAndAddr() @@ -292,7 +293,7 @@ func TestAnteHandlerSetPubKey(t *testing.T) { RegisterBaseAccount(cdc) mapper := NewAccountMapper(cdc, capKey, &BaseAccount{}) anteHandler := NewAnteHandler(mapper, BurnFeeHandler) - ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil) + ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil, log.NewNopLogger()) // keys and addresses priv1, addr1 := privAndAddr() diff --git a/x/auth/context_test.go b/x/auth/context_test.go index 0e4db8b080..89e318e0a1 100644 --- a/x/auth/context_test.go +++ b/x/auth/context_test.go @@ -6,13 +6,14 @@ import ( "github.com/stretchr/testify/assert" abci "github.com/tendermint/abci/types" + "github.com/tendermint/tmlibs/log" sdk "github.com/cosmos/cosmos-sdk/types" ) func TestContextWithSigners(t *testing.T) { ms, _ := setupMultiStore() - ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil) + ctx := sdk.NewContext(ms, abci.Header{ChainID: "mychainid"}, false, nil, log.NewNopLogger()) _, _, addr1 := keyPubAddr() _, _, addr2 := keyPubAddr() diff --git a/x/auth/mapper_test.go b/x/auth/mapper_test.go index 2912ddde8b..cdd418990a 100644 --- a/x/auth/mapper_test.go +++ b/x/auth/mapper_test.go @@ -7,6 +7,7 @@ import ( abci "github.com/tendermint/abci/types" dbm "github.com/tendermint/tmlibs/db" + "github.com/tendermint/tmlibs/log" "github.com/cosmos/cosmos-sdk/store" sdk "github.com/cosmos/cosmos-sdk/types" @@ -28,7 +29,7 @@ func TestAccountMapperGetSet(t *testing.T) { RegisterBaseAccount(cdc) // make context and mapper - ctx := sdk.NewContext(ms, abci.Header{}, false, nil) + ctx := sdk.NewContext(ms, abci.Header{}, false, nil, log.NewNopLogger()) mapper := NewAccountMapper(cdc, capKey, &BaseAccount{}) addr := sdk.Address([]byte("some-address")) diff --git a/x/bank/keeper_test.go b/x/bank/keeper_test.go index 7db9c275d3..4394392dde 100644 --- a/x/bank/keeper_test.go +++ b/x/bank/keeper_test.go @@ -7,6 +7,7 @@ import ( abci "github.com/tendermint/abci/types" dbm "github.com/tendermint/tmlibs/db" + "github.com/tendermint/tmlibs/log" "github.com/cosmos/cosmos-sdk/store" sdk "github.com/cosmos/cosmos-sdk/types" @@ -30,7 +31,7 @@ func TestKeeper(t *testing.T) { cdc := wire.NewCodec() auth.RegisterBaseAccount(cdc) - ctx := sdk.NewContext(ms, abci.Header{}, false, nil) + ctx := sdk.NewContext(ms, abci.Header{}, false, nil, log.NewNopLogger()) accountMapper := auth.NewAccountMapper(cdc, authKey, &auth.BaseAccount{}) coinKeeper := NewKeeper(accountMapper) @@ -116,7 +117,7 @@ func TestSendKeeper(t *testing.T) { cdc := wire.NewCodec() auth.RegisterBaseAccount(cdc) - ctx := sdk.NewContext(ms, abci.Header{}, false, nil) + ctx := sdk.NewContext(ms, abci.Header{}, false, nil, log.NewNopLogger()) accountMapper := auth.NewAccountMapper(cdc, authKey, &auth.BaseAccount{}) coinKeeper := NewKeeper(accountMapper) sendKeeper := NewSendKeeper(accountMapper) @@ -185,7 +186,7 @@ func TestViewKeeper(t *testing.T) { cdc := wire.NewCodec() auth.RegisterBaseAccount(cdc) - ctx := sdk.NewContext(ms, abci.Header{}, false, nil) + ctx := sdk.NewContext(ms, abci.Header{}, false, nil, log.NewNopLogger()) accountMapper := auth.NewAccountMapper(cdc, authKey, &auth.BaseAccount{}) coinKeeper := NewKeeper(accountMapper) viewKeeper := NewViewKeeper(accountMapper) diff --git a/x/ibc/ibc_test.go b/x/ibc/ibc_test.go index 61b9182f1e..d0019002fd 100644 --- a/x/ibc/ibc_test.go +++ b/x/ibc/ibc_test.go @@ -8,6 +8,7 @@ import ( abci "github.com/tendermint/abci/types" "github.com/tendermint/go-crypto" dbm "github.com/tendermint/tmlibs/db" + "github.com/tendermint/tmlibs/log" "github.com/cosmos/cosmos-sdk/store" sdk "github.com/cosmos/cosmos-sdk/types" @@ -23,7 +24,7 @@ func defaultContext(key sdk.StoreKey) sdk.Context { cms := store.NewCommitMultiStore(db) cms.MountStoreWithDB(key, sdk.StoreTypeIAVL, db) cms.LoadLatestVersion() - ctx := sdk.NewContext(cms, abci.Header{}, false, nil) + ctx := sdk.NewContext(cms, abci.Header{}, false, nil, log.NewNopLogger()) return ctx } diff --git a/x/stake/test_common.go b/x/stake/test_common.go index 189deeff03..27acebe086 100644 --- a/x/stake/test_common.go +++ b/x/stake/test_common.go @@ -10,6 +10,7 @@ import ( abci "github.com/tendermint/abci/types" crypto "github.com/tendermint/go-crypto" dbm "github.com/tendermint/tmlibs/db" + "github.com/tendermint/tmlibs/log" "github.com/cosmos/cosmos-sdk/store" sdk "github.com/cosmos/cosmos-sdk/types" @@ -157,7 +158,7 @@ func createTestInput(t *testing.T, isCheckTx bool, initCoins int64) (sdk.Context err := ms.LoadLatestVersion() require.Nil(t, err) - ctx := sdk.NewContext(ms, abci.Header{ChainID: "foochainid"}, isCheckTx, nil) + ctx := sdk.NewContext(ms, abci.Header{ChainID: "foochainid"}, isCheckTx, nil, log.NewNopLogger()) cdc := makeTestCodec() accountMapper := auth.NewAccountMapper( cdc, // amino codec From c7cd21955a9ea7ac5bf030b5b640959934480efc Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Mon, 23 Apr 2018 13:22:07 +0200 Subject: [PATCH 2/6] Add MemLogger --- types/logger.go | 49 ++++++++++++++++++++++++++++++++++++++++++++ types/logger_test.go | 17 +++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 types/logger.go create mode 100644 types/logger_test.go diff --git a/types/logger.go b/types/logger.go new file mode 100644 index 0000000000..f736b01209 --- /dev/null +++ b/types/logger.go @@ -0,0 +1,49 @@ +package types + +import ( + "github.com/tendermint/tmlibs/log" +) + +// MemLogger logs to memory +type MemLogger interface { + log.Logger + Logs() []LogEntry +} + +// LogEntry is an entry in a log +type LogEntry struct { + Level string + Message string + Keyvals []interface{} +} + +type memLogger struct { + entries *[]LogEntry +} + +func (l memLogger) Debug(msg string, keyvals ...interface{}) { + *l.entries = append(*l.entries, LogEntry{"debug", msg, keyvals}) +} + +func (l memLogger) Info(msg string, keyvals ...interface{}) { + *l.entries = append(*l.entries, LogEntry{"info", msg, keyvals}) +} + +func (l memLogger) Error(msg string, keyvals ...interface{}) { + *l.entries = append(*l.entries, LogEntry{"error", msg, keyvals}) +} + +func (l memLogger) With(keyvals ...interface{}) log.Logger { + panic("not implemented") +} + +func (l memLogger) Logs() []LogEntry { + return *l.entries +} + +func NewMemLogger() MemLogger { + entries := make([]LogEntry, 0) + return &memLogger{ + entries: &entries, + } +} diff --git a/types/logger_test.go b/types/logger_test.go new file mode 100644 index 0000000000..e8cb51e113 --- /dev/null +++ b/types/logger_test.go @@ -0,0 +1,17 @@ +package types + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestMemLogger(t *testing.T) { + logger := NewMemLogger() + logger.Info("msg") + require.Equal(t, logger.Logs(), []LogEntry{LogEntry{"info", "msg", nil}}) + logger.Debug("msg2") + require.Equal(t, logger.Logs(), []LogEntry{LogEntry{"info", "msg", nil}, LogEntry{"debug", "msg2", nil}}) + logger.Error("msg3", 2) + require.Equal(t, logger.Logs(), []LogEntry{LogEntry{"info", "msg", nil}, LogEntry{"debug", "msg2", nil}, LogEntry{"error", "msg3", []interface{}{2}}}) +} From ad6c7f0be45a58f2f6d63d83defe908cd44fa058 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Wed, 25 Apr 2018 13:28:04 +0200 Subject: [PATCH 3/6] Remove MemLogger, update baseapp --- baseapp/baseapp.go | 8 ++++---- types/logger.go | 49 -------------------------------------------- types/logger_test.go | 17 --------------- 3 files changed, 4 insertions(+), 70 deletions(-) delete mode 100644 types/logger.go delete mode 100644 types/logger_test.go diff --git a/baseapp/baseapp.go b/baseapp/baseapp.go index 21b45e0aff..d3bf85fe81 100644 --- a/baseapp/baseapp.go +++ b/baseapp/baseapp.go @@ -210,9 +210,9 @@ func (app *BaseApp) initFromStore(mainKey sdk.StoreKey) error { // NewContext returns a new Context with the correct store, the given header, and nil txBytes. func (app *BaseApp) NewContext(isCheckTx bool, header abci.Header) sdk.Context { if isCheckTx { - return sdk.NewContext(app.checkState.ms, header, true, nil, log.NewNopLogger()) + return sdk.NewContext(app.checkState.ms, header, true, nil, app.Logger) } - return sdk.NewContext(app.deliverState.ms, header, false, nil, log.NewNopLogger()) + return sdk.NewContext(app.deliverState.ms, header, false, nil, app.Logger) } type state struct { @@ -228,7 +228,7 @@ func (app *BaseApp) setCheckState(header abci.Header) { ms := app.cms.CacheMultiStore() app.checkState = &state{ ms: ms, - ctx: sdk.NewContext(ms, header, true, nil, log.NewNopLogger()), + ctx: sdk.NewContext(ms, header, true, nil, app.Logger), } } @@ -236,7 +236,7 @@ func (app *BaseApp) setDeliverState(header abci.Header) { ms := app.cms.CacheMultiStore() app.deliverState = &state{ ms: ms, - ctx: sdk.NewContext(ms, header, false, nil, log.NewNopLogger()), + ctx: sdk.NewContext(ms, header, false, nil, app.Logger), } } diff --git a/types/logger.go b/types/logger.go deleted file mode 100644 index f736b01209..0000000000 --- a/types/logger.go +++ /dev/null @@ -1,49 +0,0 @@ -package types - -import ( - "github.com/tendermint/tmlibs/log" -) - -// MemLogger logs to memory -type MemLogger interface { - log.Logger - Logs() []LogEntry -} - -// LogEntry is an entry in a log -type LogEntry struct { - Level string - Message string - Keyvals []interface{} -} - -type memLogger struct { - entries *[]LogEntry -} - -func (l memLogger) Debug(msg string, keyvals ...interface{}) { - *l.entries = append(*l.entries, LogEntry{"debug", msg, keyvals}) -} - -func (l memLogger) Info(msg string, keyvals ...interface{}) { - *l.entries = append(*l.entries, LogEntry{"info", msg, keyvals}) -} - -func (l memLogger) Error(msg string, keyvals ...interface{}) { - *l.entries = append(*l.entries, LogEntry{"error", msg, keyvals}) -} - -func (l memLogger) With(keyvals ...interface{}) log.Logger { - panic("not implemented") -} - -func (l memLogger) Logs() []LogEntry { - return *l.entries -} - -func NewMemLogger() MemLogger { - entries := make([]LogEntry, 0) - return &memLogger{ - entries: &entries, - } -} diff --git a/types/logger_test.go b/types/logger_test.go deleted file mode 100644 index e8cb51e113..0000000000 --- a/types/logger_test.go +++ /dev/null @@ -1,17 +0,0 @@ -package types - -import ( - "testing" - - "github.com/stretchr/testify/require" -) - -func TestMemLogger(t *testing.T) { - logger := NewMemLogger() - logger.Info("msg") - require.Equal(t, logger.Logs(), []LogEntry{LogEntry{"info", "msg", nil}}) - logger.Debug("msg2") - require.Equal(t, logger.Logs(), []LogEntry{LogEntry{"info", "msg", nil}, LogEntry{"debug", "msg2", nil}}) - logger.Error("msg3", 2) - require.Equal(t, logger.Logs(), []LogEntry{LogEntry{"info", "msg", nil}, LogEntry{"debug", "msg2", nil}, LogEntry{"error", "msg3", []interface{}{2}}}) -} From db3a82fc97fe22a40ac253fc0f200d5f0acd499d Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Wed, 25 Apr 2018 13:30:58 +0200 Subject: [PATCH 4/6] Update changelog, add simple testcase --- CHANGELOG.md | 2 +- types/context_test.go | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a1799ea5ab..98eef848d2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,7 +27,7 @@ FEATURES: * Create genesis transactions with `gaiad init gen-tx` * New genesis account keys are automatically added to the client keybase (introduce `--client-home` flag) * Initialize with genesis txs using `--gen-txs` flag -* Context now has access to the applicaiton logger +* Context now has access to the application-configured logger BREAKING CHANGES diff --git a/types/context_test.go b/types/context_test.go index ebed046cef..d813516f0b 100644 --- a/types/context_test.go +++ b/types/context_test.go @@ -60,3 +60,11 @@ func TestCacheContext(t *testing.T) { assert.Equal(t, v2, store.Get(k2)) } + +func TestLogContext(t *testing.T) { + key := types.NewKVStoreKey(t.Name()) + ctx := defaultContext(key) + ctx.Logger().Debug("debug") + ctx.Logger().Info("info") + ctx.Logger().Error("error") +} From 36e096d4bb163a639aab6e35a51815cb24b4956e Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Wed, 25 Apr 2018 22:03:45 +0200 Subject: [PATCH 5/6] Update testcase after rebase --- types/lib/mapper_test.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/types/lib/mapper_test.go b/types/lib/mapper_test.go index 1058fed6ed..e1759b06ac 100644 --- a/types/lib/mapper_test.go +++ b/types/lib/mapper_test.go @@ -6,6 +6,7 @@ import ( "github.com/stretchr/testify/assert" dbm "github.com/tendermint/tmlibs/db" + "github.com/tendermint/tmlibs/log" abci "github.com/tendermint/abci/types" @@ -24,7 +25,7 @@ func defaultComponents(key sdk.StoreKey) (sdk.Context, *wire.Codec) { cms := store.NewCommitMultiStore(db) cms.MountStoreWithDB(key, sdk.StoreTypeIAVL, db) cms.LoadLatestVersion() - ctx := sdk.NewContext(cms, abci.Header{}, false, nil) + ctx := sdk.NewContext(cms, abci.Header{}, false, nil, log.NewNopLogger()) cdc := wire.NewCodec() return ctx, cdc } From 2376f231c21563775d71e952c05af8fc4bb71c75 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Tue, 1 May 2018 14:00:23 +0200 Subject: [PATCH 6/6] Rebase, update changelog & testcase --- CHANGELOG.md | 5 +++- examples/democoin/x/cool/keeper_test.go | 2 +- types/context_test.go | 31 +++++++++++++++++++++++++ 3 files changed, 36 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 98eef848d2..2f6c756c9b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## UNRELEASED +FEATURES + +* Context now has access to the application-configured logger + BREAKING CHANGES * types/rational now extends big.Rat @@ -27,7 +31,6 @@ FEATURES: * Create genesis transactions with `gaiad init gen-tx` * New genesis account keys are automatically added to the client keybase (introduce `--client-home` flag) * Initialize with genesis txs using `--gen-txs` flag -* Context now has access to the application-configured logger BREAKING CHANGES diff --git a/examples/democoin/x/cool/keeper_test.go b/examples/democoin/x/cool/keeper_test.go index 9aca3cc2a0..d497dee699 100644 --- a/examples/democoin/x/cool/keeper_test.go +++ b/examples/democoin/x/cool/keeper_test.go @@ -30,7 +30,7 @@ func TestCoolKeeper(t *testing.T) { auth.RegisterBaseAccount(cdc) am := auth.NewAccountMapper(cdc, capKey, &auth.BaseAccount{}) - ctx := sdk.NewContext(ms, abci.Header{}, false, nil) + ctx := sdk.NewContext(ms, abci.Header{}, false, nil, nil) ck := bank.NewKeeper(am) keeper := NewKeeper(capKey, ck, DefaultCodespace) diff --git a/types/context_test.go b/types/context_test.go index d813516f0b..ec5faab440 100644 --- a/types/context_test.go +++ b/types/context_test.go @@ -4,6 +4,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" dbm "github.com/tendermint/tmlibs/db" "github.com/tendermint/tmlibs/log" @@ -13,6 +14,33 @@ import ( abci "github.com/tendermint/abci/types" ) +type MockLogger struct { + logs *[]string +} + +func NewMockLogger() MockLogger { + logs := make([]string, 0) + return MockLogger{ + &logs, + } +} + +func (l MockLogger) Debug(msg string, kvs ...interface{}) { + *l.logs = append(*l.logs, msg) +} + +func (l MockLogger) Info(msg string, kvs ...interface{}) { + *l.logs = append(*l.logs, msg) +} + +func (l MockLogger) Error(msg string, kvs ...interface{}) { + *l.logs = append(*l.logs, msg) +} + +func (l MockLogger) With(kvs ...interface{}) log.Logger { + panic("not implemented") +} + func TestContextGetOpShouldNeverPanic(t *testing.T) { var ms types.MultiStore ctx := types.NewContext(ms, abci.Header{}, false, nil, log.NewNopLogger()) @@ -64,7 +92,10 @@ func TestCacheContext(t *testing.T) { func TestLogContext(t *testing.T) { key := types.NewKVStoreKey(t.Name()) ctx := defaultContext(key) + logger := NewMockLogger() + ctx = ctx.WithLogger(logger) ctx.Logger().Debug("debug") ctx.Logger().Info("info") ctx.Logger().Error("error") + require.Equal(t, *logger.logs, []string{"debug", "info", "error"}) }