concurrency_cache_live_test.go 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. package repository
  2. import (
  3. "context"
  4. "testing"
  5. "time"
  6. "github.com/Wei-Shaw/sub2api/internal/service"
  7. "github.com/alicebob/miniredis/v2"
  8. "github.com/redis/go-redis/v9"
  9. "github.com/stretchr/testify/require"
  10. )
  11. func TestLiveLeaseReplacesRegularSlotsAndCountsTowardLimits(t *testing.T) {
  12. redisServer := miniredis.RunT(t)
  13. client := redis.NewClient(&redis.Options{Addr: redisServer.Addr()})
  14. regular := NewConcurrencyCache(client, 15, 900)
  15. live, ok := regular.(service.LiveConcurrencyCache)
  16. require.True(t, ok)
  17. ctx := context.Background()
  18. accountAcquired, err := regular.AcquireAccountSlot(ctx, 10, 1, "regular-account")
  19. require.NoError(t, err)
  20. require.True(t, accountAcquired)
  21. userAcquired, err := regular.AcquireUserSlot(ctx, 20, 1, "regular-user")
  22. require.NoError(t, err)
  23. require.True(t, userAcquired)
  24. acquired, err := live.AcquireLiveLease(ctx, 10, 1, 20, 1, 30, "live-lease", true)
  25. require.NoError(t, err)
  26. require.True(t, acquired)
  27. require.NoError(t, regular.ReleaseAccountSlot(ctx, 10, "regular-account"))
  28. require.NoError(t, regular.ReleaseUserSlot(ctx, 20, "regular-user"))
  29. accountCount, err := regular.GetAccountConcurrency(ctx, 10)
  30. require.NoError(t, err)
  31. require.Equal(t, 1, accountCount)
  32. userCount, err := regular.GetUserConcurrency(ctx, 20)
  33. require.NoError(t, err)
  34. require.Equal(t, 1, userCount)
  35. accountAcquired, err = regular.AcquireAccountSlot(ctx, 10, 1, "ordinary-blocked")
  36. require.NoError(t, err)
  37. require.False(t, accountAcquired)
  38. refreshed, err := live.RefreshLiveLease(ctx, 10, 20, 30, "live-lease")
  39. require.NoError(t, err)
  40. require.True(t, refreshed)
  41. require.NoError(t, live.ReleaseLiveLease(ctx, 10, 20, 30, "live-lease"))
  42. accountAcquired, err = regular.AcquireAccountSlot(ctx, 10, 1, "ordinary-allowed")
  43. require.NoError(t, err)
  44. require.True(t, accountAcquired)
  45. }
  46. func TestLiveLeaseExpiresWithoutRefresh(t *testing.T) {
  47. redisServer := miniredis.RunT(t)
  48. client := redis.NewClient(&redis.Options{Addr: redisServer.Addr()})
  49. regular := NewConcurrencyCache(client, 15, 900)
  50. live, ok := regular.(service.LiveConcurrencyCache)
  51. require.True(t, ok)
  52. ctx := context.Background()
  53. acquired, err := live.AcquireLiveLease(ctx, 10, 1, 20, 1, 30, "expired-live", false)
  54. require.NoError(t, err)
  55. require.True(t, acquired)
  56. redisServer.FastForward(61 * time.Second)
  57. acquired, err = regular.AcquireAccountSlot(ctx, 10, 1, "ordinary-after-expiry")
  58. require.NoError(t, err)
  59. require.True(t, acquired)
  60. refreshed, err := live.RefreshLiveLease(ctx, 10, 20, 30, "expired-live")
  61. require.NoError(t, err)
  62. require.False(t, refreshed)
  63. }