lolly/internal/config/lua_config_test.go
xfy 8b382606df Merge branch 'lint-fix' - resolve sendfile.go conflict
Conflict: sendfile.go (!linux build tag) was incorrectly modified to
include linuxSendfile and getSocketFd functions which already exist
in sendfile_linux.go.

Resolution: Keep HEAD version (simple fallback returning ENOTSUP) as
Linux implementation is properly separated in sendfile_linux.go.

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

156 lines
3.9 KiB
Go

// Package config 提供 Lua 配置测试
package config
import (
"testing"
"time"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
// TestLuaMiddlewareConfigValidation 测试 Lua 配置验证
func TestLuaMiddlewareConfigValidation(t *testing.T) {
// 未配置时跳过验证
cfg := &LuaMiddlewareConfig{}
require.NoError(t, validateLua(cfg))
// 禁用时跳过验证
cfg = &LuaMiddlewareConfig{Enabled: false}
require.NoError(t, validateLua(cfg))
// 启用但无脚本也允许
cfg = &LuaMiddlewareConfig{Enabled: true}
require.NoError(t, validateLua(cfg))
// 有效配置
cfg = &LuaMiddlewareConfig{
Enabled: true,
Scripts: []LuaScriptConfig{
{Path: "/scripts/test.lua", Phase: "rewrite", Timeout: 10 * time.Second},
},
GlobalSettings: LuaGlobalSettings{
MaxConcurrentCoroutines: 1000,
CoroutineTimeout: 30 * time.Second,
CodeCacheSize: 100,
EnableFileWatch: true,
MaxExecutionTime: 30 * time.Second,
},
}
require.NoError(t, validateLua(cfg))
}
// TestLuaMiddlewareConfigInvalidPhase 测试无效阶段
func TestLuaMiddlewareConfigInvalidPhase(t *testing.T) {
cfg := &LuaMiddlewareConfig{
Enabled: true,
Scripts: []LuaScriptConfig{
{Path: "/scripts/test.lua", Phase: "invalid_phase"},
},
}
err := validateLua(cfg)
require.Error(t, err)
assert.Contains(t, err.Error(), "scripts[0].phase 无效")
}
// TestLuaMiddlewareConfigMissingPath 测试缺少路径
func TestLuaMiddlewareConfigMissingPath(t *testing.T) {
cfg := &LuaMiddlewareConfig{
Enabled: true,
Scripts: []LuaScriptConfig{
{Phase: "rewrite"},
},
}
err := validateLua(cfg)
require.Error(t, err)
assert.Contains(t, err.Error(), "scripts[0].path 必填")
}
// TestLuaMiddlewareConfigNegativeTimeout 测试负超时
func TestLuaMiddlewareConfigNegativeTimeout(t *testing.T) {
cfg := &LuaMiddlewareConfig{
Enabled: true,
Scripts: []LuaScriptConfig{
{Path: "/scripts/test.lua", Phase: "rewrite", Timeout: -5 * time.Second},
},
}
err := validateLua(cfg)
require.Error(t, err)
assert.Contains(t, err.Error(), "timeout 不能为负数")
}
// TestLuaMiddlewareConfigGlobalSettingsValidation 测试全局设置验证
func TestLuaMiddlewareConfigGlobalSettingsValidation(t *testing.T) {
// MaxConcurrentCoroutines 为负
cfg := &LuaMiddlewareConfig{
Enabled: true,
GlobalSettings: LuaGlobalSettings{
MaxConcurrentCoroutines: -1,
},
}
err := validateLua(cfg)
require.Error(t, err)
assert.Contains(t, err.Error(), "max_concurrent_coroutines 不能为负数")
// CoroutineTimeout 为负
cfg = &LuaMiddlewareConfig{
Enabled: true,
GlobalSettings: LuaGlobalSettings{
CoroutineTimeout: -1 * time.Second,
},
}
err = validateLua(cfg)
require.Error(t, err)
assert.Contains(t, err.Error(), "coroutine_timeout 不能为负数")
}
// TestServerConfigLuaField 测试 ServerConfig 包含 Lua 字段
func TestServerConfigLuaField(t *testing.T) {
cfg := &ServerConfig{
Lua: &LuaMiddlewareConfig{
Enabled: true,
Scripts: []LuaScriptConfig{
{Path: "/scripts/auth.lua", Phase: "access"},
},
},
}
require.NotNil(t, cfg.Lua)
assert.True(t, cfg.Lua.Enabled)
assert.Len(t, cfg.Lua.Scripts, 1)
assert.Equal(t, "/scripts/auth.lua", cfg.Lua.Scripts[0].Path)
assert.Equal(t, "access", cfg.Lua.Scripts[0].Phase)
}
// TestValidateServerWithLuaConfig 测试服务器验证包含 Lua
func TestValidateServerWithLuaConfig(t *testing.T) {
// 有效 Lua 配置
cfg := &ServerConfig{
Listen: ":8080",
Lua: &LuaMiddlewareConfig{
Enabled: true,
Scripts: []LuaScriptConfig{
{Path: "/scripts/test.lua", Phase: "content"},
},
},
}
require.NoError(t, validateServer(cfg, false))
// 无效 Lua 配置
cfg = &ServerConfig{
Listen: ":8080",
Lua: &LuaMiddlewareConfig{
Enabled: true,
Scripts: []LuaScriptConfig{
{Path: "", Phase: "content"}, // 空路径
},
},
}
err := validateServer(cfg, false)
require.Error(t, err)
assert.Contains(t, err.Error(), "lua:")
}