1package runutil
2
3import (
4	"fmt"
5	"os"
6	"testing"
7
8	"github.com/go-kit/log/level"
9	"github.com/stretchr/testify/assert"
10)
11
12func TestCloseWithLogOnErr(t *testing.T) {
13	t.Run("With non-close error", func(t *testing.T) {
14		closer := fakeCloser{err: fmt.Errorf("an error")}
15		logger := fakeLogger{}
16
17		CloseWithLogOnErr(&logger, closer, "closing failed")
18
19		assert.Equal(t, []interface{}{
20			"level", level.WarnValue(), "msg", "detected close error", "err", "closing failed: an error",
21		}, logger.keyvals)
22	})
23
24	t.Run("With no error", func(t *testing.T) {
25		closer := fakeCloser{}
26		logger := fakeLogger{}
27
28		CloseWithLogOnErr(&logger, closer, "closing failed")
29
30		assert.Empty(t, logger.keyvals)
31	})
32
33	t.Run("With closed error", func(t *testing.T) {
34		closer := fakeCloser{err: os.ErrClosed}
35		logger := fakeLogger{}
36
37		CloseWithLogOnErr(&logger, closer, "closing failed")
38
39		assert.Empty(t, logger.keyvals)
40	})
41}
42
43type fakeCloser struct {
44	err error
45}
46
47func (c fakeCloser) Close() error {
48	return c.err
49}
50
51type fakeLogger struct {
52	keyvals []interface{}
53}
54
55func (l *fakeLogger) Log(keyvals ...interface{}) error {
56	l.keyvals = keyvals
57	return nil
58}
59