explogin_test.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. package explogin
  2. import (
  3. "net/http"
  4. "testing"
  5. )
  6. func TestAllowImmediateAccess_FirstAttempt(t *testing.T) {
  7. handler := NewExponentialLoginHandler(2, 10)
  8. username := "testuser"
  9. request, _ := http.NewRequest("GET", "/", nil)
  10. allowed, _ := handler.AllowImmediateAccess(username, request)
  11. if !allowed {
  12. t.Error("Access should be allowed for the first attempt")
  13. }
  14. }
  15. func TestAllowImmediateAccess_LimitExceeded(t *testing.T) {
  16. handler := NewExponentialLoginHandler(2, 10)
  17. username := "testuser"
  18. request, _ := http.NewRequest("GET", "/", nil)
  19. // Set the retry count to a value exceeding the limit
  20. handler.AddUserRetrycount(username, request)
  21. handler.AddUserRetrycount(username, request)
  22. handler.AddUserRetrycount(username, request)
  23. allowed, _ := handler.AllowImmediateAccess(username, request)
  24. if allowed {
  25. t.Error("Access should be denied when retry count exceeds the limit")
  26. }
  27. }
  28. func TestAddUserRetrycount(t *testing.T) {
  29. handler := NewExponentialLoginHandler(2, 10)
  30. username := "testuser"
  31. request, _ := http.NewRequest("GET", "/", nil)
  32. handler.AddUserRetrycount(username, request)
  33. entry, exists := handler.LoginRecord.Load(username + "/0.0.0.0")
  34. if !exists {
  35. t.Error("User entry should exist after failed login attempt")
  36. }
  37. loginEntry := entry.(*UserLoginEntry)
  38. if loginEntry.RetryCount != 1 {
  39. t.Errorf("Retry count should be 1, got %d", loginEntry.RetryCount)
  40. }
  41. }
  42. func TestResetUserRetryCount(t *testing.T) {
  43. handler := NewExponentialLoginHandler(2, 10)
  44. username := "testuser"
  45. request, _ := http.NewRequest("GET", "/", nil)
  46. handler.AddUserRetrycount(username, request)
  47. handler.ResetUserRetryCount(username, request)
  48. _, exists := handler.LoginRecord.Load(username + "/0.0.0.0")
  49. if exists {
  50. t.Error("User entry should be reset after successful login")
  51. }
  52. }
  53. func TestResetAllUserRetryCounter(t *testing.T) {
  54. handler := NewExponentialLoginHandler(2, 10)
  55. username1 := "testuser1"
  56. username2 := "testuser2"
  57. request, _ := http.NewRequest("GET", "/", nil)
  58. handler.AddUserRetrycount(username1, request)
  59. handler.AddUserRetrycount(username2, request)
  60. handler.ResetAllUserRetryCounter()
  61. _, exists1 := handler.LoginRecord.Load(username1 + "/0.0.0.0")
  62. _, exists2 := handler.LoginRecord.Load(username2 + "/0.0.0.0")
  63. if exists1 || exists2 {
  64. t.Error("All user entries should be reset")
  65. }
  66. }
  67. func TestGetDelayTimeFromRetryCount(t *testing.T) {
  68. handler := NewExponentialLoginHandler(2, 10)
  69. // Test with different retry counts
  70. tests := []struct {
  71. retryCount int
  72. expected int64
  73. }{
  74. {1, 2},
  75. {2, 3},
  76. {3, 5},
  77. {4, 9},
  78. {5, 10},
  79. {6, 10}, // Exceeds the DelayCeiling
  80. }
  81. for _, test := range tests {
  82. result := handler.getDelayTimeFromRetryCount(test.retryCount)
  83. if result != test.expected {
  84. t.Errorf("For RetryCount %d, expected delay %d, got %d", test.retryCount, test.expected, result)
  85. }
  86. }
  87. }
  88. func TestAllowImmediateAccess_DeniedUntilNextRetry(t *testing.T) {
  89. handler := NewExponentialLoginHandler(2, 10)
  90. username := "testuser"
  91. request, _ := http.NewRequest("GET", "/", nil)
  92. // Deny access and retrieve the remaining time until the next retry
  93. handler.AddUserRetrycount(username, request)
  94. handler.AddUserRetrycount(username, request)
  95. handler.AddUserRetrycount(username, request)
  96. allowed, remainingTime := handler.AllowImmediateAccess(username, request)
  97. //t.Log(allowed, remainingTime)
  98. if allowed || remainingTime == 0 {
  99. t.Error("Access should be denied, and remaining time should be greater than 0")
  100. }
  101. }
  102. func TestAllowImmediateAccess_IPNotFound(t *testing.T) {
  103. handler := NewExponentialLoginHandler(2, 10)
  104. username := "testuser"
  105. request, _ := http.NewRequest("GET", "/", nil)
  106. allowed, _ := handler.AllowImmediateAccess(username, request)
  107. if !allowed {
  108. t.Error("Access should be allowed even if IP information is not found")
  109. }
  110. }