- backend: 新增 GRE 隧道实现(ip tunnel 点对点互联),binmgr 支持 iproute2 - backend: api/identity 调整,各协议 service(gre/ikev2/ipsec/l2tp/openvpn)统一改动 - backend: OpenVPN 认证辅助与用户口令同步逻辑完善 - frontend: 协议图标/向导/编辑器支持 GRE,VPN 用户页重构(234 行) - frontend: 新增 RouteListInput 路由列表输入组件,Dashboard/Layout 优化 - i18n: 中英文文案同步更新 - test: 新增 binmgr/common/gre 单测,openvpn 测试补充 - docs: README 补充 GRE 说明,默认监听端口 8080 → 18080 - chore: .gitignore 增加 opsx-vpn.previous(构建备份二进制)
40 lines
1.1 KiB
Go
40 lines
1.1 KiB
Go
package service
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
|
|
"vpn-platform/backend/internal/model"
|
|
)
|
|
|
|
func TestInstanceSnapshotRestore(t *testing.T) {
|
|
base := t.TempDir()
|
|
t.Setenv("VPN_DATA_DIR", base)
|
|
tunnel := &model.Tunnel{ID: 42, Protocol: "openvpn"}
|
|
if _, err := WriteConfig(tunnel, "server.conf", "old-config"); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
backup, err := SnapshotInstance(tunnel)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer CleanupInstanceSnapshot(backup)
|
|
if _, err := WriteConfig(tunnel, "server.conf", "new-config"); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := os.WriteFile(filepath.Join(InstanceDir(tunnel), "temporary"), []byte("new"), 0o600); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := RestoreInstanceSnapshot(tunnel, backup); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
got, err := os.ReadFile(filepath.Join(InstanceDir(tunnel), "server.conf"))
|
|
if err != nil || string(got) != "old-config" {
|
|
t.Fatalf("restored config = %q, err=%v", got, err)
|
|
}
|
|
if _, err := os.Stat(filepath.Join(InstanceDir(tunnel), "temporary")); !os.IsNotExist(err) {
|
|
t.Fatalf("temporary file remained after restore: %v", err)
|
|
}
|
|
}
|