summaryrefslogtreecommitdiffstats
path: root/vendor/github.com/mattermost/logr/v2/targets/testing.go
blob: ea3df70ce84675aa1024089fbbc19cc4e91e6034 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
package targets

import (
	"strings"
	"sync"
	"testing"

	"github.com/mattermost/logr/v2"
	"github.com/mattermost/logr/v2/formatters"
)

// Testing is a simple log target that writes to a (*testing.T) log.
type Testing struct {
	mux sync.Mutex
	t   *testing.T
}

func NewTestingTarget(t *testing.T) *Testing {
	return &Testing{
		t: t,
	}
}

// Init is called once to initialize the target.
func (tt *Testing) Init() error {
	return nil
}

// Write outputs bytes to this file target.
func (tt *Testing) Write(p []byte, rec *logr.LogRec) (int, error) {
	tt.mux.Lock()
	defer tt.mux.Unlock()

	if tt.t != nil {
		s := strings.TrimSpace(string(p))
		tt.t.Log(s)
	}
	return len(p), nil
}

// Shutdown is called once to free/close any resources.
// Target queue is already drained when this is called.
func (tt *Testing) Shutdown() error {
	tt.mux.Lock()
	defer tt.mux.Unlock()

	tt.t = nil
	return nil
}

// CreateTestLogger creates a logger for unit tests. Log records are output to `(*testing.T).Log`.
// A new logger is returned along with a method to shutdown the new logger.
func CreateTestLogger(t *testing.T, levels ...logr.Level) (logger logr.Logger, shutdown func() error) {
	lgr, _ := logr.New()
	filter := logr.NewCustomFilter(levels...)
	formatter := &formatters.Plain{EnableCaller: true}
	target := NewTestingTarget(t)

	if err := lgr.AddTarget(target, "test", filter, formatter, 1000); err != nil {
		t.Fail()
	}
	shutdown = func() error {
		err := lgr.Shutdown()
		if err != nil {
			target.mux.Lock()
			target.t.Error("error shutting down test logger", err)
			target.mux.Unlock()
		}
		return err
	}
	return lgr.NewLogger(), shutdown
}