lolly/internal/lua/middleware_config_test.go
xfy bfab449241 feat(lua): 实现 Lua 中间件系统
添加可配置的 Lua 中间件实现,支持:
- 多执行阶段(rewrite、access、content、header_filter、body_filter、log)
- 脚本路径配置和超时控制
- 中间件启用/禁用开关
- 配置文件热加载
- 完整的单元测试和性能基准测试

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-11 13:34:34 +08:00

127 lines
3.4 KiB
Go

// Package lua 提供 Lua 中间件配置测试
package lua
import (
"testing"
"time"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
// TestMiddlewareConfigValidation 测试配置验证
func TestMiddlewareConfigValidation(t *testing.T) {
// 禁用时验证跳过
cfg := DefaultMiddlewareConfig()
require.NoError(t, cfg.Validate())
// 启用但无脚本也允许
cfg.Enabled = true
require.NoError(t, cfg.Validate())
// 有效脚本配置
cfg.Scripts = []ScriptConfig{
{Path: "/scripts/test.lua", Phase: "rewrite", Timeout: 10 * time.Second},
}
require.NoError(t, cfg.Validate())
}
// TestMiddlewareConfigInvalidPhase 测试无效阶段
func TestMiddlewareConfigInvalidPhase(t *testing.T) {
cfg := DefaultMiddlewareConfig()
cfg.Enabled = true
cfg.Scripts = []ScriptConfig{
{Path: "/scripts/test.lua", Phase: "invalid_phase"},
}
err := cfg.Validate()
require.Error(t, err)
assert.Contains(t, err.Error(), "invalid phase")
}
// TestMiddlewareConfigMissingPath 测试缺少路径
func TestMiddlewareConfigMissingPath(t *testing.T) {
cfg := DefaultMiddlewareConfig()
cfg.Enabled = true
cfg.Scripts = []ScriptConfig{
{Phase: "rewrite"},
}
err := cfg.Validate()
require.Error(t, err)
assert.Contains(t, err.Error(), "path is required")
}
// TestMiddlewareConfigInvalidTimeout 测试无效超时
func TestMiddlewareConfigInvalidTimeout(t *testing.T) {
cfg := DefaultMiddlewareConfig()
cfg.Enabled = true
cfg.Scripts = []ScriptConfig{
{Path: "/scripts/test.lua", Phase: "rewrite", Timeout: 500 * time.Millisecond},
}
err := cfg.Validate()
require.Error(t, err)
assert.Contains(t, err.Error(), "timeout must be at least 1s")
}
// TestParsePhase 测试阶段解析
func TestParsePhase(t *testing.T) {
tests := []struct {
input string
expected Phase
hasError bool
}{
{"rewrite", PhaseRewrite, false},
{"access", PhaseAccess, false},
{"content", PhaseContent, false},
{"log", PhaseLog, false},
{"header_filter", PhaseHeaderFilter, false},
{"body_filter", PhaseBodyFilter, false},
{"invalid", PhaseInit, true},
{"", PhaseInit, true},
}
for _, tt := range tests {
phase, err := ParsePhase(tt.input)
if tt.hasError {
require.Error(t, err)
} else {
require.NoError(t, err)
assert.Equal(t, tt.expected, phase)
}
}
}
// TestGlobalLuaSettingsToEngineConfig 测试转换为引擎配置
func TestGlobalLuaSettingsToEngineConfig(t *testing.T) {
settings := GlobalLuaSettings{
MaxConcurrentCoroutines: 500,
CoroutineTimeout: 20 * time.Second,
CodeCacheSize: 200,
EnableFileWatch: false,
MaxExecutionTime: 10 * time.Second,
}
engineCfg := settings.ToEngineConfig()
assert.Equal(t, 500, engineCfg.MaxConcurrentCoroutines)
assert.Equal(t, 20*time.Second, engineCfg.CoroutineTimeout)
assert.Equal(t, 200, engineCfg.CodeCacheSize)
assert.False(t, engineCfg.EnableFileWatch)
assert.Equal(t, 10*time.Second, engineCfg.MaxExecutionTime)
assert.False(t, engineCfg.EnableOSLib) // 安全默认值
assert.False(t, engineCfg.EnableIOLib)
assert.False(t, engineCfg.EnableLoadLib)
}
// TestMiddlewareConfigGlobalSettingsValidation 测试全局设置验证
func TestMiddlewareConfigGlobalSettingsValidation(t *testing.T) {
cfg := DefaultMiddlewareConfig()
cfg.Enabled = true
cfg.GlobalSettings.MaxConcurrentCoroutines = 0
err := cfg.Validate()
require.Error(t, err)
assert.Contains(t, err.Error(), "max_concurrent_coroutines must be at least 1")
}