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) } }