1// +build !windows
2// +build !plan9
3// +build !nacl
4
5package syslog
6
7import (
8	"fmt"
9	"reflect"
10	"testing"
11
12	gosyslog "log/syslog"
13
14	"github.com/go-kit/kit/log"
15	"github.com/go-kit/kit/log/level"
16)
17
18func TestSyslogLoggerDefaultPrioritySelector(t *testing.T) {
19	w := &testSyslogWriter{}
20	l := NewSyslogLogger(w, log.NewLogfmtLogger)
21
22	l.Log("level", level.WarnValue(), "msg", "one")
23	l.Log("level", "undefined", "msg", "two")
24	l.Log("level", level.InfoValue(), "msg", "three")
25	l.Log("level", level.ErrorValue(), "msg", "four")
26	l.Log("level", level.DebugValue(), "msg", "five")
27
28	l.Log("msg", "six", "level", level.ErrorValue())
29	l.Log("msg", "seven", "level", level.DebugValue())
30	l.Log("msg", "eight", "level", level.InfoValue())
31	l.Log("msg", "nine", "level", "undefined")
32	l.Log("msg", "ten", "level", level.WarnValue())
33
34	l.Log("level", level.ErrorValue(), "msg")
35	l.Log("msg", "eleven", "level")
36
37	want := []string{
38		"warning: level=warn msg=one\n",
39		"info: level=undefined msg=two\n",
40		"info: level=info msg=three\n",
41		"err: level=error msg=four\n",
42		"debug: level=debug msg=five\n",
43
44		"err: msg=six level=error\n",
45		"debug: msg=seven level=debug\n",
46		"info: msg=eight level=info\n",
47		"info: msg=nine level=undefined\n",
48		"warning: msg=ten level=warn\n",
49
50		"err: level=error msg=null\n",
51		"info: msg=eleven level=null\n",
52	}
53	have := w.writes
54	if !reflect.DeepEqual(want, have) {
55		t.Errorf("wrong writes: want %s, have %s", want, have)
56	}
57}
58
59func TestSyslogLoggerExhaustivePrioritySelector(t *testing.T) {
60	w := &testSyslogWriter{}
61	selector := func(keyvals ...interface{}) gosyslog.Priority {
62		for i := 0; i < len(keyvals); i += 2 {
63			if keyvals[i] == level.Key() {
64				if v, ok := keyvals[i+1].(string); ok {
65					switch v {
66					case "emergency":
67						return gosyslog.LOG_EMERG
68					case "alert":
69						return gosyslog.LOG_ALERT
70					case "critical":
71						return gosyslog.LOG_CRIT
72					case "error":
73						return gosyslog.LOG_ERR
74					case "warning":
75						return gosyslog.LOG_WARNING
76					case "notice":
77						return gosyslog.LOG_NOTICE
78					case "info":
79						return gosyslog.LOG_INFO
80					case "debug":
81						return gosyslog.LOG_DEBUG
82					}
83					return gosyslog.LOG_LOCAL0
84				}
85			}
86		}
87		return gosyslog.LOG_LOCAL0
88	}
89	l := NewSyslogLogger(w, log.NewLogfmtLogger, PrioritySelectorOption(selector))
90
91	l.Log("level", "warning", "msg", "one")
92	l.Log("level", "error", "msg", "two")
93	l.Log("level", "critical", "msg", "three")
94	l.Log("level", "debug", "msg", "four")
95	l.Log("level", "info", "msg", "five")
96	l.Log("level", "alert", "msg", "six")
97	l.Log("level", "emergency", "msg", "seven")
98	l.Log("level", "notice", "msg", "eight")
99	l.Log("level", "unknown", "msg", "nine")
100
101	want := []string{
102		"warning: level=warning msg=one\n",
103		"err: level=error msg=two\n",
104		"crit: level=critical msg=three\n",
105		"debug: level=debug msg=four\n",
106		"info: level=info msg=five\n",
107		"alert: level=alert msg=six\n",
108		"emerg: level=emergency msg=seven\n",
109		"notice: level=notice msg=eight\n",
110		"write: level=unknown msg=nine\n",
111	}
112	have := w.writes
113	if !reflect.DeepEqual(want, have) {
114		t.Errorf("wrong writes: want %s, have %s", want, have)
115	}
116}
117
118type testSyslogWriter struct {
119	writes []string
120}
121
122func (w *testSyslogWriter) Write(b []byte) (int, error) {
123	msg := string(b)
124	w.writes = append(w.writes, fmt.Sprintf("write: %s", msg))
125	return len(msg), nil
126}
127
128func (w *testSyslogWriter) Close() error {
129	return nil
130}
131
132func (w *testSyslogWriter) Emerg(msg string) error {
133	w.writes = append(w.writes, fmt.Sprintf("emerg: %s", msg))
134	return nil
135}
136
137func (w *testSyslogWriter) Alert(msg string) error {
138	w.writes = append(w.writes, fmt.Sprintf("alert: %s", msg))
139	return nil
140}
141
142func (w *testSyslogWriter) Crit(msg string) error {
143	w.writes = append(w.writes, fmt.Sprintf("crit: %s", msg))
144	return nil
145}
146
147func (w *testSyslogWriter) Err(msg string) error {
148	w.writes = append(w.writes, fmt.Sprintf("err: %s", msg))
149	return nil
150}
151
152func (w *testSyslogWriter) Warning(msg string) error {
153	w.writes = append(w.writes, fmt.Sprintf("warning: %s", msg))
154	return nil
155}
156
157func (w *testSyslogWriter) Notice(msg string) error {
158	w.writes = append(w.writes, fmt.Sprintf("notice: %s", msg))
159	return nil
160}
161
162func (w *testSyslogWriter) Info(msg string) error {
163	w.writes = append(w.writes, fmt.Sprintf("info: %s", msg))
164	return nil
165}
166
167func (w *testSyslogWriter) Debug(msg string) error {
168	w.writes = append(w.writes, fmt.Sprintf("debug: %s", msg))
169	return nil
170}
171