Skip to content

Commit fee7f8c

Browse files
committed
Add fuzz test for core Logger implementation
1 parent c3a4b77 commit fee7f8c

File tree

8 files changed

+772
-21
lines changed

8 files changed

+772
-21
lines changed

framework.go

+17-1
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,31 @@
44

55
package dazl
66

7+
import (
8+
"io"
9+
"os"
10+
)
11+
712
func Register(framework Framework) {
813
var config loggingConfig
914
if err := load(&config); err != nil {
1015
panic(err)
11-
} else if err := configure(framework, config); err != nil {
16+
} else if err := configure(framework, config, open); err != nil {
1217
panic(err)
1318
}
1419
}
1520

21+
func open(path string) (io.Writer, error) {
22+
switch path {
23+
case "stdout":
24+
return os.Stdout, nil
25+
case "stderr":
26+
return os.Stderr, nil
27+
default:
28+
return os.OpenFile(path, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0666)
29+
}
30+
}
31+
1632
type Framework interface {
1733
Name() string
1834
}

go.mod

+2
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,15 @@ module github.com/atomix/dazl
33
go 1.19
44

55
require (
6+
github.com/AdaLogics/go-fuzz-headers v0.0.0-20230106234847-43070de90fa1
67
github.com/golang/mock v1.6.0
78
github.com/mitchellh/go-homedir v1.1.0
89
github.com/stretchr/testify v1.8.0
910
gopkg.in/yaml.v3 v3.0.1
1011
)
1112

1213
require (
14+
github.com/cyphar/filepath-securejoin v0.2.3 // indirect
1315
github.com/davecgh/go-spew v1.1.1 // indirect
1416
github.com/pmezard/go-difflib v1.0.0 // indirect
1517
)

go.sum

+4
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
github.com/AdaLogics/go-fuzz-headers v0.0.0-20230106234847-43070de90fa1 h1:EKPd1INOIyr5hWOWhvpmQpY6tKjeG0hT1s3AMC/9fic=
2+
github.com/AdaLogics/go-fuzz-headers v0.0.0-20230106234847-43070de90fa1/go.mod h1:VzwV+t+dZ9j/H867F1M2ziD+yLHtB46oM35FxxMJ4d0=
3+
github.com/cyphar/filepath-securejoin v0.2.3 h1:YX6ebbZCZP7VkM3scTTokDgBL2TY741X51MTk3ycuNI=
4+
github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4=
15
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
26
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
37
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=

level.go

+5-5
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@ const (
1818
WarnLevel
1919
// ErrorLevel logs a message at error level
2020
ErrorLevel
21-
// FatalLevel logs a message, then calls os.Exit(1).
22-
FatalLevel
2321
// PanicLevel logs a message, then panics.
2422
PanicLevel
23+
// FatalLevel logs a message, then calls os.Exit(1).
24+
FatalLevel
2525
)
2626

