introduces a new configuration option logTimeFormat that allows customizing the timestamp in log messages using golang's built in time format constants. The default remains no timestamp.
116 lines
2.5 KiB
Go
116 lines
2.5 KiB
Go
package proxy
|
|
|
|
import (
|
|
"bytes"
|
|
"io"
|
|
"strings"
|
|
"sync"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func TestLogMonitor(t *testing.T) {
|
|
logMonitor := NewLogMonitorWriter(io.Discard)
|
|
|
|
// A WaitGroup is used to wait for all the expected writes to complete
|
|
var wg sync.WaitGroup
|
|
|
|
client1Messages := make([]byte, 0)
|
|
client2Messages := make([]byte, 0)
|
|
|
|
defer logMonitor.OnLogData(func(data []byte) {
|
|
client1Messages = append(client1Messages, data...)
|
|
wg.Done()
|
|
})()
|
|
|
|
defer logMonitor.OnLogData(func(data []byte) {
|
|
client2Messages = append(client2Messages, data...)
|
|
wg.Done()
|
|
})()
|
|
|
|
wg.Add(6) // 2 x 3 writes
|
|
|
|
logMonitor.Write([]byte("1"))
|
|
logMonitor.Write([]byte("2"))
|
|
logMonitor.Write([]byte("3"))
|
|
|
|
// wait for all writes to complete
|
|
wg.Wait()
|
|
|
|
// Check the buffer
|
|
expectedHistory := "123"
|
|
history := string(logMonitor.GetHistory())
|
|
|
|
if history != expectedHistory {
|
|
t.Errorf("Expected history: %s, got: %s", expectedHistory, history)
|
|
}
|
|
|
|
c1Data := string(client1Messages)
|
|
if c1Data != expectedHistory {
|
|
t.Errorf("Client1 expected %s, got: %s", expectedHistory, c1Data)
|
|
}
|
|
|
|
c2Data := string(client2Messages)
|
|
if c2Data != expectedHistory {
|
|
t.Errorf("Client2 expected %s, got: %s", expectedHistory, c2Data)
|
|
}
|
|
}
|
|
|
|
func TestWrite_ImmutableBuffer(t *testing.T) {
|
|
// Create a new LogMonitor instance
|
|
lm := NewLogMonitorWriter(io.Discard)
|
|
|
|
// Prepare a message to write
|
|
msg := []byte("Hello, World!")
|
|
lenmsg := len(msg)
|
|
|
|
// Write the message to the LogMonitor
|
|
n, err := lm.Write(msg)
|
|
if err != nil {
|
|
t.Fatalf("Write failed: %v", err)
|
|
}
|
|
|
|
if n != lenmsg {
|
|
t.Errorf("Expected %d bytes written but got %d", lenmsg, n)
|
|
}
|
|
|
|
// Change the original message
|
|
msg[0] = 'B' // This should not affect the buffer
|
|
|
|
// Get the history from the LogMonitor
|
|
history := lm.GetHistory()
|
|
|
|
// Check that the history contains the original message, not the modified one
|
|
expected := []byte("Hello, World!")
|
|
if !bytes.Equal(history, expected) {
|
|
t.Errorf("Expected history to be %q, got %q", expected, history)
|
|
}
|
|
}
|
|
|
|
func TestWrite_LogTimeFormat(t *testing.T) {
|
|
// Create a new LogMonitor instance
|
|
lm := NewLogMonitorWriter(io.Discard)
|
|
|
|
// Enable timestamps
|
|
lm.timeFormat = time.RFC3339
|
|
|
|
// Write the message to the LogMonitor
|
|
lm.Info("Hello, World!")
|
|
|
|
// Get the history from the LogMonitor
|
|
history := lm.GetHistory()
|
|
|
|
timestamp := ""
|
|
fields := strings.Fields(string(history))
|
|
if len(fields) > 0 {
|
|
timestamp = fields[0]
|
|
} else {
|
|
t.Fatalf("Cannot extract string from history")
|
|
}
|
|
|
|
_, err := time.Parse(time.RFC3339, timestamp)
|
|
if err != nil {
|
|
t.Fatalf("Cannot find timestamp: %v", err)
|
|
}
|
|
}
|