diff --git a/logs/conn.go b/logs/conn.go index afe0cbb7..74c458ab 100644 --- a/logs/conn.go +++ b/logs/conn.go @@ -63,7 +63,10 @@ func (c *connWriter) WriteMsg(when time.Time, msg string, level int) error { defer c.innerWriter.Close() } - c.lg.writeln(when, msg) + _, err := c.lg.writeln(when, msg) + if err != nil { + return err + } return nil } @@ -101,7 +104,6 @@ func (c *connWriter) connect() error { func (c *connWriter) needToConnectOnMsg() bool { if c.Reconnect { - c.Reconnect = false return true } diff --git a/logs/conn_test.go b/logs/conn_test.go index 747fb890..bb377d41 100644 --- a/logs/conn_test.go +++ b/logs/conn_test.go @@ -15,11 +15,65 @@ package logs import ( + "net" + "os" "testing" ) +// ConnTCPListener takes a TCP listener and accepts n TCP connections +// Returns connections using connChan +func connTCPListener(t *testing.T, n int, ln net.Listener, connChan chan<- net.Conn) { + + // Listen and accept n incoming connections + for i := 0; i < n; i++ { + conn, err := ln.Accept() + if err != nil { + t.Log("Error accepting connection: ", err.Error()) + os.Exit(1) + } + + // Send accepted connection to channel + connChan <- conn + } + ln.Close() + close(connChan) +} + func TestConn(t *testing.T) { log := NewLogger(1000) log.SetLogger("conn", `{"net":"tcp","addr":":7020"}`) log.Informational("informational") } + +func TestReconnect(t *testing.T) { + // Setup connection listener + newConns := make(chan net.Conn) + connNum := 2 + ln, err := net.Listen("tcp", ":6002") + if err != nil { + t.Log("Error listening:", err.Error()) + os.Exit(1) + } + go connTCPListener(t, connNum, ln, newConns) + + // Setup logger + log := NewLogger(1000) + log.SetPrefix("test") + log.SetLogger(AdapterConn, `{"net":"tcp","reconnect":true,"level":6,"addr":":6002"}`) + log.Informational("informational 1") + + // Refuse first connection + first := <-newConns + first.Close() + + // Send another log after conn closed + log.Informational("informational 2") + + // Check if there was a second connection attempt + select { + case second := <-newConns: + second.Close() + default: + t.Error("Did not reconnect") + } +} diff --git a/logs/logger.go b/logs/logger.go index c7cf8a56..a28bff6f 100644 --- a/logs/logger.go +++ b/logs/logger.go @@ -30,11 +30,12 @@ func newLogWriter(wr io.Writer) *logWriter { return &logWriter{writer: wr} } -func (lg *logWriter) writeln(when time.Time, msg string) { +func (lg *logWriter) writeln(when time.Time, msg string) (int, error) { lg.Lock() h, _, _ := formatTimeHeader(when) - lg.writer.Write(append(append(h, msg...), '\n')) + n, err := lg.writer.Write(append(append(h, msg...), '\n')) lg.Unlock() + return n, err } const (