package utils import ( "testing" "github.com/ethereum/go-ethereum/log" "github.com/golang/mock/gomock" mock_utils "github.com/harmony-one/harmony/internal/utils/mock" ) func TestExampleTestLogRedirectorUsingGetLogInstance(t *testing.T) { tlr := NewTestLogRedirector(GetLogInstance(), t) defer tlr.Close() // Everything logged via GetLogInstance(), // including lines said by the Menethil family below, // is forwarded to the testing object. // You will see their lines when you run this “test.” terenasMenethil() arthasMenethil() } func terenasMenethil() { GetLogInstance().Info("what are you doing my son") } func arthasMenethil() { GetLogInstance().Warn("succeding you father") } func TestNewTestLogRedirector(t *testing.T) { logger := log.New() origHandler := logger.GetHandler() tlr := NewTestLogRedirector(logger, t) if tlr == nil { t.Fatalf("NewTestLogRedirector() = nil") } if tlr.l != logger { t.Errorf("NewTestLogRedirector().l = %v, want %v", tlr.l, logger) } if tlr.h != origHandler { t.Errorf("NewTestLogRedirector().h = %v, want %v", tlr.h, origHandler) } if tlr.t != t { t.Errorf("NewTestLogRedirector().t = %v, want %v", tlr.t, t) } } func TestTestLogRedirector_Log(t *testing.T) { type args struct { r *log.Record } tests := []struct { name string rec log.Record want string }{ { "WithoutContexts", log.Record{Lvl: log.LvlDebug, Msg: "hello world"}, `[dbug] hello world`, }, { "WithContexts", log.Record{Lvl: log.LvlWarn, Msg: "hello", Ctx: []interface{}{ "audience", "world", "pid", 31337, }}, `[warn] hello, audience="world", pid=31337`, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { ctrl := gomock.NewController(t) defer ctrl.Finish() mockTestLogger := mock_utils.NewMockTestLogger(ctrl) redirector := NewTestLogRedirector(log.New(), mockTestLogger) mockTestLogger.EXPECT().Log(tt.want) if err := redirector.Log(&tt.rec); err != nil { t.Errorf("TestLogRedirector.Log() error = %v, want nil", err) } }) } } func TestTestLogRedirector_Close(t *testing.T) { ctrl := gomock.NewController(t) defer ctrl.Finish() mockTestLogger := mock_utils.NewMockTestLogger(ctrl) logger := log.New() tlr := NewTestLogRedirector(logger, mockTestLogger) mockTestLogger.EXPECT().Log("[info] before close").Times(1) mockTestLogger.EXPECT().Log("[info] after close").Times(0) mockTestLogger.EXPECT().Log("[info] after idempotent close").Times(0) logger.Info("before close") if err := tlr.Close(); err != nil { t.Errorf("TestLogRedirector.Close() error = %v, want nil", err) } logger.Info("after close") if err := tlr.Close(); err != nil { t.Errorf("TestLogRedirector.Close() error = %v, want nil", err) } logger.Info("after idempotent close") }