mirror of
https://gitcode.com/JianFeeeee/webui4frpc.git
synced 2026-09-20 17:07:57 +00:00
- 零 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 文档
61 lines
1.7 KiB
Go
61 lines
1.7 KiB
Go
package store
|
|
|
|
import (
|
|
"path/filepath"
|
|
"testing"
|
|
)
|
|
|
|
func TestLocalRemoteLinkRoundTrip(t *testing.T) {
|
|
dir := t.TempDir()
|
|
st, err := New(filepath.Join(dir, "test.db"))
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer st.Close()
|
|
|
|
if err := st.UpsertLocal(Local{Name: "web", IP: "127.0.0.1", Port: 8080, Protocol: "tcp"}); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := st.UpsertRemote(Remote{Name: "srv-a", IP: "1.2.3.4", Port: 7000, Token: "tok", Enabled: true}); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := st.ReplaceLinks([]Link{{Local: "web", Remote: "srv-a", RemotePort: 8080}}); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
locals, _ := st.ListLocals()
|
|
if len(locals) != 1 || locals[0].Name != "web" {
|
|
t.Fatalf("locals = %+v", locals)
|
|
}
|
|
remotes, _ := st.ListRemotes()
|
|
if len(remotes) != 1 || remotes[0].Token != "tok" {
|
|
t.Fatalf("remotes = %+v", remotes)
|
|
}
|
|
fwds, err := st.LinksForRemote("srv-a")
|
|
if err != nil || len(fwds) != 1 {
|
|
t.Fatalf("forwards = %+v err=%v", fwds, err)
|
|
}
|
|
if fwds[0].LocalPort != 8080 || fwds[0].RemotePort != 8080 {
|
|
t.Fatalf("forward = %+v", fwds[0])
|
|
}
|
|
}
|
|
|
|
func TestReplaceLinksClearsOld(t *testing.T) {
|
|
dir := t.TempDir()
|
|
st, _ := New(filepath.Join(dir, "test.db"))
|
|
defer st.Close()
|
|
_ = st.UpsertLocal(Local{Name: "a", IP: "127.0.0.1", Port: 1, Protocol: "tcp"})
|
|
_ = st.UpsertLocal(Local{Name: "b", IP: "127.0.0.1", Port: 2, Protocol: "tcp"})
|
|
_ = st.UpsertRemote(Remote{Name: "r", IP: "1.2.3.4", Port: 7000, Enabled: true})
|
|
if err := st.ReplaceLinks([]Link{{Local: "a", Remote: "r", RemotePort: 1}}); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := st.ReplaceLinks([]Link{{Local: "b", Remote: "r", RemotePort: 2}}); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
links, _ := st.ListLinks()
|
|
if len(links) != 1 || links[0].Local != "b" {
|
|
t.Fatalf("links = %+v", links)
|
|
}
|
|
}
|