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) } }