package slog import ( "bytes" "context" "errors" "fmt" "log" "testing" "go.unistack.org/micro/v3/logger" ) func TestError(t *testing.T) { ctx := context.TODO() buf := bytes.NewBuffer(nil) l := NewLogger(logger.WithLevel(logger.ErrorLevel), logger.WithOutput(buf), logger.WithAddStacktrace(true)) if err := l.Init(); err != nil { t.Fatal(err) } l.Error(ctx, "message", fmt.Errorf("error message")) if !bytes.Contains(buf.Bytes(), []byte(`"stacktrace":"`)) { t.Fatalf("logger stacktrace not works, buf contains: %s", buf.Bytes()) } if !bytes.Contains(buf.Bytes(), []byte(`"error":"`)) { t.Fatalf("logger error not works, buf contains: %s", buf.Bytes()) } } func TestErrorf(t *testing.T) { ctx := context.TODO() buf := bytes.NewBuffer(nil) l := NewLogger(logger.WithLevel(logger.ErrorLevel), logger.WithOutput(buf), logger.WithAddStacktrace(true)) if err := l.Init(logger.WithContextAttrFuncs(func(ctx context.Context) []interface{} { return nil })); err != nil { t.Fatal(err) } //l.Log(ctx, logger.ErrorLevel, "я вот отправил сообщение", "Это ключ для инта") l.Error(ctx, "message", errors.New("error_tag1")) if !bytes.Contains(buf.Bytes(), []byte(`"stacktrace":"`)) { t.Fatalf("logger stacktrace not works, buf contains: %s", buf.Bytes()) } if !bytes.Contains(buf.Bytes(), []byte(`"error":"`)) { t.Fatalf("logger error not works, buf contains: %s", buf.Bytes()) } } func TestContext(t *testing.T) { ctx := context.TODO() buf := bytes.NewBuffer(nil) l := NewLogger(logger.WithLevel(logger.TraceLevel), logger.WithOutput(buf)) if err := l.Init(); err != nil { t.Fatal(err) } nl, ok := logger.FromContext(logger.NewContext(ctx, l.Fields("key", "val"))) if !ok { t.Fatal("context without logger") } nl.Info(ctx, "message") if !bytes.Contains(buf.Bytes(), []byte(`"key":"val"`)) { t.Fatalf("logger fields not works, buf contains: %s", buf.Bytes()) } } func TestFields(t *testing.T) { ctx := context.TODO() buf := bytes.NewBuffer(nil) l := NewLogger(logger.WithLevel(logger.TraceLevel), logger.WithOutput(buf)) if err := l.Init(); err != nil { t.Fatal(err) } nl := l.Fields("key", "val") nl.Info(ctx, "message") if !bytes.Contains(buf.Bytes(), []byte(`"key":"val"`)) { t.Fatalf("logger fields not works, buf contains: %s", buf.Bytes()) } } func TestFromContextWithFields(t *testing.T) { ctx := context.TODO() buf := bytes.NewBuffer(nil) var ok bool l := NewLogger(logger.WithLevel(logger.TraceLevel), logger.WithOutput(buf)) if err := l.Init(); err != nil { t.Fatal(err) } nl := l.Fields("key", "val") ctx = logger.NewContext(ctx, nl) l, ok = logger.FromContext(ctx) if !ok { t.Fatalf("context does not have logger") } l.Info(ctx) if !bytes.Contains(buf.Bytes(), []byte(`"key":"val"`)) { t.Fatalf("logger fields not works, buf contains: %s", buf.Bytes()) } l.Info(ctx, "test", "uncorrected number attributes") if !bytes.Contains(buf.Bytes(), []byte(`"!BADKEY":"uncorrected number attributes"`)) { t.Fatalf("logger fields not works, buf contains: %s", buf.Bytes()) } } func TestClone(t *testing.T) { ctx := context.TODO() buf := bytes.NewBuffer(nil) l := NewLogger(logger.WithLevel(logger.TraceLevel), logger.WithOutput(buf)) if err := l.Init(); err != nil { t.Fatal(err) } nl := l.Clone(logger.WithLevel(logger.ErrorLevel)) if err := nl.Init(); err != nil { t.Fatal(err) } nl.Info(ctx, "info message") if len(buf.Bytes()) != 0 { t.Fatal("message must not be logged") } l.Info(ctx, "info message") if len(buf.Bytes()) == 0 { t.Fatal("message must be logged") } } func TestRedirectStdLogger(t *testing.T) { buf := bytes.NewBuffer(nil) l := NewLogger(logger.WithLevel(logger.ErrorLevel), logger.WithOutput(buf)) if err := l.Init(); err != nil { t.Fatal(err) } fn := logger.RedirectStdLogger(l, logger.ErrorLevel) defer fn() log.Print("test") if !(bytes.Contains(buf.Bytes(), []byte(`"level":"error"`)) && bytes.Contains(buf.Bytes(), []byte(`"msg":"test"`))) { t.Fatalf("logger error, buf %s", buf.Bytes()) } } func TestStdLogger(t *testing.T) { buf := bytes.NewBuffer(nil) l := NewLogger(logger.WithLevel(logger.TraceLevel), logger.WithOutput(buf)) if err := l.Init(); err != nil { t.Fatal(err) } lg := logger.NewStdLogger(l, logger.ErrorLevel) lg.Print("test") if !(bytes.Contains(buf.Bytes(), []byte(`"level":"error"`)) && bytes.Contains(buf.Bytes(), []byte(`"msg":"test"`))) { t.Fatalf("logger error, buf %s", buf.Bytes()) } } func TestLogger(t *testing.T) { ctx := context.TODO() buf := bytes.NewBuffer(nil) l := NewLogger(logger.WithLevel(logger.TraceLevel), logger.WithOutput(buf)) if err := l.Init(); err != nil { t.Fatal(err) } l.Trace(ctx, "trace_msg1") l.Warn(ctx, "warn_msg1") l.Fields("error", "test").Info(ctx, "error message") l.Warn(ctx, "first second") if !(bytes.Contains(buf.Bytes(), []byte(`"level":"trace"`)) && bytes.Contains(buf.Bytes(), []byte(`"msg":"trace_msg1"`))) { t.Fatalf("logger tracer, buf %s", buf.Bytes()) } if !(bytes.Contains(buf.Bytes(), []byte(`"level":"warn"`)) && bytes.Contains(buf.Bytes(), []byte(`"msg":"warn_msg1"`))) { t.Fatalf("logger warn, buf %s", buf.Bytes()) } if !(bytes.Contains(buf.Bytes(), []byte(`"level":"info"`)) && bytes.Contains(buf.Bytes(), []byte(`"msg":"error message","error":"test"`))) { t.Fatalf("logger info, buf %s", buf.Bytes()) } if !(bytes.Contains(buf.Bytes(), []byte(`"level":"warn"`)) && bytes.Contains(buf.Bytes(), []byte(`"msg":"first second"`))) { t.Fatalf("logger warn, buf %s", buf.Bytes()) } }