hub_test.go 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. package loghub
  2. import (
  3. "context"
  4. "io"
  5. "log/slog"
  6. "testing"
  7. "time"
  8. )
  9. func TestHubHistoryFiltersAndBounds(t *testing.T) {
  10. hub := New(slog.NewTextHandler(io.Discard, nil), 100)
  11. logger := slog.New(hub)
  12. logger.Debug("hidden")
  13. logger.Info("modem ready", "device", "ec20")
  14. logger.Warn("retry", "device", "ec20")
  15. history := hub.History(10, slog.LevelInfo, "ec20")
  16. if len(history) != 2 {
  17. t.Fatalf("History() length = %d, want 2", len(history))
  18. }
  19. if history[0].Message != "modem ready" || history[1].Message != "retry" {
  20. t.Fatalf("History() = %#v", history)
  21. }
  22. history[0].Fields["device"] = "changed"
  23. again := hub.History(10, slog.LevelInfo, "")
  24. if again[0].Fields["device"] != "ec20" {
  25. t.Fatal("History() exposed mutable internal fields")
  26. }
  27. }
  28. func TestHubSubscription(t *testing.T) {
  29. hub := New(slog.NewTextHandler(io.Discard, nil), 100)
  30. entries, cancel := hub.Subscribe(1)
  31. defer cancel()
  32. record := slog.NewRecord(time.Now(), slog.LevelError, "failure", 0)
  33. record.Add("stage", "ims")
  34. if err := hub.Handle(context.Background(), record); err != nil {
  35. t.Fatal(err)
  36. }
  37. select {
  38. case entry := <-entries:
  39. if entry.Level != "error" || entry.Fields["stage"] != "ims" {
  40. t.Fatalf("entry = %#v", entry)
  41. }
  42. case <-time.After(time.Second):
  43. t.Fatal("timed out waiting for log entry")
  44. }
  45. }