2727
// Enabled indicates whether the log level is enabled
@@ -31,7 +31,7 @@ func (l Level) Enabled(level Level) bool {
3131

3232
// String :
3333
func (l Level) String() string {
34-
return [...]string{"", "debug", "info", "warn", "error", "fatal", "panic"}[l]
34+
return [...]string{"", "debug", "info", "warn", "error", "panic", "fatal"}[l]
3535
}
3636

3737
type levelConfig Level
@@ -50,10 +50,10 @@ func (c *levelConfig) UnmarshalText(text []byte) error {
5050
*c = levelConfig(WarnLevel)
5151
case ErrorLevel.String():
5252
*c = levelConfig(ErrorLevel)
53-
case FatalLevel.String():
54-
*c = levelConfig(FatalLevel)
5553
case PanicLevel.String():
5654
*c = levelConfig(PanicLevel)
55+
case FatalLevel.String():
56+
*c = levelConfig(FatalLevel)
5757
default:
5858
*c = levelConfig(EmptyLevel)
5959
}

level_test.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,10 @@ func TestLevel(t *testing.T) {
1919
assert.True(t, WarnLevel.Enabled(WarnLevel))
2020
assert.False(t, ErrorLevel.Enabled(WarnLevel))
2121
assert.True(t, ErrorLevel.Enabled(ErrorLevel))
22-
assert.False(t, FatalLevel.Enabled(ErrorLevel))
23-
assert.True(t, FatalLevel.Enabled(FatalLevel))
24-
assert.False(t, PanicLevel.Enabled(FatalLevel))
22+
assert.False(t, PanicLevel.Enabled(ErrorLevel))
2523
assert.True(t, PanicLevel.Enabled(PanicLevel))
24+
assert.False(t, FatalLevel.Enabled(PanicLevel))
25+
assert.True(t, FatalLevel.Enabled(FatalLevel))
2626
}
2727

2828
const testLevel = "info"

logger.go

+18-8
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ package dazl
66

77
import (
88
"fmt"
9-
"os"
9+
"io"
1010
"runtime"
1111
"strings"
1212
"sync"
@@ -107,8 +107,8 @@ func getCallerPackage() (string, bool) {
107107
return pkg, true
108108
}
109109

110-
func configure(framework Framework, config loggingConfig) error {
111-
context, err := newLoggingContext(framework, config)
110+
func configure(framework Framework, config loggingConfig, opener func(path string) (io.Writer, error)) error {
111+
context, err := newLoggingContext(framework, config, opener)
112112
if err != nil {
113113
return err
114114
}
@@ -230,7 +230,7 @@ func newLogger(context *loggingContext, parent *dazlLogger, name string) (*dazlL
230230
return logger, nil
231231
}
232232

233-
func newLoggingContext(framework Framework, config loggingConfig) (*loggingContext, error) {
233+
func newLoggingContext(framework Framework, config loggingConfig, opener func(path string) (io.Writer, error)) (*loggingContext, error) {
234234
encoders := make(map[Encoding]Encoder)
235235
if consoleEncodingFramework, ok := framework.(ConsoleEncodingFramework); ok {
236236
encoder, err := configureConsoleEncoder(config.Encoders.Console, consoleEncodingFramework.ConsoleEncoder())
@@ -250,12 +250,14 @@ func newLoggingContext(framework Framework, config loggingConfig) (*loggingConte
250250
framework: framework,
251251
config: config,
252252
encoders: encoders,
253+
opener: opener,
253254
}, nil
254255
}
255256

256257
type loggingContext struct {
257258
framework Framework
258259
config loggingConfig
260+
opener func(path string) (io.Writer, error)
259261
encoders map[Encoding]Encoder
260262
writers sync.Map
261263
mu sync.Mutex
@@ -294,7 +296,11 @@ func (c *loggingContext) newWriter(name string) (Writer, error) {
294296
if !ok {
295297
return nil, fmt.Errorf("%s framework does not support %s encoding", c.framework.Name(), c.config.Writers.Stdout.Encoder)
296298
}
297-
return encoder.NewWriter(os.Stdout)
299+
writer, err := c.opener("stdout")
300+
if err != nil {
301+
return nil, err
302+
}
303+
return encoder.NewWriter(writer)
298304
case "stderr":
299305
if c.config.Writers.Stderr == nil {
300306
return nil, fmt.Errorf("'%s' writer is not configured", name)
@@ -303,21 +309,25 @@ func (c *loggingContext) newWriter(name string) (Writer, error) {
303309
if !ok {
304310
return nil, fmt.Errorf("%s framework does not support %s encoding", c.framework.Name(), c.config.Writers.Stderr.Encoder)
305311
}
306-
return encoder.NewWriter(os.Stderr)
312+
writer, err := c.opener("stderr")
313+
if err != nil {
314+
return nil, err
315+
}
316+
return encoder.NewWriter(writer)
307317
default:
308318
config, ok := c.config.Writers.getFile(name)
309319
if !ok {
310320
return nil, fmt.Errorf("'%s' writer is not configured", name)
311321
}
312-
file, err := os.OpenFile(config.Path, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0666)
322+
writer, err := c.opener(config.Path)
313323
if err != nil {
314324
return nil, err
315325
}
316326
encoder, ok := c.encoders[config.Encoder]
317327
if !ok {
318328
return nil, fmt.Errorf("%s framework does not support %s encoding", c.framework.Name(), config.Encoder)
319329
}
320-
return encoder.NewWriter(file)
330+
return encoder.NewWriter(writer)
321331
}
322332
}
323333

0 commit comments

Comments
 (0)