// Copyright 2013, Örjan Persson. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package logging import ( "bytes" "testing" ) func TestFormat(t *testing.T) { backend := InitForTesting(DEBUG) f, err := NewStringFormatter("%{shortfile} %{time:2006-01-02T15:04:05} %{level:.1s} %{id:04d} %{module} %{message}") if err != nil { t.Fatalf("failed to set format: %s", err) } SetFormatter(f) log := MustGetLogger("module") log.Debug("hello") line := MemoryRecordN(backend, 0).Formatted(0) if "format_test.go:24 1970-01-01T00:00:00 D 0001 module hello" != line { t.Errorf("Unexpected format: %s", line) } } func logAndGetLine(backend *MemoryBackend) string { MustGetLogger("foo").Debug("hello") return MemoryRecordN(backend, 0).Formatted(1) } func getLastLine(backend *MemoryBackend) string { return MemoryRecordN(backend, 0).Formatted(1) } func realFunc(backend *MemoryBackend) string { return logAndGetLine(backend) } type structFunc struct{} func (structFunc) Log(backend *MemoryBackend) string { return logAndGetLine(backend) } func TestRealFuncFormat(t *testing.T) { backend := InitForTesting(DEBUG) SetFormatter(MustStringFormatter("%{shortfunc}")) line := realFunc(backend) if "realFunc" != line { t.Errorf("Unexpected format: %s", line) } } func TestStructFuncFormat(t *testing.T) { backend := InitForTesting(DEBUG) SetFormatter(MustStringFormatter("%{longfunc}")) var x structFunc line := x.Log(backend) if "structFunc.Log" != line { t.Errorf("Unexpected format: %s", line) } } func TestVarFuncFormat(t *testing.T) { backend := InitForTesting(DEBUG) SetFormatter(MustStringFormatter("%{shortfunc}")) var varFunc = func() string { return logAndGetLine(backend) } line := varFunc() if "???" == line || "TestVarFuncFormat" == line || "varFunc" == line { t.Errorf("Unexpected format: %s", line) } } func TestFormatFuncName(t *testing.T) { var tests = []struct { filename string longpkg string shortpkg string longfunc string shortfunc string }{ {"", "???", "???", "???", "???"}, {"main", "???", "???", "???", "???"}, {"main.", "main", "main", "", ""}, {"main.main", "main", "main", "main", "main"}, {"github.com/op/go-logging.func·001", "github.com/op/go-logging", "go-logging", "func·001", "func·001"}, {"github.com/op/go-logging.stringFormatter.Format", "github.com/op/go-logging", "go-logging", "stringFormatter.Format", "Format"}, } var v string for _, test := range tests { v = formatFuncName(fmtVerbLongpkg, test.filename) if test.longpkg != v { t.Errorf("%s != %s", test.longpkg, v) } v = formatFuncName(fmtVerbShortpkg, test.filename) if test.shortpkg != v { t.Errorf("%s != %s", test.shortpkg, v) } v = formatFuncName(fmtVerbLongfunc, test.filename) if test.longfunc != v { t.Errorf("%s != %s", test.longfunc, v) } v = formatFuncName(fmtVerbShortfunc, test.filename) if test.shortfunc != v { t.Errorf("%s != %s", test.shortfunc, v) } } } func TestBackendFormatter(t *testing.T) { InitForTesting(DEBUG) // Create two backends and wrap one of the with a backend formatter b1 := NewMemoryBackend(1) b2 := NewMemoryBackend(1) f := MustStringFormatter("%{level} %{message}") bf := NewBackendFormatter(b2, f) SetBackend(b1, bf) log := MustGetLogger("module") log.Info("foo") if "foo" != getLastLine(b1) { t.Errorf("Unexpected line: %s", getLastLine(b1)) } if "INFO foo" != getLastLine(b2) { t.Errorf("Unexpected line: %s", getLastLine(b2)) } } func BenchmarkStringFormatter(b *testing.B) { fmt := "%{time:2006-01-02T15:04:05} %{level:.1s} %{id:04d} %{module} %{message}" f := MustStringFormatter(fmt) backend := InitForTesting(DEBUG) buf := &bytes.Buffer{} log := MustGetLogger("module") log.Debug("") record := MemoryRecordN(backend, 0) b.ResetTimer() for i := 0; i < b.N; i++ { if err := f.Format(1, record, buf); err != nil { b.Fatal(err) buf.Truncate(0) } } }