[#1656] qos: Add tests for MaxActiveRPCLimiter Interceptors
Some checks failed
Build / Build Components (push) Has been cancelled
OCI image / Build container images (push) Has been cancelled
Pre-commit hooks / Pre-commit (push) Has been cancelled
Tests and linters / Lint (push) Has been cancelled
Tests and linters / Tests (push) Has been cancelled
Tests and linters / Tests with -race (push) Has been cancelled
Tests and linters / Staticcheck (push) Has been cancelled
Tests and linters / Run gofumpt (push) Has been cancelled
Tests and linters / gopls check (push) Has been cancelled
Vulncheck / Vulncheck (push) Has been cancelled
Some checks failed
Build / Build Components (push) Has been cancelled
OCI image / Build container images (push) Has been cancelled
Pre-commit hooks / Pre-commit (push) Has been cancelled
Tests and linters / Lint (push) Has been cancelled
Tests and linters / Tests (push) Has been cancelled
Tests and linters / Tests with -race (push) Has been cancelled
Tests and linters / Staticcheck (push) Has been cancelled
Tests and linters / Run gofumpt (push) Has been cancelled
Tests and linters / gopls check (push) Has been cancelled
Vulncheck / Vulncheck (push) Has been cancelled
Change-Id: Ib65890ae5aec34c34e15d4ec1f05952f74f1ad26 Signed-off-by: Ekaterina Lebedeva <ekaterina.lebedeva@yadro.com>
This commit is contained in:
parent
12a0537a7a
commit
115aae7c34
1 changed files with 121 additions and 0 deletions
121
internal/qos/grpc_test.go
Normal file
121
internal/qos/grpc_test.go
Normal file
|
@ -0,0 +1,121 @@
|
|||
package qos_test
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"testing"
|
||||
|
||||
"git.frostfs.info/TrueCloudLab/frostfs-node/internal/qos"
|
||||
"git.frostfs.info/TrueCloudLab/frostfs-qos/limiting"
|
||||
"git.frostfs.info/TrueCloudLab/frostfs-qos/tagging"
|
||||
apistatus "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/client/status"
|
||||
"github.com/stretchr/testify/require"
|
||||
"google.golang.org/grpc"
|
||||
)
|
||||
|
||||
const (
|
||||
okKey = "ok"
|
||||
)
|
||||
|
||||
var (
|
||||
errTest = errors.New("mock")
|
||||
errResExhausted *apistatus.ResourceExhausted
|
||||
)
|
||||
|
||||
type mockGRPCServerStream struct {
|
||||
grpc.ServerStream
|
||||
|
||||
ctx context.Context
|
||||
}
|
||||
|
||||
func (m *mockGRPCServerStream) Context() context.Context {
|
||||
return m.ctx
|
||||
}
|
||||
|
||||
type limiter struct {
|
||||
acquired bool
|
||||
released bool
|
||||
}
|
||||
|
||||
func (l *limiter) Acquire(key string) (limiting.ReleaseFunc, bool) {
|
||||
l.acquired = true
|
||||
if key != okKey {
|
||||
return nil, false
|
||||
}
|
||||
return func() { l.released = true }, true
|
||||
}
|
||||
|
||||
func unaryMaxActiveRPCLimiter(ctx context.Context, lim *limiter, methodName string) error {
|
||||
interceptor := qos.NewMaxActiveRPCLimiterUnaryServerInterceptor(func() limiting.Limiter { return lim })
|
||||
handler := func(ctx context.Context, req any) (any, error) {
|
||||
return nil, errTest
|
||||
}
|
||||
_, err := interceptor(ctx, nil, &grpc.UnaryServerInfo{FullMethod: methodName}, handler)
|
||||
return err
|
||||
}
|
||||
|
||||
func streamMaxActiveRPCLimiter(ctx context.Context, lim *limiter, methodName string) error {
|
||||
interceptor := qos.NewMaxActiveRPCLimiterStreamServerInterceptor(func() limiting.Limiter { return lim })
|
||||
handler := func(srv any, stream grpc.ServerStream) error {
|
||||
return errTest
|
||||
}
|
||||
err := interceptor(nil, &mockGRPCServerStream{ctx: ctx}, &grpc.StreamServerInfo{
|
||||
FullMethod: methodName,
|
||||
}, handler)
|
||||
return err
|
||||
}
|
||||
|
||||
func Test_MaxActiveRPCLimiter(t *testing.T) {
|
||||
// UnaryServerInterceptor
|
||||
t.Run("unary fail", func(t *testing.T) {
|
||||
var lim limiter
|
||||
|
||||
err := unaryMaxActiveRPCLimiter(context.Background(), &lim, "")
|
||||
require.ErrorAs(t, err, &errResExhausted)
|
||||
require.True(t, lim.acquired)
|
||||
require.False(t, lim.released)
|
||||
})
|
||||
t.Run("unary pass critical", func(t *testing.T) {
|
||||
var lim limiter
|
||||
ctx := tagging.ContextWithIOTag(context.Background(), qos.IOTagCritical.String())
|
||||
|
||||
err := unaryMaxActiveRPCLimiter(ctx, &lim, "")
|
||||
require.ErrorIs(t, err, errTest)
|
||||
require.False(t, lim.acquired)
|
||||
require.False(t, lim.released)
|
||||
})
|
||||
t.Run("unary pass", func(t *testing.T) {
|
||||
var lim limiter
|
||||
|
||||
err := unaryMaxActiveRPCLimiter(context.Background(), &lim, okKey)
|
||||
require.ErrorIs(t, err, errTest)
|
||||
require.True(t, lim.acquired)
|
||||
require.True(t, lim.released)
|
||||
})
|
||||
// StreamServerInterceptor
|
||||
t.Run("stream fail", func(t *testing.T) {
|
||||
var lim limiter
|
||||
|
||||
err := streamMaxActiveRPCLimiter(context.Background(), &lim, "")
|
||||
require.ErrorAs(t, err, &errResExhausted)
|
||||
require.True(t, lim.acquired)
|
||||
require.False(t, lim.released)
|
||||
})
|
||||
t.Run("stream pass critical", func(t *testing.T) {
|
||||
var lim limiter
|
||||
ctx := tagging.ContextWithIOTag(context.Background(), qos.IOTagCritical.String())
|
||||
|
||||
err := streamMaxActiveRPCLimiter(ctx, &lim, "")
|
||||
require.ErrorIs(t, err, errTest)
|
||||
require.False(t, lim.acquired)
|
||||
require.False(t, lim.released)
|
||||
})
|
||||
t.Run("stream pass", func(t *testing.T) {
|
||||
var lim limiter
|
||||
|
||||
err := streamMaxActiveRPCLimiter(context.Background(), &lim, okKey)
|
||||
require.ErrorIs(t, err, errTest)
|
||||
require.True(t, lim.acquired)
|
||||
require.True(t, lim.released)
|
||||
})
|
||||
}
|
Loading…
Add table
Reference in a new issue