lolly/internal/server/init_test.go
xfy 9144dcbb06 refactor(server): 提取初始化逻辑到独立函数
- 将 Start() 中的 goroutine pool 初始化提取为 initGoroutinePool()
- 将 file cache 初始化提取为 initFileCache()
- 将 Lua engine 初始化提取为 initLuaEngine()
- 将 error page manager 初始化提取为 initErrorPageManager()
- 添加 init.go 存放提取的初始化函数
- 添加 init_test.go 测试初始化函数
- 添加 testutil.go 提供测试 mock 和工具
- 添加 lua_integration_test.go Lua 中间件集成测试
- 添加 start_integration_test.go Start() 集成测试
- 添加 server_test.go nil tlsManager 测试
- 添加 lua/mock_engine.go Lua 引擎 mock 实现
- 添加 lua/api_balancer_test.go Lua balancer API 测试

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

352 lines
8.5 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Package server 提供初始化函数的测试。
//
// 该文件测试从 Start() 分离出的初始化函数:
// - initGoroutinePool()
// - initFileCache()
// - initLuaEngine()
// - initErrorPageManager()
//
// 主要用途:
//
// 验证初始化函数在各种配置场景下的行为
//
// 作者xfy
package server
import (
"os"
"path/filepath"
"testing"
"time"
"rua.plus/lolly/internal/config"
)
// TestInitGoroutinePool_Disabled 测试禁用时返回 nil
func TestInitGoroutinePool_Disabled(t *testing.T) {
cfg := &config.PerformanceConfig{
GoroutinePool: config.GoroutinePoolConfig{
Enabled: false,
},
}
pool := initGoroutinePool(cfg)
if pool != nil {
t.Error("Expected nil when GoroutinePool is disabled")
}
}
// TestInitGoroutinePool_Enabled 测试启用时创建池
func TestInitGoroutinePool_Enabled(t *testing.T) {
cfg := &config.PerformanceConfig{
GoroutinePool: config.GoroutinePoolConfig{
Enabled: true,
MaxWorkers: 50,
MinWorkers: 5,
IdleTimeout: 30 * time.Second,
},
}
pool := initGoroutinePool(cfg)
if pool == nil {
t.Fatal("Expected non-nil pool when enabled")
}
// 验证配置正确应用
if pool.maxWorkers != 50 {
t.Errorf("Expected maxWorkers 50, got %d", pool.maxWorkers)
}
if pool.minWorkers != 5 {
t.Errorf("Expected minWorkers 5, got %d", pool.minWorkers)
}
// 清理
pool.Stop()
}
// TestInitGoroutinePool_ZeroWorkers 测试零值配置
func TestInitGoroutinePool_ZeroWorkers(t *testing.T) {
cfg := &config.PerformanceConfig{
GoroutinePool: config.GoroutinePoolConfig{
Enabled: true,
MaxWorkers: 0,
MinWorkers: 0,
},
}
pool := initGoroutinePool(cfg)
if pool == nil {
t.Fatal("Expected non-nil pool")
}
// 清理
pool.Stop()
}
// TestInitFileCache_Disabled 测试禁用时返回 nil
func TestInitFileCache_Disabled(t *testing.T) {
cfg := &config.PerformanceConfig{
FileCache: config.FileCacheConfig{
MaxEntries: 0,
MaxSize: 0,
},
}
cache := initFileCache(cfg)
if cache != nil {
t.Error("Expected nil when FileCache is disabled")
}
}
// TestInitFileCache_ByEntries 测试按条目数启用
func TestInitFileCache_ByEntries(t *testing.T) {
cfg := &config.PerformanceConfig{
FileCache: config.FileCacheConfig{
MaxEntries: 1000,
MaxSize: 0,
Inactive: 10 * time.Minute,
},
}
cache := initFileCache(cfg)
if cache == nil {
t.Fatal("Expected non-nil cache when MaxEntries > 0")
}
}
// TestInitFileCache_BySize 测试按大小启用
func TestInitFileCache_BySize(t *testing.T) {
cfg := &config.PerformanceConfig{
FileCache: config.FileCacheConfig{
MaxEntries: 0,
MaxSize: 100 * 1024 * 1024, // 100MB
Inactive: 10 * time.Minute,
},
}
cache := initFileCache(cfg)
if cache == nil {
t.Fatal("Expected non-nil cache when MaxSize > 0")
}
}
// TestInitFileCache_BothLimits 测试同时设置条目数和大小
func TestInitFileCache_BothLimits(t *testing.T) {
cfg := &config.PerformanceConfig{
FileCache: config.FileCacheConfig{
MaxEntries: 1000,
MaxSize: 100 * 1024 * 1024,
Inactive: 10 * time.Minute,
},
}
cache := initFileCache(cfg)
if cache == nil {
t.Fatal("Expected non-nil cache")
}
}
// TestInitLuaEngine_Disabled 测试禁用时返回 nil
func TestInitLuaEngine_Disabled(t *testing.T) {
luaCfg := &config.LuaMiddlewareConfig{
Enabled: false,
}
engine, err := initLuaEngine(luaCfg)
if err != nil {
t.Errorf("Expected no error, got: %v", err)
}
if engine != nil {
t.Error("Expected nil when Lua is disabled")
}
}
// TestInitLuaEngine_NilConfig 测试 nil 配置
func TestInitLuaEngine_NilConfig(t *testing.T) {
engine, err := initLuaEngine(nil)
if err != nil {
t.Errorf("Expected no error, got: %v", err)
}
if engine != nil {
t.Error("Expected nil for nil config")
}
}
// TestInitLuaEngine_Enabled 测试启用 Lua 引擎
func TestInitLuaEngine_Enabled(t *testing.T) {
luaCfg := &config.LuaMiddlewareConfig{
Enabled: true,
GlobalSettings: config.LuaGlobalSettings{
MaxConcurrentCoroutines: 500,
CoroutineTimeout: 60 * time.Second,
CodeCacheSize: 500,
MaxExecutionTime: 60 * time.Second,
},
}
engine, err := initLuaEngine(luaCfg)
if err != nil {
t.Fatalf("Expected no error, got: %v", err)
}
if engine == nil {
t.Fatal("Expected non-nil engine when enabled")
}
// 清理
engine.Close()
}
// TestInitLuaEngine_DefaultValues 测试默认值设置
func TestInitLuaEngine_DefaultValues(t *testing.T) {
luaCfg := &config.LuaMiddlewareConfig{
Enabled: true,
GlobalSettings: config.LuaGlobalSettings{
// 所有值为零,应使用默认值
},
}
engine, err := initLuaEngine(luaCfg)
if err != nil {
t.Fatalf("Expected no error, got: %v", err)
}
if engine == nil {
t.Fatal("Expected non-nil engine")
}
// 清理
engine.Close()
}
// TestInitErrorPageManager_NoConfig 测试无配置时返回 nil
func TestInitErrorPageManager_NoConfig(t *testing.T) {
cfg := &config.ErrorPageConfig{
Pages: nil,
Default: "",
}
manager, err := initErrorPageManager(cfg)
if err != nil {
t.Errorf("Expected no error, got: %v", err)
}
if manager != nil {
t.Error("Expected nil when no error page configured")
}
}
// TestInitErrorPageManager_NilConfig 测试 nil 配置
func TestInitErrorPageManager_NilConfig(t *testing.T) {
manager, err := initErrorPageManager(nil)
if err != nil {
t.Errorf("Expected no error, got: %v", err)
}
if manager != nil {
t.Error("Expected nil for nil config")
}
}
// TestInitErrorPageManager_WithPages 测试配置错误页面
func TestInitErrorPageManager_WithPages(t *testing.T) {
// 创建临时目录和文件
tempDir := t.TempDir()
errorPagePath := filepath.Join(tempDir, "404.html")
content := []byte("<html><body>Not Found</body></html>")
if err := os.WriteFile(errorPagePath, content, 0o644); err != nil {
t.Fatalf("Failed to create error page file: %v", err)
}
cfg := &config.ErrorPageConfig{
Pages: map[int]string{
404: errorPagePath,
},
}
manager, err := initErrorPageManager(cfg)
if err != nil {
t.Fatalf("Expected no error, got: %v", err)
}
if manager == nil {
t.Fatal("Expected non-nil manager when pages configured")
}
}
// TestInitErrorPageManager_WithDefault 测试配置默认错误页面
func TestInitErrorPageManager_WithDefault(t *testing.T) {
// 创建临时目录和文件
tempDir := t.TempDir()
defaultPagePath := filepath.Join(tempDir, "error.html")
content := []byte("<html><body>Error</body></html>")
if err := os.WriteFile(defaultPagePath, content, 0o644); err != nil {
t.Fatalf("Failed to create error page file: %v", err)
}
cfg := &config.ErrorPageConfig{
Default: defaultPagePath,
}
manager, err := initErrorPageManager(cfg)
if err != nil {
t.Fatalf("Expected no error, got: %v", err)
}
if manager == nil {
t.Fatal("Expected non-nil manager when default page configured")
}
}
// TestInitErrorPageManager_NonExistentFile 测试不存在的文件
func TestInitErrorPageManager_NonExistentFile(t *testing.T) {
cfg := &config.ErrorPageConfig{
Default: "/nonexistent/path/error.html",
}
manager, err := initErrorPageManager(cfg)
// 应该返回错误
if err == nil {
t.Error("Expected error for non-existent file")
}
if manager != nil {
t.Error("Expected nil manager when file doesn't exist")
}
}
// TestInitErrorPageManager_PartialLoad 测试部分加载(部分文件存在)
func TestInitErrorPageManager_PartialLoad(t *testing.T) {
// 创建临时目录和一个存在的文件
tempDir := t.TempDir()
existingPath := filepath.Join(tempDir, "404.html")
content := []byte("<html><body>Not Found</body></html>")
if err := os.WriteFile(existingPath, content, 0o644); err != nil {
t.Fatalf("Failed to create error page file: %v", err)
}
cfg := &config.ErrorPageConfig{
Pages: map[int]string{
404: existingPath,
500: "/nonexistent/path/500.html", // 不存在的文件
},
}
manager, err := initErrorPageManager(cfg)
// 部分加载应该成功返回 manager但可能有警告
// 注意:具体行为取决于 handler.NewErrorPageManager 的实现
if manager == nil {
t.Logf("Manager is nil with error: %v", err)
}
}
// TestInitFunctions_NilPerformanceConfig 测试 nil PerformanceConfig
func TestInitFunctions_NilPerformanceConfig(t *testing.T) {
// 这个测试验证函数能正确处理空配置
var cfg *config.PerformanceConfig
// 应该能处理 nil 而不 panic
pool := initGoroutinePool(cfg)
if pool != nil {
t.Error("Expected nil for nil config")
}
cache := initFileCache(cfg)
if cache != nil {
t.Error("Expected nil for nil config")
}
}