Skip to content

Commit 95ac544

Browse files
committed
test: add syslog mock and test cases for linux and darwin
1 parent af398c8 commit 95ac544

File tree

4 files changed

+206
-98
lines changed

4 files changed

+206
-98
lines changed

internal/syslog/syslog_darwin.go

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,29 +8,34 @@ import (
88
"strings"
99
)
1010

11+
type commandRunner interface {
12+
Run(priority, source, message string) error
13+
}
14+
15+
type loggerCommandRunner struct{}
16+
17+
func (r *loggerCommandRunner) Run(priority, source, message string) error {
18+
return exec.Command("logger", "-p", priority, "-t", source, message).Run()
19+
}
20+
1121
type darwinSyslog struct {
1222
out io.Writer
1323
source string
24+
runner commandRunner
1425
}
1526

1627
func (s *darwinSyslog) Write(data []byte) (int, error) {
17-
// Write to event log
1828
line := string(data)
19-
20-
// Extract the message
2129
message := extractMessage(line)
2230

23-
// Use different levels
2431
priority := "daemon.info"
2532
if strings.Contains(line, "[ERROR]") {
2633
priority = "daemon.err"
2734
} else if strings.Contains(line, "[WARNING]") {
2835
priority = "daemon.warning"
2936
}
3037

31-
// Write to system logger
32-
cmd := exec.Command("logger", "-p", priority, "-t", s.source, message)
33-
cmd.Run()
38+
s.runner.Run(priority, s.source, message)
3439

3540
return s.out.Write(data)
3641
}
@@ -40,8 +45,9 @@ func (s *darwinSyslog) Close() error {
4045
}
4146

4247
func New(name string, out io.Writer) (Syslog, error) {
43-
return &darwinSyslog{
44-
out: out,
45-
source: name,
46-
}, nil
48+
return newWithRunner(name, out, &loggerCommandRunner{}), nil
49+
}
50+
51+
func newWithRunner(name string, out io.Writer, runner commandRunner) Syslog {
52+
return &darwinSyslog{out: out, source: name, runner: runner}
4753
}

internal/syslog/syslog_darwin_test.go

Lines changed: 86 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,88 @@ import (
77
"testing"
88
)
99

