lolly/internal/lua/mock_engine.go
xfy ad177e9640 docs(lua): 为 Lua API 模块添加标准化 godoc 注释
为所有 Lua API 文件添加完整的包级和函数级文档注释:
- api_balancer: 负载均衡 API(set_current_peer, set_more_tries 等)
- api_ctx: 请求上下文存储 API(ngx.ctx)
- api_location: 子请求捕获 API(ngx.location.capture)
- api_log: 日志输出 API(ngx.log)
- api_req: 请求对象 API
- api_resp: 响应对象 API
- api_shared_dict: 共享字典 API
- api_socket_tcp: TCP socket API
- api_timer: 定时器 API
- api_var: 变量 API
- engine: Lua 引擎核心
- context: 请求上下文管理
- coroutine: 协程调度器
- middleware: 中间件集成
- filter_writer: 响应过滤器
- cache: Lua 脚本缓存
- shared_dict: 共享字典实现
- socket_manager: socket 连接管理

注释格式遵循 Go 官方风格,包含功能说明、参数说明和注意事项。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-20 10:59:17 +08:00

332 lines
8.1 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 lua 提供 Lua 引擎的 Mock 实现,用于测试。
//
// 该文件提供 LuaEngine 和 LuaCoroutine 的 Mock 版本,通过函数指针
// 注入自定义行为,便于单元测试中模拟 Lua 脚本执行。
//
// 使用方式:
// - 设置 ExecuteFunc 等字段来自定义方法行为
// - 未设置的函数指针返回零值stub 模式)
//
// 作者xfy
package lua
import (
"context"
"time"
"github.com/valyala/fasthttp"
glua "github.com/yuin/gopher-lua"
)
// MockLuaEngine 是 LuaEngine 的 Mock 实现。
//
// 通过注入函数指针模拟 LuaEngine 的所有公开方法,
// 未注入的方法返回零值或 nilstub 模式)。
type MockLuaEngine struct {
// ExecuteFunc 模拟 Execute 方法
ExecuteFunc func(script string) error
// ExecuteFileFunc 模拟 ExecuteFile 方法
ExecuteFileFunc func(path string) error
// NewCoroutineFunc 模拟 NewCoroutine 方法
NewCoroutineFunc func(ctx *fasthttp.RequestCtx) (*MockCoroutine, error)
// CloseFunc 模拟 Close 方法
CloseFunc func()
// StatsFunc 模拟 Stats 方法
StatsFunc func() EngineStats
// ActiveCoroutinesFunc 模拟 ActiveCoroutines 方法
ActiveCoroutinesFunc func() int32
// CodeCacheFunc 模拟 CodeCache 方法
CodeCacheFunc func() *CodeCache
// SharedDictManagerFunc 模拟 SharedDictManager 方法
SharedDictManagerFunc func() *SharedDictManager
// TimerManagerFunc 模拟 TimerManager 方法
TimerManagerFunc func() *TimerManager
// LocationManagerFunc 模拟 LocationManager 方法
LocationManagerFunc func() *LocationManager
// CreateSharedDictFunc 模拟 CreateSharedDict 方法
CreateSharedDictFunc func(name string, maxItems int) *SharedDict
// InitSchedulerLStateFunc 模拟 InitSchedulerLState 方法
InitSchedulerLStateFunc func() error
// SchedulerLoopFunc 模拟 SchedulerLoop 方法
SchedulerLoopFunc func()
// EnqueueCallbackFunc 模拟 EnqueueCallback 方法
EnqueueCallbackFunc func(entry *CallbackEntry) bool
// CloseSchedulerFunc 模拟 CloseScheduler 方法
CloseSchedulerFunc func()
}
// Execute 执行脚本Mock
//
// 参数:
// - script: Lua 脚本
//
// 返回值:
// - error: ExecuteFunc 的结果,未注入时返回 nil
func (m *MockLuaEngine) Execute(script string) error {
if m.ExecuteFunc != nil {
return m.ExecuteFunc(script)
}
return nil // stub
}
// ExecuteFile 执行文件Mock
//
// 参数:
// - path: 脚本文件路径
//
// 返回值:
// - error: ExecuteFileFunc 的结果,未注入时返回 nil
func (m *MockLuaEngine) ExecuteFile(path string) error {
if m.ExecuteFileFunc != nil {
return m.ExecuteFileFunc(path)
}
return nil // stub
}
// NewCoroutine 创建协程Mock
//
// 参数:
// - req: fasthttp 请求上下文
//
// 返回值:
// - *MockCoroutine: 模拟协程
// - error: NewCoroutineFunc 的结果
func (m *MockLuaEngine) NewCoroutine(req *fasthttp.RequestCtx) (*MockCoroutine, error) {
if m.NewCoroutineFunc != nil {
return m.NewCoroutineFunc(req)
}
return &MockCoroutine{}, nil
}
// Close 关闭引擎Mock
func (m *MockLuaEngine) Close() {
if m.CloseFunc != nil {
m.CloseFunc()
}
}
// Stats 返回统计Mock
//
// 返回值:
// - EngineStats: StatsFunc 的结果,未注入时返回零值
func (m *MockLuaEngine) Stats() EngineStats {
if m.StatsFunc != nil {
return m.StatsFunc()
}
return EngineStats{}
}
// ActiveCoroutines 返回活跃协程数Mock
//
// 返回值:
// - int32: ActiveCoroutinesFunc 的结果,未注入时返回 0
func (m *MockLuaEngine) ActiveCoroutines() int32 {
if m.ActiveCoroutinesFunc != nil {
return m.ActiveCoroutinesFunc()
}
return 0
}
// CodeCache 返回字节码缓存Mock
//
// 返回值:
// - *CodeCache: CodeCacheFunc 的结果,未注入时返回 nil
func (m *MockLuaEngine) CodeCache() *CodeCache {
if m.CodeCacheFunc != nil {
return m.CodeCacheFunc()
}
return nil
}
// SharedDictManager 返回共享字典管理器Mock
//
// 返回值:
// - *SharedDictManager: SharedDictManagerFunc 的结果,未注入时返回 nil
func (m *MockLuaEngine) SharedDictManager() *SharedDictManager {
if m.SharedDictManagerFunc != nil {
return m.SharedDictManagerFunc()
}
return nil
}
// TimerManager 返回定时器管理器Mock
//
// 返回值:
// - *TimerManager: TimerManagerFunc 的结果,未注入时返回 nil
func (m *MockLuaEngine) TimerManager() *TimerManager {
if m.TimerManagerFunc != nil {
return m.TimerManagerFunc()
}
return nil
}
// LocationManager 返回 location 管理器Mock
//
// 返回值:
// - *LocationManager: LocationManagerFunc 的结果,未注入时返回 nil
func (m *MockLuaEngine) LocationManager() *LocationManager {
if m.LocationManagerFunc != nil {
return m.LocationManagerFunc()
}
return nil
}
// CreateSharedDict 创建共享字典Mock
//
// 参数:
// - name: 字典名称
// - maxItems: 最大条目数
//
// 返回值:
// - *SharedDict: CreateSharedDictFunc 的结果,未注入时返回 nil
func (m *MockLuaEngine) CreateSharedDict(name string, maxItems int) *SharedDict {
if m.CreateSharedDictFunc != nil {
return m.CreateSharedDictFunc(name, maxItems)
}
return nil
}
// InitSchedulerLState 初始化调度器 LStateMock
//
// 返回值:
// - error: InitSchedulerLStateFunc 的结果,未注入时返回 nil
func (m *MockLuaEngine) InitSchedulerLState() error {
if m.InitSchedulerLStateFunc != nil {
return m.InitSchedulerLStateFunc()
}
return nil
}
// SchedulerLoop 调度器循环Mock
func (m *MockLuaEngine) SchedulerLoop() {
if m.SchedulerLoopFunc != nil {
m.SchedulerLoopFunc()
}
}
// EnqueueCallback 将回调加入调度队列Mock
//
// 参数:
// - entry: 回调条目
//
// 返回值:
// - bool: EnqueueCallbackFunc 的结果,未注入时返回 false
func (m *MockLuaEngine) EnqueueCallback(entry *CallbackEntry) bool {
if m.EnqueueCallbackFunc != nil {
return m.EnqueueCallbackFunc(entry)
}
return false
}
// CloseScheduler 关闭调度器Mock
func (m *MockLuaEngine) CloseScheduler() {
if m.CloseSchedulerFunc != nil {
m.CloseSchedulerFunc()
}
}
// MockCoroutine 是 LuaCoroutine 的 Mock 实现。
//
// 通过注入函数指针模拟 LuaCoroutine 的核心方法,
// 同时包含模拟字段供测试验证。
type MockCoroutine struct {
// ExecuteFunc 模拟 Execute 方法
ExecuteFunc func(script string) error
// ExecuteFileFunc 模拟 ExecuteFile 方法
ExecuteFileFunc func(path string) error
// SetupSandboxFunc 模拟 SetupSandbox 方法
SetupSandboxFunc func() error
// CloseFunc 模拟 Close 方法
CloseFunc func()
// HandleYieldFunc 模拟 handleYield 方法
HandleYieldFunc func(values []glua.LValue) ([]glua.LValue, error)
// CreatedAt 协程创建时间
CreatedAt time.Time
// ExecutionContext 执行上下文
ExecutionContext context.Context
// Engine 所属引擎
Engine *MockLuaEngine
// Co 底层 Lua 协程
Co *glua.LState
// Cancel 取消函数
Cancel context.CancelFunc
// RequestCtx fasthttp 请求上下文
RequestCtx *fasthttp.RequestCtx
// OutputBuffer 输出缓冲
OutputBuffer []byte
// Exited 退出标记
Exited bool
}
// Execute 执行脚本Mock
//
// 参数:
// - script: Lua 脚本
//
// 返回值:
// - error: ExecuteFunc 的结果,未注入时返回 nil
func (c *MockCoroutine) Execute(script string) error {
if c.ExecuteFunc != nil {
return c.ExecuteFunc(script)
}
return nil
}
// ExecuteFile 执行文件Mock
//
// 参数:
// - path: 脚本文件路径
//
// 返回值:
// - error: ExecuteFileFunc 的结果,未注入时返回 nil
func (c *MockCoroutine) ExecuteFile(path string) error {
if c.ExecuteFileFunc != nil {
return c.ExecuteFileFunc(path)
}
return nil
}
// SetupSandbox 设置沙箱Mock
//
// 返回值:
// - error: SetupSandboxFunc 的结果,未注入时返回 nil
func (c *MockCoroutine) SetupSandbox() error {
if c.SetupSandboxFunc != nil {
return c.SetupSandboxFunc()
}
return nil
}
// Close 关闭协程Mock
func (c *MockCoroutine) Close() {
if c.CloseFunc != nil {
c.CloseFunc()
}
}