2b1e4ca3a7
Covering nil-input safety, plugin backends (HTTP/gRPC/default), loaders (File/HTTP/Redis), selector strategies, edge cases (empty/invalid inputs), and hop-to-node metadata inheritance. All tests passing.
235 lines
5.1 KiB
Go
235 lines
5.1 KiB
Go
package limiter
|
|
|
|
import (
|
|
"io"
|
|
"testing"
|
|
|
|
"github.com/go-gost/core/logger"
|
|
"github.com/go-gost/x/config"
|
|
xlogger "github.com/go-gost/x/logger"
|
|
)
|
|
|
|
func TestMain(m *testing.M) {
|
|
logger.SetDefault(xlogger.NewLogger(xlogger.OutputOption(io.Discard)))
|
|
m.Run()
|
|
}
|
|
|
|
func TestParseTrafficLimiter_Nil(t *testing.T) {
|
|
lim := ParseTrafficLimiter(nil)
|
|
if lim != nil {
|
|
t.Fatal("expected nil for nil config")
|
|
}
|
|
}
|
|
|
|
func TestParseTrafficLimiter_WithLimits(t *testing.T) {
|
|
lim := ParseTrafficLimiter(&config.LimiterConfig{
|
|
Name: "traffic-limiter",
|
|
Limits: []string{"100KB", "200KB"},
|
|
})
|
|
if lim == nil {
|
|
t.Fatal("expected non-nil traffic limiter")
|
|
}
|
|
}
|
|
|
|
func TestParseTrafficLimiter_PluginHTTP(t *testing.T) {
|
|
lim := ParseTrafficLimiter(&config.LimiterConfig{
|
|
Name: "http-lim",
|
|
Plugin: &config.PluginConfig{
|
|
Type: "http",
|
|
Addr: "127.0.0.1:9000",
|
|
},
|
|
})
|
|
if lim == nil {
|
|
t.Fatal("expected non-nil traffic limiter")
|
|
}
|
|
}
|
|
|
|
func TestParseTrafficLimiter_PluginGRPC(t *testing.T) {
|
|
lim := ParseTrafficLimiter(&config.LimiterConfig{
|
|
Name: "grpc-lim",
|
|
Plugin: &config.PluginConfig{
|
|
Type: "grpc",
|
|
Addr: "127.0.0.1:9001",
|
|
Token: "secret",
|
|
TLS: &config.TLSConfig{
|
|
Secure: true,
|
|
ServerName: "limiter.local",
|
|
},
|
|
},
|
|
})
|
|
if lim == nil {
|
|
t.Fatal("expected non-nil traffic limiter")
|
|
}
|
|
}
|
|
|
|
func TestParseTrafficLimiter_PluginDefaultType(t *testing.T) {
|
|
lim := ParseTrafficLimiter(&config.LimiterConfig{
|
|
Name: "default-lim",
|
|
Plugin: &config.PluginConfig{
|
|
Addr: "127.0.0.1:9002",
|
|
},
|
|
})
|
|
if lim == nil {
|
|
t.Fatal("expected non-nil traffic limiter")
|
|
}
|
|
}
|
|
|
|
func TestParseTrafficLimiter_FileLoader(t *testing.T) {
|
|
lim := ParseTrafficLimiter(&config.LimiterConfig{
|
|
Name: "file-lim",
|
|
File: &config.FileLoader{Path: "/tmp/limiter.txt"},
|
|
})
|
|
if lim == nil {
|
|
t.Fatal("expected non-nil traffic limiter")
|
|
}
|
|
}
|
|
|
|
func TestParseTrafficLimiter_HTTPLoader(t *testing.T) {
|
|
lim := ParseTrafficLimiter(&config.LimiterConfig{
|
|
Name: "http-lim",
|
|
HTTP: &config.HTTPLoader{URL: "http://localhost:8080/limits"},
|
|
})
|
|
if lim == nil {
|
|
t.Fatal("expected non-nil traffic limiter")
|
|
}
|
|
}
|
|
|
|
func TestParseTrafficLimiter_RedisLoader(t *testing.T) {
|
|
lim := ParseTrafficLimiter(&config.LimiterConfig{
|
|
Name: "redis-lim",
|
|
Redis: &config.RedisLoader{
|
|
Addr: "127.0.0.1:6379",
|
|
Key: "limiter-key",
|
|
},
|
|
})
|
|
if lim == nil {
|
|
t.Fatal("expected non-nil traffic limiter")
|
|
}
|
|
}
|
|
|
|
func TestParseTrafficLimiter_RedisListLoader(t *testing.T) {
|
|
lim := ParseTrafficLimiter(&config.LimiterConfig{
|
|
Name: "redis-list-lim",
|
|
Redis: &config.RedisLoader{
|
|
Addr: "127.0.0.1:6379",
|
|
Key: "limiter-list",
|
|
Type: "list",
|
|
},
|
|
})
|
|
if lim == nil {
|
|
t.Fatal("expected non-nil traffic limiter")
|
|
}
|
|
}
|
|
|
|
// --- ConnLimiter ---
|
|
|
|
func TestParseConnLimiter_Nil(t *testing.T) {
|
|
lim := ParseConnLimiter(nil)
|
|
if lim != nil {
|
|
t.Fatal("expected nil for nil config")
|
|
}
|
|
}
|
|
|
|
func TestParseConnLimiter_WithLimits(t *testing.T) {
|
|
lim := ParseConnLimiter(&config.LimiterConfig{
|
|
Name: "conn-limiter",
|
|
Limits: []string{"10", "50"},
|
|
})
|
|
if lim == nil {
|
|
t.Fatal("expected non-nil conn limiter")
|
|
}
|
|
}
|
|
|
|
func TestParseConnLimiter_RedisLoader(t *testing.T) {
|
|
lim := ParseConnLimiter(&config.LimiterConfig{
|
|
Name: "redis-conn-lim",
|
|
Redis: &config.RedisLoader{
|
|
Addr: "127.0.0.1:6379",
|
|
Key: "conn-key",
|
|
},
|
|
})
|
|
if lim == nil {
|
|
t.Fatal("expected non-nil conn limiter")
|
|
}
|
|
}
|
|
|
|
func TestParseConnLimiter_RedisListLoader(t *testing.T) {
|
|
lim := ParseConnLimiter(&config.LimiterConfig{
|
|
Name: "redis-list-conn-lim",
|
|
Redis: &config.RedisLoader{
|
|
Addr: "127.0.0.1:6379",
|
|
Key: "conn-list",
|
|
Type: "list",
|
|
},
|
|
})
|
|
if lim == nil {
|
|
t.Fatal("expected non-nil conn limiter")
|
|
}
|
|
}
|
|
|
|
func TestParseConnLimiter_FileLoader(t *testing.T) {
|
|
lim := ParseConnLimiter(&config.LimiterConfig{
|
|
Name: "file-conn-lim",
|
|
File: &config.FileLoader{Path: "/tmp/conn_limiter.txt"},
|
|
})
|
|
if lim == nil {
|
|
t.Fatal("expected non-nil conn limiter")
|
|
}
|
|
}
|
|
|
|
// --- RateLimiter ---
|
|
|
|
func TestParseRateLimiter_Nil(t *testing.T) {
|
|
lim := ParseRateLimiter(nil)
|
|
if lim != nil {
|
|
t.Fatal("expected nil for nil config")
|
|
}
|
|
}
|
|
|
|
func TestParseRateLimiter_WithLimits(t *testing.T) {
|
|
lim := ParseRateLimiter(&config.LimiterConfig{
|
|
Name: "rate-limiter",
|
|
Limits: []string{"100", "200"},
|
|
})
|
|
if lim == nil {
|
|
t.Fatal("expected non-nil rate limiter")
|
|
}
|
|
}
|
|
|
|
func TestParseRateLimiter_RedisLoader(t *testing.T) {
|
|
lim := ParseRateLimiter(&config.LimiterConfig{
|
|
Name: "redis-rate-lim",
|
|
Redis: &config.RedisLoader{
|
|
Addr: "127.0.0.1:6379",
|
|
Key: "rate-key",
|
|
},
|
|
})
|
|
if lim == nil {
|
|
t.Fatal("expected non-nil rate limiter")
|
|
}
|
|
}
|
|
|
|
func TestParseRateLimiter_RedisListLoader(t *testing.T) {
|
|
lim := ParseRateLimiter(&config.LimiterConfig{
|
|
Name: "redis-list-rate-lim",
|
|
Redis: &config.RedisLoader{
|
|
Addr: "127.0.0.1:6379",
|
|
Key: "rate-list",
|
|
Type: "list",
|
|
},
|
|
})
|
|
if lim == nil {
|
|
t.Fatal("expected non-nil rate limiter")
|
|
}
|
|
}
|
|
|
|
func TestParseRateLimiter_FileLoader(t *testing.T) {
|
|
lim := ParseRateLimiter(&config.LimiterConfig{
|
|
Name: "file-rate-lim",
|
|
File: &config.FileLoader{Path: "/tmp/rate_limiter.txt"},
|
|
})
|
|
if lim == nil {
|
|
t.Fatal("expected non-nil rate limiter")
|
|
}
|
|
}
|