Files
qsc20001102 142e5dc7d6
ci / Go checks (ubuntu-latest) (push) Has been cancelled
ci / Go checks (windows-latest) (push) Has been cancelled
初版功能完成
2026-08-29 13:12:17 +08:00

84 lines
2.4 KiB
Go

package main
import (
"context"
"fmt"
"net/netip"
"os"
"path/filepath"
"testing"
"remlink/internal/database"
"remlink/internal/model"
)
func TestValidateEndpoint(t *testing.T) {
for _, endpoint := range []string{"203.0.113.1:51820", "vpn.example.test:51820"} {
if err := validateEndpoint(endpoint, 51820); err != nil {
t.Errorf("validateEndpoint(%q): %v", endpoint, err)
}
}
for _, endpoint := range []string{"", "203.0.113.1", ":51820", "203.0.113.1:1234"} {
if err := validateEndpoint(endpoint, 51820); err == nil {
t.Errorf("validateEndpoint(%q) accepted invalid endpoint", endpoint)
}
}
}
func TestPrintJoinTokenDoesNotCloseActiveSessions(t *testing.T) {
t.Parallel()
dataDirectory := filepath.Join(t.TempDir(), "data")
if err := os.MkdirAll(dataDirectory, 0o700); err != nil {
t.Fatal(err)
}
configPath := filepath.Join(t.TempDir(), "server.yaml")
configText := fmt.Sprintf("data:\n directory: %q\n", dataDirectory)
if err := os.WriteFile(configPath, []byte(configText), 0o600); err != nil {
t.Fatal(err)
}
ctx := context.Background()
db, err := database.Open(ctx, filepath.Join(dataDirectory, "remlink.db"))
if err != nil {
t.Fatal(err)
}
store := database.NewStore(db)
for _, node := range []model.Node{
{ID: "engineer", Type: model.NodeTypeEngineer, Name: "Engineer", OverlayIP: netip.MustParseAddr("10.88.0.2"), WGPublicKey: "engineer-key", NodeTokenHash: []byte("a")},
{ID: "site", Type: model.NodeTypeSite, Name: "Site", OverlayIP: netip.MustParseAddr("10.88.0.3"), WGPublicKey: "site-key", NodeTokenHash: []byte("b")},
} {
if err := store.CreateNode(ctx, node); err != nil {
db.Close()
t.Fatal(err)
}
}
const sessionID = 42
if err := store.CreateSession(ctx, model.Session{
ID: sessionID, EngineerNodeID: "engineer", SiteNodeID: "site",
Status: model.SessionActive, CIDRs: []netip.Prefix{netip.MustParsePrefix("192.168.13.0/24")},
}); err != nil {
db.Close()
t.Fatal(err)
}
if err := db.Close(); err != nil {
t.Fatal(err)
}
if err := run([]string{"-config", configPath, "-print-join-token"}); err != nil {
t.Fatal(err)
}
db, err = database.Open(ctx, filepath.Join(dataDirectory, "remlink.db"))
if err != nil {
t.Fatal(err)
}
defer db.Close()
session, err := database.NewStore(db).GetSession(ctx, sessionID)
if err != nil {
t.Fatal(err)
}
if session.Status != model.SessionActive {
t.Fatalf("print Join Token changed active Session status to %s", session.Status)
}
}