1
0

check_client_ip_frozen_ban_test.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. package job
  2. import (
  3. "os"
  4. "strings"
  5. "testing"
  6. "time"
  7. )
  8. func banLineCount(t *testing.T, email string) int {
  9. t.Helper()
  10. body, err := os.ReadFile(readIpLimitLogPath())
  11. if err != nil {
  12. if os.IsNotExist(err) {
  13. return 0
  14. }
  15. t.Fatalf("read 3xipl.log: %v", err)
  16. }
  17. return strings.Count(string(body), "[LIMIT_IP] Email = "+email)
  18. }
  19. func TestUpdateInboundClientIps_FrozenLastSeenBannedOnce(t *testing.T) {
  20. setupIntegrationDB(t)
  21. const email = "frozen-ban"
  22. seedInboundWithClient(t, "inbound-frozen-ban", email, 1)
  23. now := time.Now().Unix()
  24. deadStart := now - 300
  25. live := []IPWithTimestamp{
  26. {IP: "10.2.0.1", Timestamp: deadStart},
  27. {IP: "192.0.2.7", Timestamp: now},
  28. }
  29. j := NewCheckClientIpJob()
  30. inbound, err := j.getInboundByEmail(email)
  31. if err != nil {
  32. t.Fatalf("getInboundByEmail: %v", err)
  33. }
  34. row := seedClientIps(t, email, nil)
  35. if banned, _ := j.enforceIpLimitForTest(t, row, inbound, email, 1, live, true); !banned {
  36. t.Fatalf("first scan: the over-limit stale IP must be banned")
  37. }
  38. if got := banLineCount(t, email); got != 1 {
  39. t.Fatalf("ban lines after first scan = %d, want 1", got)
  40. }
  41. if banned, _ := j.enforceIpLimitForTest(t, row, inbound, email, 1, live, true); banned {
  42. t.Fatalf("second scan with a frozen lastSeen must not re-ban a dead connection")
  43. }
  44. if got := banLineCount(t, email); got != 1 {
  45. t.Fatalf("ban lines after frozen rescan = %d, want still 1", got)
  46. }
  47. reconnected := []IPWithTimestamp{
  48. {IP: "10.2.0.1", Timestamp: now + 30},
  49. {IP: "192.0.2.7", Timestamp: now + 60},
  50. }
  51. if banned, _ := j.enforceIpLimitForTest(t, row, inbound, email, 1, reconnected, true); !banned {
  52. t.Fatalf("a reconnect (advanced lastSeen) must be banned again")
  53. }
  54. if got := banLineCount(t, email); got != 2 {
  55. t.Fatalf("ban lines after reconnect = %d, want 2", got)
  56. }
  57. }