diff --git a/pkg/parse/parse.go b/pkg/parse/parse.go index ca92b62..4b398c6 100644 --- a/pkg/parse/parse.go +++ b/pkg/parse/parse.go @@ -445,7 +445,7 @@ func (s *InputSchema) ReadLine(l *line) error { } else { pushError(fmt.Errorf("no message key %q in incoming log", s.MessageKey)) } - if lvl, ok := l.fields[s.LevelKey]; ok { + if lvl, ok := l.fields[s.LevelKey]; s.LevelFormat != nil && ok { if parsed, err := s.LevelFormat(lvl); err != nil { pushError(fmt.Errorf("level key %q: %w", s.LevelKey, err)) } else { diff --git a/pkg/parse/parse_fuzz_test.go b/pkg/parse/parse_fuzz_test.go new file mode 100644 index 0000000..5d8d50e --- /dev/null +++ b/pkg/parse/parse_fuzz_test.go @@ -0,0 +1,50 @@ +//go:build go1.18 +// +build go1.18 + +package parse + +import ( + "bytes" + "testing" + + "github.com/logrusorgru/aurora/v3" +) + +func FuzzReadLog(f *testing.F) { + f.Add([]byte(`{}`)) + f.Add([]byte(`{"ts": 1234, "level": "info", "msg": "hello"}\n`)) + f.Add([]byte(`{"ts": 1234, "level": "info", "msg": "hello"}\n` + + `{"ts": 1235, "level": "warn", "msg": "line 2"}`)) + f.Add([]byte(`{"ts": 1234, "level": "info", "msg": "hello"}\n{}\n`)) + jq, err := CompileJQ(".") + if err != nil { + f.Fatalf("jq: %v", err) + } + + f.Fuzz(func(t *testing.T, in []byte) { + inbuf := bytes.NewReader(in) + ins := &InputSchema{ + Strict: false, + } + errbuf := new(bytes.Buffer) + outs := &OutputSchema{ + Formatter: &DefaultOutputFormatter{ + Aurora: aurora.NewAurora(true), + }, + EmitErrorFn: func(msg string) { + errbuf.WriteString(msg) + errbuf.WriteString("\n") + }, + } + outbuf := new(bytes.Buffer) + if _, err := ReadLog(inbuf, outbuf, ins, outs, jq); err != nil { + t.Fatal(err) + } + if got, want := bytes.Count(outbuf.Bytes(), []byte("\n")), bytes.Count(in, []byte("\n")); got < want { + t.Errorf("output: line count:\n got: %v\n want: >=%v", got, want) + } + if errbuf.Len() > 0 { + t.Logf("errors: %v", errbuf.String()) + } + }) +} diff --git a/pkg/parse/testdata/fuzz/FuzzReadLog/13d14f3a75b99f154b8bc6a3e2032b22446430e5a905f99d0d9cb673c3feda15 b/pkg/parse/testdata/fuzz/FuzzReadLog/13d14f3a75b99f154b8bc6a3e2032b22446430e5a905f99d0d9cb673c3feda15 new file mode 100644 index 0000000..8c5fa7a --- /dev/null +++ b/pkg/parse/testdata/fuzz/FuzzReadLog/13d14f3a75b99f154b8bc6a3e2032b22446430e5a905f99d0d9cb673c3feda15 @@ -0,0 +1,2 @@ +go test fuzz v1 +[]byte("{\"\":0}")