frontend_rate_limiter_test.go 1.16 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
package proxyd

import (
	"context"
	"fmt"
	"testing"
	"time"

	"github.com/alicebob/miniredis"
	"github.com/go-redis/redis/v8"
	"github.com/stretchr/testify/require"
)

func TestFrontendRateLimiter(t *testing.T) {
	redisServer, err := miniredis.Run()
	require.NoError(t, err)
	defer redisServer.Close()

	redisClient := redis.NewClient(&redis.Options{
		Addr: fmt.Sprintf("127.0.0.1:%s", redisServer.Port()),
	})

23
	max := 2
24 25 26 27
	lims := []struct {
		name string
		frl  FrontendRateLimiter
	}{
28 29
		{"memory", NewMemoryFrontendRateLimit(2*time.Second, max)},
		{"redis", NewRedisFrontendRateLimiter(redisClient, 2*time.Second, max, "")},
30 31 32 33 34 35 36
	}

	for _, cfg := range lims {
		frl := cfg.frl
		ctx := context.Background()
		t.Run(cfg.name, func(t *testing.T) {
			for i := 0; i < 4; i++ {
37
				ok, err := frl.Take(ctx, "foo")
38 39
				require.NoError(t, err)
				require.Equal(t, i < max, ok)
40
				ok, err = frl.Take(ctx, "bar")
41 42 43 44 45
				require.NoError(t, err)
				require.Equal(t, i < max, ok)
			}
			time.Sleep(2 * time.Second)
			for i := 0; i < 4; i++ {
46
				ok, _ := frl.Take(ctx, "foo")
47
				require.Equal(t, i < max, ok)
48
				ok, _ = frl.Take(ctx, "bar")
49 50 51 52 53
				require.Equal(t, i < max, ok)
			}
		})
	}
}