lolly/internal/server/server_test.go
xfy a627d58832 test(server): 补充 buildMiddlewareChain 单元测试
- 新增访问日志、访问控制、限流中间件测试
- 新增重写、压缩、安全头中间件测试
- 新增全中间件组合测试
- 重命名 TestSetListeners 为 TestUpgradeSetListeners 避免命名冲突

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-03 15:15:37 +08:00

281 lines
6.0 KiB
Go
Raw 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
import (
"testing"
"time"
"rua.plus/lolly/internal/config"
)
// TestNew 测试服务器创建
func TestNew(t *testing.T) {
cfg := &config.Config{
Server: config.ServerConfig{
Listen: ":8080",
Static: config.StaticConfig{
Root: "./static",
Index: []string{"index.html"},
},
},
}
s := New(cfg)
if s == nil {
t.Fatal("New() returned nil, expected non-nil Server")
}
if s.config != cfg {
t.Error("Server.config not set correctly")
}
if s.running {
t.Error("Server.running should be false initially")
}
if s.fastServer != nil {
t.Error("Server.fastServer should be nil before Start()")
}
}
// TestStopWithoutServer 测试无服务器时调用 Stop
func TestStopWithoutServer(t *testing.T) {
cfg := &config.Config{
Server: config.ServerConfig{
Listen: ":8080",
},
}
s := New(cfg)
// 在未启动时调用 Stop应返回 nil
err := s.Stop()
if err != nil {
t.Errorf("Stop() on non-started server returned error: %v", err)
}
}
// TestGracefulStop 测试 GracefulStop 调用
func TestGracefulStop(t *testing.T) {
cfg := &config.Config{
Server: config.ServerConfig{
Listen: ":8080",
},
}
s := New(cfg)
// 在未启动时调用 GracefulStop应返回 nil
err := s.GracefulStop(5 * time.Second)
if err != nil {
t.Errorf("GracefulStop() on non-started server returned error: %v", err)
}
}
// TestStopAfterStop 测试多次调用 Stop
func TestStopAfterStop(t *testing.T) {
cfg := &config.Config{
Server: config.ServerConfig{
Listen: ":8080",
},
}
s := New(cfg)
// 多次调用 Stop 应该都是安全的
for i := 0; i < 3; i++ {
err := s.Stop()
if err != nil {
t.Errorf("Stop() call %d returned error: %v", i+1, err)
}
}
}
// TestGracefulStopWithZeroTimeout 测试零超时的 GracefulStop
func TestGracefulStopWithZeroTimeout(t *testing.T) {
cfg := &config.Config{
Server: config.ServerConfig{
Listen: ":8080",
},
}
s := New(cfg)
err := s.GracefulStop(0)
if err != nil {
t.Errorf("GracefulStop(0) returned error: %v", err)
}
}
// TestBuildMiddlewareChain_AccessLog 测试访问日志中间件
func TestBuildMiddlewareChain_AccessLog(t *testing.T) {
cfg := &config.Config{
Logging: config.LoggingConfig{},
Server: config.ServerConfig{
Listen: ":8080",
},
}
s := New(cfg)
chain, err := s.buildMiddlewareChain(&cfg.Server)
if err != nil {
t.Errorf("buildMiddlewareChain failed: %v", err)
}
if chain == nil {
t.Error("Expected non-nil chain")
}
}
// TestBuildMiddlewareChain_AccessControl 测试访问控制中间件
func TestBuildMiddlewareChain_AccessControl(t *testing.T) {
cfg := &config.Config{
Logging: config.LoggingConfig{},
Server: config.ServerConfig{
Listen: ":8080",
Security: config.SecurityConfig{
Access: config.AccessConfig{
Allow: []string{"127.0.0.1"},
},
},
},
}
s := New(cfg)
chain, err := s.buildMiddlewareChain(&cfg.Server)
if err != nil {
t.Errorf("buildMiddlewareChain failed: %v", err)
}
if chain == nil {
t.Error("Expected non-nil chain")
}
}
// TestBuildMiddlewareChain_RateLimiter 测试限流中间件
func TestBuildMiddlewareChain_RateLimiter(t *testing.T) {
cfg := &config.Config{
Logging: config.LoggingConfig{},
Server: config.ServerConfig{
Listen: ":8080",
Security: config.SecurityConfig{
RateLimit: config.RateLimitConfig{
RequestRate: 100,
Burst: 200,
},
},
},
}
s := New(cfg)
chain, err := s.buildMiddlewareChain(&cfg.Server)
if err != nil {
t.Errorf("buildMiddlewareChain failed: %v", err)
}
if chain == nil {
t.Error("Expected non-nil chain")
}
}
// TestBuildMiddlewareChain_Rewrite 测试重写中间件
func TestBuildMiddlewareChain_Rewrite(t *testing.T) {
cfg := &config.Config{
Logging: config.LoggingConfig{},
Server: config.ServerConfig{
Listen: ":8080",
Rewrite: []config.RewriteRule{
{Pattern: "/old/(.*)", Replacement: "/new/$1"},
},
},
}
s := New(cfg)
chain, err := s.buildMiddlewareChain(&cfg.Server)
if err != nil {
t.Errorf("buildMiddlewareChain failed: %v", err)
}
if chain == nil {
t.Error("Expected non-nil chain")
}
}
// TestBuildMiddlewareChain_Compression 测试压缩中间件
func TestBuildMiddlewareChain_Compression(t *testing.T) {
cfg := &config.Config{
Logging: config.LoggingConfig{},
Server: config.ServerConfig{
Listen: ":8080",
Compression: config.CompressionConfig{
Level: 6,
},
},
}
s := New(cfg)
chain, err := s.buildMiddlewareChain(&cfg.Server)
if err != nil {
t.Errorf("buildMiddlewareChain failed: %v", err)
}
if chain == nil {
t.Error("Expected non-nil chain")
}
}
// TestBuildMiddlewareChain_SecurityHeaders 测试安全头中间件
func TestBuildMiddlewareChain_SecurityHeaders(t *testing.T) {
cfg := &config.Config{
Logging: config.LoggingConfig{},
Server: config.ServerConfig{
Listen: ":8080",
Security: config.SecurityConfig{
Headers: config.SecurityHeaders{
XFrameOptions: "DENY",
XContentTypeOptions: "nosniff",
},
},
},
}
s := New(cfg)
chain, err := s.buildMiddlewareChain(&cfg.Server)
if err != nil {
t.Errorf("buildMiddlewareChain failed: %v", err)
}
if chain == nil {
t.Error("Expected non-nil chain")
}
}
// TestBuildMiddlewareChain_AllMiddlewares 测试所有中间件组合
func TestBuildMiddlewareChain_AllMiddlewares(t *testing.T) {
cfg := &config.Config{
Logging: config.LoggingConfig{},
Server: config.ServerConfig{
Listen: ":8080",
Security: config.SecurityConfig{
Access: config.AccessConfig{
Allow: []string{"127.0.0.1"},
},
RateLimit: config.RateLimitConfig{
RequestRate: 100,
Burst: 200,
},
Headers: config.SecurityHeaders{
XFrameOptions: "DENY",
},
},
Rewrite: []config.RewriteRule{
{Pattern: "/old/(.*)", Replacement: "/new/$1"},
},
Compression: config.CompressionConfig{
Level: 6,
},
},
}
s := New(cfg)
chain, err := s.buildMiddlewareChain(&cfg.Server)
if err != nil {
t.Errorf("buildMiddlewareChain failed: %v", err)
}
if chain == nil {
t.Error("Expected non-nil chain")
}
}