Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions galley/pkg/server/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -224,14 +224,14 @@ func (s *Server) Run() {
defer s.serveWG.Done()
err := s.processor.Start()
if err != nil {
scope.Fatalf("Galley Server unexpectedly terminated: %v", err)
scope.Errorf("Galley Server unexpectedly terminated: %v", err)
return
}

// start serving
err = s.grpcServer.Serve(s.listener)
if err != nil {
scope.Fatalf("Galley Server unexpectedly terminated: %v", err)
scope.Errorf("Galley Server unexpectedly terminated: %v", err)
}
}()
}
Expand Down
12 changes: 11 additions & 1 deletion pkg/log/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ package log

import (
"fmt"
"os"
"strings"
"sync/atomic"
"time"
Expand Down Expand Up @@ -195,7 +196,16 @@ func formatDate(t time.Time, enc zapcore.PrimitiveArrayEncoder) {

func updateScopes(options *Options, core zapcore.Core, errSink zapcore.WriteSyncer) error {
// init the global I/O funcs
writeFn.Store(core.Write)
writeFn.Store(func(ent zapcore.Entry, fields []zapcore.Field) error {
err := core.Write(ent, fields)
if ent.Level == zapcore.FatalLevel {
if options.testonlyExit == nil {
os.Exit(1)
}
options.testonlyExit()
}
return err
})
syncFn.Store(core.Sync)
errorSink.Store(errSink)

Expand Down
204 changes: 160 additions & 44 deletions pkg/log/default_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,63 +20,170 @@ import (
"testing"
)

func testOptions() *Options {
o := DefaultOptions()
o.testonlyExit = func() {
panic("os.Exit would have been called")
}
return o
}

func TestDefault(t *testing.T) {
cases := []struct {
f func()
pat string
json bool
caller bool
wantExit bool
stackLevel Level
}{
{func() { Debug("Hello") }, timePattern + "\tdebug\tHello", false, false, NoneLevel},
{func() { Debugf("Hello") }, timePattern + "\tdebug\tHello", false, false, NoneLevel},
{func() { Debugf("%s", "Hello") }, timePattern + "\tdebug\tHello", false, false, NoneLevel},
{func() { Debuga("Hello") }, timePattern + "\tdebug\tHello", false, false, NoneLevel},

{func() { Info("Hello") }, timePattern + "\tinfo\tHello", false, false, NoneLevel},
{func() { Infof("Hello") }, timePattern + "\tinfo\tHello", false, false, NoneLevel},
{func() { Infof("%s", "Hello") }, timePattern + "\tinfo\tHello", false, false, NoneLevel},
{func() { Infoa("Hello") }, timePattern + "\tinfo\tHello", false, false, NoneLevel},

{func() { Warn("Hello") }, timePattern + "\twarn\tHello", false, false, NoneLevel},
{func() { Warnf("Hello") }, timePattern + "\twarn\tHello", false, false, NoneLevel},
{func() { Warnf("%s", "Hello") }, timePattern + "\twarn\tHello", false, false, NoneLevel},
{func() { Warna("Hello") }, timePattern + "\twarn\tHello", false, false, NoneLevel},

{func() { Error("Hello") }, timePattern + "\terror\tHello", false, false, NoneLevel},
{func() { Errorf("Hello") }, timePattern + "\terror\tHello", false, false, NoneLevel},
{func() { Errorf("%s", "Hello") }, timePattern + "\terror\tHello", false, false, NoneLevel},
{func() { Errora("Hello") }, timePattern + "\terror\tHello", false, false, NoneLevel},

{func() { Fatal("Hello") }, timePattern + "\tfatal\tHello", false, false, NoneLevel},
{func() { Fatalf("Hello") }, timePattern + "\tfatal\tHello", false, false, NoneLevel},
{func() { Fatalf("%s", "Hello") }, timePattern + "\tfatal\tHello", false, false, NoneLevel},
{func() { Fatala("Hello") }, timePattern + "\tfatal\tHello", false, false, NoneLevel},

{func() { Debug("Hello") }, timePattern + "\tdebug\tlog/default_test.go:.*\tHello", false, true, NoneLevel},

{func() { Debug("Hello") }, "{\"level\":\"debug\",\"time\":\"" + timePattern + "\",\"caller\":\"log/default_test.go:.*\",\"msg\":\"Hello\"," +
"\"stack\":\".*\"}",
true, true, DebugLevel},
{func() { Info("Hello") }, "{\"level\":\"info\",\"time\":\"" + timePattern + "\",\"caller\":\"log/default_test.go:.*\",\"msg\":\"Hello\"," +
"\"stack\":\".*\"}",
true, true, DebugLevel},
{func() { Warn("Hello") }, "{\"level\":\"warn\",\"time\":\"" + timePattern + "\",\"caller\":\"log/default_test.go:.*\",\"msg\":\"Hello\"," +
"\"stack\":\".*\"}",
true, true, DebugLevel},
{func() { Error("Hello") }, "{\"level\":\"error\",\"time\":\"" + timePattern + "\",\"caller\":\"log/default_test.go:.*\",\"msg\":\"Hello\"," +
"\"stack\":\".*\"}",
true, true, DebugLevel},
{func() { Fatal("Hello") }, "{\"level\":\"fatal\",\"time\":\"" + timePattern + "\",\"caller\":\"log/default_test.go:.*\",\"msg\":\"Hello\"," +
"\"stack\":\".*\"}",
true, true, DebugLevel},
{
f: func() { Debug("Hello") },
pat: timePattern + "\tdebug\tHello",
},
{
f: func() { Debugf("Hello") },
pat: timePattern + "\tdebug\tHello",
},
{
f: func() { Debugf("%s", "Hello") },
pat: timePattern + "\tdebug\tHello",
},
{
f: func() { Debuga("Hello") },
pat: timePattern + "\tdebug\tHello",
},

{
f: func() { Info("Hello") },
pat: timePattern + "\tinfo\tHello",
},
{
f: func() { Infof("Hello") },
pat: timePattern + "\tinfo\tHello",
},
{
f: func() { Infof("%s", "Hello") },
pat: timePattern + "\tinfo\tHello",
},
{
f: func() { Infoa("Hello") },
pat: timePattern + "\tinfo\tHello",
},

{
f: func() { Warn("Hello") },
pat: timePattern + "\twarn\tHello",
},
{
f: func() { Warnf("Hello") },
pat: timePattern + "\twarn\tHello",
},
{
f: func() { Warnf("%s", "Hello") },
pat: timePattern + "\twarn\tHello",
},
{
f: func() { Warna("Hello") },
pat: timePattern + "\twarn\tHello",
},

{
f: func() { Error("Hello") },
pat: timePattern + "\terror\tHello",
},
{
f: func() { Errorf("Hello") },
pat: timePattern + "\terror\tHello",
},
{
f: func() { Errorf("%s", "Hello") },
pat: timePattern + "\terror\tHello",
},
{
f: func() { Errora("Hello") },
pat: timePattern + "\terror\tHello",
},

{
f: func() { Fatal("Hello") },
pat: timePattern + "\tfatal\tHello",
wantExit: true,
},
{
f: func() { Fatalf("Hello") },
pat: timePattern + "\tfatal\tHello",
wantExit: true,
},
{
f: func() { Fatalf("%s", "Hello") },
pat: timePattern + "\tfatal\tHello",
wantExit: true,
},
{
f: func() { Fatala("Hello") },
pat: timePattern + "\tfatal\tHello",
wantExit: true,
},

{
f: func() { Debug("Hello") },
pat: timePattern + "\tdebug\tlog/default_test.go:.*\tHello",
caller: true,
},

{
f: func() { Debug("Hello") },
pat: "{\"level\":\"debug\",\"time\":\"" + timePattern + "\",\"caller\":\"log/default_test.go:.*\",\"msg\":\"Hello\"," +
"\"stack\":\".*\"}",
json: true,
caller: true,
stackLevel: DebugLevel,
},
{
f: func() { Info("Hello") },
pat: "{\"level\":\"info\",\"time\":\"" + timePattern + "\",\"caller\":\"log/default_test.go:.*\",\"msg\":\"Hello\"," +
"\"stack\":\".*\"}",
json: true,
caller: true,
stackLevel: DebugLevel,
},
{
f: func() { Warn("Hello") },
pat: "{\"level\":\"warn\",\"time\":\"" + timePattern + "\",\"caller\":\"log/default_test.go:.*\",\"msg\":\"Hello\"," +
"\"stack\":\".*\"}",
json: true,
caller: true,
stackLevel: DebugLevel,
},
{
f: func() { Error("Hello") },
pat: "{\"level\":\"error\",\"time\":\"" + timePattern + "\",\"caller\":\"log/default_test.go:.*\",\"msg\":\"Hello\"," +
"\"stack\":\".*\"}",
json: true,
caller: true,
stackLevel: DebugLevel,
},
{
f: func() { Fatal("Hello") },
pat: "{\"level\":\"fatal\",\"time\":\"" + timePattern + "\",\"caller\":\"log/default_test.go:.*\",\"msg\":\"Hello\"," +
"\"stack\":\".*\"}",
json: true,
caller: true,
wantExit: true,
stackLevel: DebugLevel,
},
}

for i, c := range cases {
t.Run(strconv.Itoa(i), func(t *testing.T) {
var exitCalled bool
lines, err := captureStdout(func() {
o := DefaultOptions()
o := testOptions()
o.JSONEncoding = c.json
o.testonlyExit = func() {
exitCalled = true
}

if err := Configure(o); err != nil {
t.Errorf("Got err '%v', expecting success", err)
Expand All @@ -90,6 +197,14 @@ func TestDefault(t *testing.T) {
_ = Sync()
})

if exitCalled != c.wantExit {
var verb string
if c.wantExit {
verb = " never"
}
t.Errorf("os.Exit%s called", verb)
}

if err != nil {
t.Errorf("Got error '%v', expected success", err)
}
Expand Down Expand Up @@ -120,8 +235,9 @@ func TestEnabled(t *testing.T) {

for i, c := range cases {
t.Run(strconv.Itoa(i), func(t *testing.T) {
o := DefaultOptions()
o := testOptions()
o.SetOutputLevel(DefaultScopeName, c.level)
o.testonlyExit = func() {}
_ = Configure(o)

if c.debugEnabled != DebugEnabled() {
Expand Down
3 changes: 3 additions & 0 deletions pkg/log/options.go
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,9 @@ type Options struct {
outputLevels string
logCallers string
stackTraceLevels string

// If not nil, called instead of os.Exit.
testonlyExit func()
}

// DefaultOptions returns a new set of options, initialized to the defaults
Expand Down
Loading