| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- package repository
- import (
- "context"
- "testing"
- "time"
- "github.com/Wei-Shaw/sub2api/internal/service"
- "github.com/alicebob/miniredis/v2"
- "github.com/redis/go-redis/v9"
- "github.com/stretchr/testify/require"
- )
- func TestLiveLeaseReplacesRegularSlotsAndCountsTowardLimits(t *testing.T) {
- redisServer := miniredis.RunT(t)
- client := redis.NewClient(&redis.Options{Addr: redisServer.Addr()})
- regular := NewConcurrencyCache(client, 15, 900)
- live, ok := regular.(service.LiveConcurrencyCache)
- require.True(t, ok)
- ctx := context.Background()
- accountAcquired, err := regular.AcquireAccountSlot(ctx, 10, 1, "regular-account")
- require.NoError(t, err)
- require.True(t, accountAcquired)
- userAcquired, err := regular.AcquireUserSlot(ctx, 20, 1, "regular-user")
- require.NoError(t, err)
- require.True(t, userAcquired)
- acquired, err := live.AcquireLiveLease(ctx, 10, 1, 20, 1, 30, "live-lease", true)
- require.NoError(t, err)
- require.True(t, acquired)
- require.NoError(t, regular.ReleaseAccountSlot(ctx, 10, "regular-account"))
- require.NoError(t, regular.ReleaseUserSlot(ctx, 20, "regular-user"))
- accountCount, err := regular.GetAccountConcurrency(ctx, 10)
- require.NoError(t, err)
- require.Equal(t, 1, accountCount)
- userCount, err := regular.GetUserConcurrency(ctx, 20)
- require.NoError(t, err)
- require.Equal(t, 1, userCount)
- accountAcquired, err = regular.AcquireAccountSlot(ctx, 10, 1, "ordinary-blocked")
- require.NoError(t, err)
- require.False(t, accountAcquired)
- refreshed, err := live.RefreshLiveLease(ctx, 10, 20, 30, "live-lease")
- require.NoError(t, err)
- require.True(t, refreshed)
- require.NoError(t, live.ReleaseLiveLease(ctx, 10, 20, 30, "live-lease"))
- accountAcquired, err = regular.AcquireAccountSlot(ctx, 10, 1, "ordinary-allowed")
- require.NoError(t, err)
- require.True(t, accountAcquired)
- }
- func TestLiveLeaseExpiresWithoutRefresh(t *testing.T) {
- redisServer := miniredis.RunT(t)
- client := redis.NewClient(&redis.Options{Addr: redisServer.Addr()})
- regular := NewConcurrencyCache(client, 15, 900)
- live, ok := regular.(service.LiveConcurrencyCache)
- require.True(t, ok)
- ctx := context.Background()
- acquired, err := live.AcquireLiveLease(ctx, 10, 1, 20, 1, 30, "expired-live", false)
- require.NoError(t, err)
- require.True(t, acquired)
- redisServer.FastForward(61 * time.Second)
- acquired, err = regular.AcquireAccountSlot(ctx, 10, 1, "ordinary-after-expiry")
- require.NoError(t, err)
- require.True(t, acquired)
- refreshed, err := live.RefreshLiveLease(ctx, 10, 20, 30, "expired-live")
- require.NoError(t, err)
- require.False(t, refreshed)
- }
|