lolly/internal/lua/api_ctx_test.go
xfy 2734b04d8f refactor: remove 16.8k lines of dead code across all internal packages
- Delete unused files: tempfile subsystem, matcher variants, server/internal
- Remove 200+ unused functions across proxy, ssl, lua, http2/3, stream, variable
- Fix proxy test type errors (backgroundRefresh ctx→Request)
- Move bench/tools mock backend into internal/testutil
- Remove corresponding test functions for all deleted code
2026-06-03 16:15:43 +08:00

192 lines
4.3 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 lua 提供 ngx.ctx API 测试
package lua
import (
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/valyala/fasthttp"
)
// TestNgxCtxTableAPI 测试 table API 操作
func TestNgxCtxTableAPI(t *testing.T) {
var req fasthttp.Request
req.Header.SetMethod("GET")
req.Header.SetRequestURI("/test")
ctx := &fasthttp.RequestCtx{}
ctx.Init(&req, nil, nil)
engine, err := NewEngine(DefaultConfig())
require.NoError(t, err)
defer engine.Close()
coro, err := engine.NewCoroutine(ctx)
require.NoError(t, err)
defer coro.Close()
err = coro.SetupSandbox()
require.NoError(t, err)
// 测试 table 操作函数
err = coro.Execute(`
-- 测试 pairs 遍历
ngx.ctx.items = {a = 1, b = 2, c = 3}
local count = 0
for k, v in pairs(ngx.ctx.items) do
count = count + 1
end
if count ~= 3 then
error("items table should have 3 elements")
end
-- 测试 table.insert
ngx.ctx.list = {}
table.insert(ngx.ctx.list, 1)
table.insert(ngx.ctx.list, 2)
table.insert(ngx.ctx.list, 3)
if ngx.ctx.list[1] ~= 1 or ngx.ctx.list[2] ~= 2 or ngx.ctx.list[3] ~= 3 then
error("table.insert failed")
end
-- 测试 table.remove
table.remove(ngx.ctx.list, 2)
if #ngx.ctx.list ~= 2 or ngx.ctx.list[1] ~= 1 or ngx.ctx.list[2] ~= 3 then
error("table.remove failed")
end
-- 测试 table.concat
ngx.ctx.strlist = {"hello", "world", "test"}
local joined = table.concat(ngx.ctx.strlist, ", ")
if joined ~= "hello, world, test" then
error("table.concat failed: " .. joined)
end
`)
assert.NoError(t, err)
}
// TestNgxCtxLargeValues 测试大值存储
func TestNgxCtxLargeValues(t *testing.T) {
var req fasthttp.Request
req.Header.SetMethod("GET")
req.Header.SetRequestURI("/test")
ctx := &fasthttp.RequestCtx{}
ctx.Init(&req, nil, nil)
engine, err := NewEngine(DefaultConfig())
require.NoError(t, err)
defer engine.Close()
coro, err := engine.NewCoroutine(ctx)
require.NoError(t, err)
defer coro.Close()
err = coro.SetupSandbox()
require.NoError(t, err)
// 测试大字符串和大 table在一个脚本中完成所有操作
largeString := string(make([]byte, 10000)) // 10KB 字符串
err = coro.Execute(`
-- 测试大字符串
ngx.ctx.large = "` + largeString + `"
local val = ngx.ctx.large
if type(val) ~= "string" then
error("large value should be string")
end
-- 测试大 table
ngx.ctx.bigtable = {}
for i = 1, 1000 do
ngx.ctx.bigtable[i] = i * 2
end
if #ngx.ctx.bigtable ~= 1000 then
error("bigtable should have 1000 elements")
end
`)
assert.NoError(t, err)
}
// TestNgxCtxTypeCoercion 测试类型转换
func TestNgxCtxTypeCoercion(t *testing.T) {
var req fasthttp.Request
req.Header.SetMethod("GET")
req.Header.SetRequestURI("/test")
ctx := &fasthttp.RequestCtx{}
ctx.Init(&req, nil, nil)
engine, err := NewEngine(DefaultConfig())
require.NoError(t, err)
defer engine.Close()
coro, err := engine.NewCoroutine(ctx)
require.NoError(t, err)
defer coro.Close()
err = coro.SetupSandbox()
require.NoError(t, err)
// 测试数字字符串自动转换
err = coro.Execute(`
ngx.ctx.num = 42
ngx.ctx.str = "123"
-- 数字加字符串
local result = ngx.ctx.num + tonumber(ngx.ctx.str)
if result ~= 165 then
error("type coercion failed: " .. tostring(result))
end
-- 字符串连接
local concatenated = "value: " .. ngx.ctx.num
if concatenated ~= "value: 42" then
error("string concatenation failed: " .. concatenated)
end
`)
assert.NoError(t, err)
}
// TestNgxCtxBooleanLogic 测试布尔逻辑
func TestNgxCtxBooleanLogic(t *testing.T) {
var req fasthttp.Request
req.Header.SetMethod("GET")
req.Header.SetRequestURI("/test")
ctx := &fasthttp.RequestCtx{}
ctx.Init(&req, nil, nil)
engine, err := NewEngine(DefaultConfig())
require.NoError(t, err)
defer engine.Close()
coro, err := engine.NewCoroutine(ctx)
require.NoError(t, err)
defer coro.Close()
err = coro.SetupSandbox()
require.NoError(t, err)
err = coro.Execute(`
ngx.ctx.a = true
ngx.ctx.b = false
-- and 操作
if (ngx.ctx.a and ngx.ctx.b) ~= false then
error("a and b should be false")
end
-- or 操作
if (ngx.ctx.a or ngx.ctx.b) ~= true then
error("a or b should be true")
end
-- not 操作
if (not ngx.ctx.a) ~= false then
error("not a should be false")
end
`)
assert.NoError(t, err)
}