influxdb/server/server_test.go

75 lines
1.7 KiB
Go

package server_test
import (
"fmt"
"io"
"github.com/influxdata/chronograf"
)
type LogMessage struct {
Level string
Body string
}
// TestLogger is a chronograf.Logger which allows assertions to be made on the
// contents of its messages.
type TestLogger struct {
Messages []LogMessage
}
func (tl *TestLogger) Debug(args ...interface{}) {
tl.Messages = append(tl.Messages, LogMessage{"debug", tl.stringify(args...)})
}
func (tl *TestLogger) Info(args ...interface{}) {
tl.Messages = append(tl.Messages, LogMessage{"info", tl.stringify(args...)})
}
func (tl *TestLogger) Error(args ...interface{}) {
tl.Messages = append(tl.Messages, LogMessage{"error", tl.stringify(args...)})
}
func (tl *TestLogger) WithField(key string, value interface{}) chronograf.Logger {
return tl
}
func (tl *TestLogger) Writer() *io.PipeWriter {
_, write := io.Pipe()
return write
}
// HasMessage will return true if the TestLogger has been called with an exact
// match of a particular log message at a particular log level
func (tl *TestLogger) HasMessage(level string, body string) bool {
for _, msg := range tl.Messages {
if msg.Level == level && msg.Body == body {
return true
}
}
return false
}
func (tl *TestLogger) stringify(args ...interface{}) string {
out := []byte{}
for _, arg := range args[:len(args)-1] {
out = append(out, tl.stringifyArg(arg)...)
out = append(out, []byte(" ")...)
}
out = append(out, tl.stringifyArg(args[len(args)-1])...)
return string(out)
}
func (tl *TestLogger) stringifyArg(arg interface{}) []byte {
switch a := arg.(type) {
case fmt.Stringer:
return []byte(a.String())
case error:
return []byte(a.Error())
case string:
return []byte(a)
default:
return []byte("UNKNOWN")
}
}