summaryrefslogtreecommitdiff
path: root/logger
diff options
authorMichael Vogt <michael.vogt@ubuntu.com>2015-05-20 08:35:34 +0200
committerMichael Vogt <michael.vogt@ubuntu.com>2015-05-20 08:35:34 +0200
commit0b8ac8f35ddb73fdf43b9cd52a3a269f408e2f1f (patch)
treed0812e0d9bd40bd733d5411691f3f242f6f29fa8 /logger
parentcb285ad98cf5e7feebe37db51eed5d644fc3f131 (diff)
logger: add missing tests and fix crash when syslog is not available (thanks John!)
Diffstat (limited to 'logger')
-rw-r--r--logger/logger.go11
-rw-r--r--logger/logger_test.go36
2 files changed, 41 insertions, 6 deletions
diff --git a/logger/logger.go b/logger/logger.go
index 0bb0e70f34..0fce8d091d 100644
--- a/logger/logger.go
+++ b/logger/logger.go
@@ -20,6 +20,7 @@ package logger
import (
"fmt"
"io"
+ "io/ioutil"
"log"
"log/syslog"
"os"
@@ -112,14 +113,22 @@ func (l *ConsoleLog) Notice(msg string) {
l.log.Output(3, msg)
}
+// variable to allow mocking the syslog.NewLogger call in the tests
+var newSyslog = newSyslogImpl
+
+func newSyslogImpl() (*log.Logger, error) {
+ return syslog.NewLogger(SyslogPriority, SyslogFlags)
+}
+
// NewConsoleLog creates a ConsoleLog with a log.Logger using the given
// io.Writer and flag, and a syslog.Writer.
func NewConsoleLog(w io.Writer, flag int) (*ConsoleLog, error) {
clog := log.New(w, "", flag)
- sys, err := syslog.NewLogger(SyslogPriority, SyslogFlags)
+ sys, err := newSyslog()
if err != nil {
clog.Output(3, "WARNING: can not create syslog logger")
+ sys = log.New(ioutil.Discard, "", flag)
}
return &ConsoleLog{
diff --git a/logger/logger_test.go b/logger/logger_test.go
index 209393a49c..af311ab75e 100644
--- a/logger/logger_test.go
+++ b/logger/logger_test.go
@@ -19,8 +19,9 @@ package logger
import (
"bytes"
+ "fmt"
+ "io/ioutil"
"log"
- "log/syslog"
"testing"
. "launchpad.net/gocheck"
@@ -36,15 +37,17 @@ type LogSuite struct{}
func (s *LogSuite) SetUpTest(c *C) {
c.Assert(logger, Equals, NullLogger)
- // sbuild environments do not allow talking to /dev/log
- _, err := syslog.NewLogger(SyslogPriority, SyslogFlags)
- if err != nil {
- c.Skip("/dev/log can not be accessed")
+ // we do not want to pollute syslog in our tests (and sbuild
+ // will also not let us do that)
+ newSyslog = func() (*log.Logger, error) {
+ l := log.New(ioutil.Discard, "discarded-log-msg", 0)
+ return l, nil
}
}
func (s *LogSuite) TearDownTest(c *C) {
SetLogger(NullLogger)
+ newSyslog = newSyslogImpl
}
func (s *LogSuite) TestDefault(c *C) {
@@ -109,3 +112,26 @@ func (s *LogSuite) TestPanicf(c *C) {
c.Check(sysbuf.String(), Matches, `(?m).*logger_test\.go:\d+: PANIC xyzzy`)
c.Check(logbuf.String(), Matches, `(?m).*logger_test\.go:\d+: PANIC xyzzy`)
}
+
+func (s *LogSuite) TestSyslogFails(c *C) {
+ var logbuf bytes.Buffer
+
+ // pretend syslog is not available (e.g. because of no /dev/log in
+ // a chroot or something)
+ newSyslog = func() (*log.Logger, error) {
+ return nil, fmt.Errorf("nih! nih!")
+ }
+
+ // ensure a warning is displayed
+ l, err := NewConsoleLog(&logbuf, DefaultFlags)
+ c.Assert(err, IsNil)
+ c.Check(logbuf.String(), Matches, `(?m).*:\d+: WARNING: can not create syslog logger`)
+
+ // ensure that even without a syslog the console log works and we
+ // do not crash
+ logbuf.Reset()
+ SetLogger(l)
+ Noticef("I do not want to crash")
+ c.Check(logbuf.String(), Matches, `(?m).*logger_test\.go:\d+: I do not want to crash`)
+
+}