// Package accesslog 提供访问日志功能的测试。 // // 该文件测试访问日志模块的各项功能,包括: // - 访问日志中间件创建 // - 请求处理和响应记录 // - 请求持续时间记录 // - 日志格式化 // // 作者:xfy package accesslog import ( "bytes" "testing" "time" "github.com/valyala/fasthttp" "rua.plus/lolly/internal/config" ) func TestAccessLog_Name(t *testing.T) { al := New(&config.LoggingConfig{}) if al.Name() != "accesslog" { t.Errorf("expected name 'accesslog', got '%s'", al.Name()) } } func TestAccessLog_Process(t *testing.T) { al := New(&config.LoggingConfig{ Access: config.AccessLogConfig{Format: "json"}, }) // 创建一个简单的 handler handler := func(ctx *fasthttp.RequestCtx) { ctx.SetStatusCode(200) ctx.SetBodyString("hello") } // 包装 handler wrapped := al.Process(handler) // 创建模拟请求上下文 var ctx fasthttp.RequestCtx ctx.Init(&fasthttp.Request{}, nil, nil) // 执行 wrapped(&ctx) // 验证响应未被修改 if ctx.Response.StatusCode() != 200 { t.Errorf("expected status 200, got %d", ctx.Response.StatusCode()) } if !bytes.Equal(ctx.Response.Body(), []byte("hello")) { t.Errorf("expected body 'hello', got '%s'", ctx.Response.Body()) } // 清理 _ = al.Close() } func TestAccessLog_ProcessWithDuration(t *testing.T) { al := New(&config.LoggingConfig{ Access: config.AccessLogConfig{Format: "json"}, }) // 创建一个有延迟的 handler handler := func(ctx *fasthttp.RequestCtx) { time.Sleep(10 * time.Millisecond) ctx.SetStatusCode(201) ctx.SetBodyString("created") } wrapped := al.Process(handler) var ctx fasthttp.RequestCtx ctx.Init(&fasthttp.Request{}, nil, nil) start := time.Now() wrapped(&ctx) elapsed := time.Since(start) // 验证延迟被记录(至少 10ms) if elapsed < 10*time.Millisecond { t.Errorf("expected duration >= 10ms, got %v", elapsed) } _ = al.Close() }