1
0

cache_test.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. package firewall
  2. import (
  3. "bytes"
  4. "log/slog"
  5. "strings"
  6. "testing"
  7. "github.com/slackhq/nebula/test"
  8. "github.com/stretchr/testify/assert"
  9. )
  10. // The tests below pin the log format produced by ConntrackCacheTicker.Get
  11. // so changes cannot silently break what operators are grepping for. The
  12. // ticker's internal state (cache + cacheTick) is poked directly to avoid
  13. // racing a goroutine-driven tick in tests.
  14. func newFixedTicker(t *testing.T, l *slog.Logger, cacheLen int) *ConntrackCacheTicker {
  15. t.Helper()
  16. c := &ConntrackCacheTicker{
  17. l: l,
  18. cache: make(ConntrackCache, cacheLen),
  19. }
  20. for i := 0; i < cacheLen; i++ {
  21. c.cache[Packet{LocalPort: uint16(i) + 1}] = struct{}{}
  22. }
  23. c.cacheTick.Store(1) // cacheV starts at 0, so Get() takes the reset path
  24. return c
  25. }
  26. func TestConntrackCacheTicker_Get_TextFormat(t *testing.T) {
  27. buf := &bytes.Buffer{}
  28. l := test.NewLoggerWithOutputAndLevel(buf, slog.LevelDebug)
  29. c := newFixedTicker(t, l, 3)
  30. c.Get()
  31. assert.Equal(t, "level=DEBUG msg=\"resetting conntrack cache\" len=3\n", buf.String())
  32. }
  33. func TestConntrackCacheTicker_Get_JSONFormat(t *testing.T) {
  34. buf := &bytes.Buffer{}
  35. l := test.NewJSONLoggerWithOutput(buf, slog.LevelDebug)
  36. c := newFixedTicker(t, l, 2)
  37. c.Get()
  38. assert.JSONEq(t, `{"level":"DEBUG","msg":"resetting conntrack cache","len":2}`, strings.TrimSpace(buf.String()))
  39. }
  40. func TestConntrackCacheTicker_Get_QuietBelowDebug(t *testing.T) {
  41. buf := &bytes.Buffer{}
  42. l := test.NewLoggerWithOutputAndLevel(buf, slog.LevelInfo)
  43. c := newFixedTicker(t, l, 5)
  44. c.Get()
  45. assert.Empty(t, buf.String())
  46. }
  47. func TestConntrackCacheTicker_Get_QuietWhenCacheEmpty(t *testing.T) {
  48. buf := &bytes.Buffer{}
  49. l := test.NewLoggerWithOutputAndLevel(buf, slog.LevelDebug)
  50. c := newFixedTicker(t, l, 0)
  51. c.Get()
  52. assert.Empty(t, buf.String())
  53. }