package core import ( "testing" "time" "llmsproxy/internal/lua" ) // TestNoKernelActionDeadlocksFromLua 对**每个**内核动作做同一条断言: // 在插件 Lua 调用(此时持有 p.mu)内执行时不得死锁。 // // 为什么是"每个"而不是"那个出问题的":最初只有 set_plugin_enabled 被发现自死锁 // (它经 SetEnabled 重入 p.mu),但"是否还有别的动作也会重入"只能靠枚举回答。 // 这条测试就是那次枚举的固化 —— 将来新增动作时如果也重入插件锁,它会失败。 // // 同时它验证了"超时后副作用仍在幕后执行"这个更隐蔽的变体:那个缺陷的表现是 // 插件收到 error、但动作其实生效了。断言方式只是"不死锁 + 返回",因为死锁与 // 迟到副作用是同一个根因(在错误的锁上下文里执行)。 func TestNoKernelActionDeadlocksFromLua(t *testing.T) { for _, a := range lua.KernelActions() { a := a t.Run(a.Name, func(t *testing.T) { c := kernelTestCore(t) code := ` local plugin = { name = "probe_all_actions", version = "1.0" } plugin.exports = { "run" } function plugin.run(args) local r, err = __llmsproxy_kernel.call(args.action, args.arg or {}) return { ok = r ~= nil, err = err } end return plugin ` if err := c.Plugins().LoadSource("probe_all_actions", code); err != nil { t.Fatal(err) } // 授权所有动作(含破坏性),以便真正执行到 all := make([]string, 0) for _, x := range lua.KernelActions() { all = append(all, x.Name) } if err := c.Plugins().SetPluginKernelPermission("probe_all_actions", all, false); err != nil { t.Fatal(err) } arg := map[string]interface{}{} switch a.Name { case "name", "adapter_owner": arg["name"] = "primary" } if a.Name == "adapter_owner" { arg = map[string]interface{}{"name": "openai"} } done := make(chan struct{}) go func() { defer close(done) _, err := c.Plugins().Call("probe_all_actions", "run", map[string]interface{}{"action": a.Name, "arg": arg}) if err != nil { t.Logf("%s 返回 err=%v", a.Name, err) } }() select { case <-done: case <-time.After(8 * time.Second): t.Fatalf("动作 %s 在 Lua 调用内死锁(deferred=%v danger=%s)", a.Name, a.Deferred, a.Danger) } }) } }