package logger import ( "bytes" "context" "log" "testing" ) func TestContext(t *testing.T) { ctx := context.TODO() buf := bytes.NewBuffer(nil) l := NewLogger(WithLevel(TraceLevel), WithOutput(buf)) if err := l.Init(); err != nil { t.Fatal(err) } nl, ok := FromContext(NewContext(ctx, l.Attrs("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 TestAttrs(t *testing.T) { ctx := context.TODO() buf := bytes.NewBuffer(nil) l := NewLogger(WithLevel(TraceLevel), WithOutput(buf)) if err := l.Init(); err != nil { t.Fatal(err) } nl := l.Attrs("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(WithLevel(TraceLevel), WithOutput(buf)) if err := l.Init(); err != nil { t.Fatal(err) } nl := l.Attrs("key", "val") ctx = NewContext(ctx, nl) l, ok = FromContext(ctx) if !ok { t.Fatalf("context does not have logger") } l.Info(ctx, "message") if !bytes.Contains(buf.Bytes(), []byte(`"key":"val"`)) { 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(WithLevel(TraceLevel), WithOutput(buf)) if err := l.Init(); err != nil { t.Fatal(err) } nl := l.Clone(WithLevel(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(WithLevel(ErrorLevel), WithOutput(buf)) if err := l.Init(); err != nil { t.Fatal(err) } fn := RedirectStdLogger(l, 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(WithLevel(TraceLevel), WithOutput(buf)) if err := l.Init(); err != nil { t.Fatal(err) } lg := NewStdLogger(l, 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(WithLevel(TraceLevel), WithOutput(buf)) if err := l.Init(); err != nil { t.Fatal(err) } l.Trace(ctx, "trace_msg1") l.Warn(ctx, "warn_msg1") l.Attrs("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()) } }