123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142 |
- package explogin
- import (
- "net/http"
- "testing"
- )
- func TestAllowImmediateAccess_FirstAttempt(t *testing.T) {
- handler := NewExponentialLoginHandler(2, 10)
- username := "testuser"
- request, _ := http.NewRequest("GET", "/", nil)
- allowed, _ := handler.AllowImmediateAccess(username, request)
- if !allowed {
- t.Error("Access should be allowed for the first attempt")
- }
- }
- func TestAllowImmediateAccess_LimitExceeded(t *testing.T) {
- handler := NewExponentialLoginHandler(2, 10)
- username := "testuser"
- request, _ := http.NewRequest("GET", "/", nil)
- // Set the retry count to a value exceeding the limit
- handler.AddUserRetrycount(username, request)
- handler.AddUserRetrycount(username, request)
- handler.AddUserRetrycount(username, request)
- allowed, _ := handler.AllowImmediateAccess(username, request)
- if allowed {
- t.Error("Access should be denied when retry count exceeds the limit")
- }
- }
- func TestAddUserRetrycount(t *testing.T) {
- handler := NewExponentialLoginHandler(2, 10)
- username := "testuser"
- request, _ := http.NewRequest("GET", "/", nil)
- handler.AddUserRetrycount(username, request)
- entry, exists := handler.LoginRecord.Load(username + "/0.0.0.0")
- if !exists {
- t.Error("User entry should exist after failed login attempt")
- }
- loginEntry := entry.(*UserLoginEntry)
- if loginEntry.RetryCount != 1 {
- t.Errorf("Retry count should be 1, got %d", loginEntry.RetryCount)
- }
- }
- func TestResetUserRetryCount(t *testing.T) {
- handler := NewExponentialLoginHandler(2, 10)
- username := "testuser"
- request, _ := http.NewRequest("GET", "/", nil)
- handler.AddUserRetrycount(username, request)
- handler.ResetUserRetryCount(username, request)
- _, exists := handler.LoginRecord.Load(username + "/0.0.0.0")
- if exists {
- t.Error("User entry should be reset after successful login")
- }
- }
- func TestResetAllUserRetryCounter(t *testing.T) {
- handler := NewExponentialLoginHandler(2, 10)
- username1 := "testuser1"
- username2 := "testuser2"
- request, _ := http.NewRequest("GET", "/", nil)
- handler.AddUserRetrycount(username1, request)
- handler.AddUserRetrycount(username2, request)
- handler.ResetAllUserRetryCounter()
- _, exists1 := handler.LoginRecord.Load(username1 + "/0.0.0.0")
- _, exists2 := handler.LoginRecord.Load(username2 + "/0.0.0.0")
- if exists1 || exists2 {
- t.Error("All user entries should be reset")
- }
- }
- func TestGetDelayTimeFromRetryCount(t *testing.T) {
- handler := NewExponentialLoginHandler(2, 10)
- // Test with different retry counts
- tests := []struct {
- retryCount int
- expected int64
- }{
- {1, 2},
- {2, 3},
- {3, 5},
- {4, 9},
- {5, 10},
- {6, 10}, // Exceeds the DelayCeiling
- }
- for _, test := range tests {
- result := handler.getDelayTimeFromRetryCount(test.retryCount)
- if result != test.expected {
- t.Errorf("For RetryCount %d, expected delay %d, got %d", test.retryCount, test.expected, result)
- }
- }
- }
- func TestAllowImmediateAccess_DeniedUntilNextRetry(t *testing.T) {
- handler := NewExponentialLoginHandler(2, 10)
- username := "testuser"
- request, _ := http.NewRequest("GET", "/", nil)
- // Deny access and retrieve the remaining time until the next retry
- handler.AddUserRetrycount(username, request)
- handler.AddUserRetrycount(username, request)
- handler.AddUserRetrycount(username, request)
- allowed, remainingTime := handler.AllowImmediateAccess(username, request)
- //t.Log(allowed, remainingTime)
- if allowed || remainingTime == 0 {
- t.Error("Access should be denied, and remaining time should be greater than 0")
- }
- }
- func TestAllowImmediateAccess_IPNotFound(t *testing.T) {
- handler := NewExponentialLoginHandler(2, 10)
- username := "testuser"
- request, _ := http.NewRequest("GET", "/", nil)
- allowed, _ := handler.AllowImmediateAccess(username, request)
- if !allowed {
- t.Error("Access should be allowed even if IP information is not found")
- }
- }
|