cache_test.go 1.8 KB

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