mirror of
https://gitcode.com/JianFeeeee/webui4frpc.git
synced 2026-09-20 08:57:55 +00:00
webui4frpc: 独立可用的可视化 frpc 控制器 (M0)
- 零 frp 源码依赖,单二进制 (Go + Vue3 + VueFlow + Element Plus) - 画布多对多连线,渲染 tcp/udp/http/https frpc 配置 - worker 进程管理:自愈、日志轮转、崩溃退避重启 - frpc 一键安装 (GitHub Releases) + 手动指定路径 - 三页 UI:状态(默认)/连接配置/设置 - 状态页实时节点/转发状态,节点可增删改启停 - 画布冲突检查:端口/域名冲突标红 + 弹窗拦截保存 - backend 单测覆盖 store/render/process/httpapi/install - plan.md + FRPC_FEATURES_AUDIT.md 文档
This commit is contained in:
59
internal/process/process_test.go
Normal file
59
internal/process/process_test.go
Normal file
@ -0,0 +1,59 @@
|
||||
package process
|
||||
|
||||
import (
|
||||
"os"
|
||||
"path/filepath"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func newTestManager(t *testing.T) *Manager {
|
||||
t.Helper()
|
||||
dir := t.TempDir()
|
||||
script := filepath.Join(dir, "fake-frpc")
|
||||
// A fake frpc that sleeps (simulating a healthy worker).
|
||||
if err := os.WriteFile(script, []byte("#!/bin/sh\nsleep 60\n"), 0o700); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
opts := Options{
|
||||
ConfigsDir: filepath.Join(dir, "configs"),
|
||||
LogsDir: filepath.Join(dir, "logs"),
|
||||
BinaryPath: func() string { return script },
|
||||
Render: func(name string) ([]byte, error) {
|
||||
return []byte(`{"name":"` + name + `"}`), nil
|
||||
},
|
||||
AutoRestart: func(string) bool { return false },
|
||||
RestartInterval: func() int { return 1 },
|
||||
}
|
||||
return NewManager(opts)
|
||||
}
|
||||
|
||||
func TestStartStop(t *testing.T) {
|
||||
pm := newTestManager(t)
|
||||
if err := pm.Start("srv-a"); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
st, has := pm.Status("srv-a")
|
||||
if !has || st.State != "running" || st.Pid <= 0 {
|
||||
t.Fatalf("status = %+v has=%v", st, has)
|
||||
}
|
||||
if err := pm.Stop("srv-a"); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
st, has = pm.Status("srv-a")
|
||||
if has {
|
||||
t.Fatalf("after stop has=%v", has)
|
||||
}
|
||||
}
|
||||
|
||||
func TestConfigWritten(t *testing.T) {
|
||||
pm := newTestManager(t)
|
||||
_ = pm.Start("srv-b")
|
||||
defer pm.Stop("srv-b")
|
||||
data, err := os.ReadFile(pm.ConfigPath("srv-b"))
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if string(data) != `{"name":"srv-b"}` {
|
||||
t.Fatalf("config = %s", data)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user