10+
type mockCommandRunner struct {
11+
priority string
12+
source string
13+
message string
14+
called bool
15+
}
16+
17+
func (m *mockCommandRunner) Run(priority, source, message string) error {
18+
m.called = true
19+
m.priority = priority
20+
m.source = source
21+
m.message = message
22+
return nil
23+
}
24+
25+
func TestDarwinSyslog_Write_InfoPriority(t *testing.T) {
26+
runner := &mockCommandRunner{}
27+
s := &darwinSyslog{out: &bytes.Buffer{}, source: "test", runner: runner}
28+
29+
s.Write([]byte("[INFO] info message"))
30+
31+
if !runner.called {
32+
t.Fatal("expected runner to be called")
33+
}
34+
if runner.priority != "daemon.info" {
35+
t.Errorf("expected priority 'daemon.info', got %q", runner.priority)
36+
}
37+
}
38+
39+
func TestDarwinSyslog_Write_WarningPriority(t *testing.T) {
40+
runner := &mockCommandRunner{}
41+
s := &darwinSyslog{out: &bytes.Buffer{}, source: "test", runner: runner}
42+
43+
s.Write([]byte("[WARNING] warning message"))
44+
45+
if runner.priority != "daemon.warning" {
46+
t.Errorf("expected priority 'daemon.warning', got %q", runner.priority)
47+
}
48+
}
49+
50+
func TestDarwinSyslog_Write_ErrorPriority(t *testing.T) {
51+
runner := &mockCommandRunner{}
52+
s := &darwinSyslog{out: &bytes.Buffer{}, source: "test", runner: runner}
53+
54+
s.Write([]byte("[ERROR] error message"))
55+
56+
if runner.priority != "daemon.err" {
57+
t.Errorf("expected priority 'daemon.err', got %q", runner.priority)
58+
}
59+
}
60+
61+
func TestDarwinSyslog_Write_DefaultsToInfo(t *testing.T) {
62+
runner := &mockCommandRunner{}
63+
s := &darwinSyslog{out: &bytes.Buffer{}, source: "test", runner: runner}
64+
65+
s.Write([]byte("[DEBUG] debug message"))
66+
67+
if runner.priority != "daemon.info" {
68+
t.Errorf("expected default priority 'daemon.info', got %q", runner.priority)
69+
}
70+
}
71+
72+
func TestDarwinSyslog_Write_PassesSourceAndMessage(t *testing.T) {
73+
runner := &mockCommandRunner{}
74+
s := &darwinSyslog{out: &bytes.Buffer{}, source: "my-app", runner: runner}
75+
76+
s.Write([]byte("[INFO] hello world"))
77+
78+
if runner.source != "my-app" {
79+
t.Errorf("expected source 'my-app', got %q", runner.source)
80+
}
81+
if runner.message != "hello world" {
82+
t.Errorf("expected message 'hello world', got %q", runner.message)
83+
}
84+
}
85+
1086
func TestDarwinSyslog_Write_ForwardsToOut(t *testing.T) {
87+
runner := &mockCommandRunner{}
1188
var out bytes.Buffer
12-
s := &darwinSyslog{out: &out, source: "test"}
89+
s := &darwinSyslog{out: &out, source: "test", runner: runner}
1390

14-
data := []byte("[INFO] hello from darwin")
91+
data := []byte("[INFO] forwarded")
1592
n, err := s.Write(data)
1693

1794
if err != nil {
@@ -21,53 +98,24 @@ func TestDarwinSyslog_Write_ForwardsToOut(t *testing.T) {
2198
t.Errorf("expected %d bytes written, got %d", len(data), n)
2299
}
23100
if out.String() != string(data) {
24-
t.Errorf("expected out to contain %q, got %q", string(data), out.String())
25-
}
26-
}
27-
28-
func TestDarwinSyslog_Write_Levels(t *testing.T) {
29-
tests := []struct {
30-
name string
31-
input string
32-
}{
33-
{"info level", "[INFO] info message"},
34-
{"warning level", "[WARNING] warning message"},
35-
{"error level", "[ERROR] error message"},
36-
{"unknown level defaults to info", "[DEBUG] debug message"},
37-
}
38-
39-
for _, tt := range tests {
40-
t.Run(tt.name, func(t *testing.T) {
41-
var out bytes.Buffer
42-
s := &darwinSyslog{out: &out, source: "test"}
43-
44-
_, err := s.Write([]byte(tt.input))
45-
if err != nil {
46-
t.Fatalf("expected no error, got %v", err)
47-
}
48-
if out.String() != tt.input {
49-
t.Errorf("expected out %q, got %q", tt.input, out.String())
50-
}
51-
})
101+
t.Errorf("expected out %q, got %q", string(data), out.String())
52102
}
53103
}
54104

55105
func TestDarwinSyslog_Close(t *testing.T) {
56-
s := &darwinSyslog{out: &bytes.Buffer{}, source: "test"}
106+
s := &darwinSyslog{out: &bytes.Buffer{}, source: "test", runner: &mockCommandRunner{}}
57107

58-
err := s.Close()
59-
if err != nil {
108+
if err := s.Close(); err != nil {
60109
t.Errorf("expected nil error, got %v", err)
61110
}
62111
}
63112

64-
func TestNew_Darwin(t *testing.T) {
113+
func TestNewWithRunner_Darwin(t *testing.T) {
114+
runner := &mockCommandRunner{}
65115
var out bytes.Buffer
66-
syslogger, err := New("test-source", &out)
67116

68-
if err != nil {
69-
t.Fatalf("expected no error, got %v", err)
70-
}
117+
syslogger := newWithRunner("test-source", &out, runner)
118+
71119
if syslogger == nil {
72120
t.Fatal("expected non-nil Syslog")
73121
}

internal/syslog/syslog_linux.go

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,29 +8,34 @@ import (
88
"strings"
99
)
1010

11+
type commandRunner interface {
12+
Run(priority, source, message string) error
13+
}
14+
15+
type loggerCommandRunner struct{}
16+
17+
func (r *loggerCommandRunner) Run(priority, source, message string) error {
18+
return exec.Command("logger", "-p", priority, "-t", source, message).Run()
19+
}
20+
1121
type linuxSyslog struct {
1222
out io.Writer
1323
source string
24+
runner commandRunner
1425
}
1526

1627
func (s *linuxSyslog) Write(data []byte) (int, error) {
17-
// Write to event log
1828
line := string(data)
19-
20-
// Extract the message
2129
message := extractMessage(line)
2230

23-
// Use different levels
2431
priority := "daemon.info"
2532
if strings.Contains(line, "[ERROR]") {
2633
priority = "daemon.err"
2734
} else if strings.Contains(line, "[WARNING]") {
2835
priority = "daemon.warning"
2936
}
3037

31-
// Write to system logger
32-
cmd := exec.Command("logger", "-p", priority, "-t", s.source, message)
33-
cmd.Run()
38+
s.runner.Run(priority, s.source, message)
3439

3540
return s.out.Write(data)
3641
}
@@ -40,8 +45,9 @@ func (s *linuxSyslog) Close() error {
4045
}
4146

4247
func New(name string, out io.Writer) (Syslog, error) {
43-
return &linuxSyslog{
44-
out: out,
45-
source: name,
46-
}, nil
48+
return newWithRunner(name, out, &loggerCommandRunner{}), nil
49+
}
50+
51+
func newWithRunner(name string, out io.Writer, runner commandRunner) Syslog {
52+
return &linuxSyslog{out: out, source: name, runner: runner}
4753
}

0 commit comments

Comments
 (0)