Refactor RDP proxy handling and update related tests
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
package mesh
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
@@ -11,8 +12,8 @@ func TestPeerConnectionIntentsClassifyCorporateDirect(t *testing.T) {
|
||||
PeerCache: PeerCacheSnapshot{Entries: []PeerCacheEntry{
|
||||
{
|
||||
NodeID: "node-b",
|
||||
Endpoint: "http://10.24.10.20:19001",
|
||||
BestTransport: "direct_tcp_tls",
|
||||
Endpoint: "quic://10.24.10.20:19443",
|
||||
BestTransport: "lan_quic",
|
||||
BestReachability: "private",
|
||||
BestConnectivity: "direct",
|
||||
BestPolicyTags: []string{"corp-lan", "same-site"},
|
||||
@@ -23,7 +24,7 @@ func TestPeerConnectionIntentsClassifyCorporateDirect(t *testing.T) {
|
||||
Candidates: []PeerRecoveryCandidate{
|
||||
{
|
||||
NodeID: "node-b",
|
||||
Endpoint: "http://10.24.10.20:19001",
|
||||
Endpoint: "quic://10.24.10.20:19443",
|
||||
ConnectionState: PeerConnectionReady,
|
||||
Reason: "maintain_ready",
|
||||
Priority: 100,
|
||||
@@ -48,15 +49,15 @@ func TestPeerConnectionIntentsClassifyOutboundAndRelayAsRendezvousRequired(t *te
|
||||
PeerCache: PeerCacheSnapshot{Entries: []PeerCacheEntry{
|
||||
{
|
||||
NodeID: "node-b",
|
||||
Endpoint: "https://node-b.example.test:443",
|
||||
BestTransport: "direct_tcp_tls",
|
||||
Endpoint: "quic://node-b.example.test:19443",
|
||||
BestTransport: "reverse_quic",
|
||||
BestReachability: "outbound_only",
|
||||
BestConnectivity: "outbound_only",
|
||||
},
|
||||
{
|
||||
NodeID: "node-c",
|
||||
Endpoint: "relay://fabric-relay/node-c",
|
||||
BestTransport: "relay",
|
||||
BestTransport: "relay_quic",
|
||||
BestReachability: "relay",
|
||||
BestConnectivity: "relay_required",
|
||||
},
|
||||
@@ -66,7 +67,7 @@ func TestPeerConnectionIntentsClassifyOutboundAndRelayAsRendezvousRequired(t *te
|
||||
Candidates: []PeerRecoveryCandidate{
|
||||
{
|
||||
NodeID: "node-b",
|
||||
Endpoint: "https://node-b.example.test:443",
|
||||
Endpoint: "quic://node-b.example.test:19443",
|
||||
ConnectionState: PeerConnectionDisconnected,
|
||||
Reason: "recover_warm",
|
||||
Priority: 90,
|
||||
@@ -91,6 +92,42 @@ func TestPeerConnectionIntentsClassifyOutboundAndRelayAsRendezvousRequired(t *te
|
||||
}
|
||||
}
|
||||
|
||||
func TestPeerConnectionIntentsRequireRendezvousForRemotePrivateRegion(t *testing.T) {
|
||||
now := time.Date(2026, 4, 28, 12, 0, 0, 0, time.UTC)
|
||||
plan := PlanPeerConnectionIntents(PeerConnectionIntentPlanConfig{
|
||||
PreferredRegion: "ifcm",
|
||||
PeerCache: PeerCacheSnapshot{Entries: []PeerCacheEntry{
|
||||
{
|
||||
NodeID: "node-b",
|
||||
Endpoint: "quic://192.168.200.61:19132",
|
||||
BestTransport: "direct_quic",
|
||||
BestReachability: "private",
|
||||
BestConnectivity: "private_lan",
|
||||
BestRegion: "docker-test",
|
||||
},
|
||||
}},
|
||||
RecoveryPlan: PeerRecoveryPlan{
|
||||
Mode: PeerRecoveryModeRecovery,
|
||||
Candidates: []PeerRecoveryCandidate{{
|
||||
NodeID: "node-b",
|
||||
Endpoint: "quic://192.168.200.61:19132",
|
||||
ConnectionState: PeerConnectionDisconnected,
|
||||
Reason: "recover_warm",
|
||||
Priority: 100,
|
||||
}},
|
||||
},
|
||||
Now: now,
|
||||
})
|
||||
|
||||
if plan.IntentCount != 1 || plan.RelayRequiredCount != 1 || plan.RendezvousRequiredCount != 1 {
|
||||
t.Fatalf("unexpected remote private plan counts: %+v", plan)
|
||||
}
|
||||
intent := plan.Intents[0]
|
||||
if intent.DirectCandidate || !intent.RequiresRendezvous || intent.TransportMode != PeerTransportModeRelayRequired {
|
||||
t.Fatalf("unexpected remote private intent: %+v", intent)
|
||||
}
|
||||
}
|
||||
|
||||
func TestPeerConnectionIntentsResolveRendezvousWithRelayLease(t *testing.T) {
|
||||
now := time.Date(2026, 4, 28, 12, 0, 0, 0, time.UTC)
|
||||
plan := PlanPeerConnectionIntents(PeerConnectionIntentPlanConfig{
|
||||
@@ -120,13 +157,14 @@ func TestPeerConnectionIntentsResolveRendezvousWithRelayLease(t *testing.T) {
|
||||
LeaseID: "lease-node-b-via-node-r",
|
||||
PeerNodeID: "node-b",
|
||||
RelayNodeID: "node-r",
|
||||
RelayEndpoint: "http://node-r:19000",
|
||||
Transport: "relay_control",
|
||||
RelayEndpoint: "quic://node-r:19443",
|
||||
Transport: "relay_quic",
|
||||
ConnectivityMode: "relay_required",
|
||||
Priority: 10,
|
||||
ControlPlaneOnly: true,
|
||||
IssuedAt: now.Add(-time.Minute),
|
||||
ExpiresAt: now.Add(time.Minute),
|
||||
Metadata: peerConnectionIntentLeaseMetadata(t, "abc123"),
|
||||
},
|
||||
},
|
||||
Now: now,
|
||||
@@ -137,9 +175,10 @@ func TestPeerConnectionIntentsResolveRendezvousWithRelayLease(t *testing.T) {
|
||||
}
|
||||
intent := plan.Intents[0]
|
||||
if intent.TransportMode != PeerTransportModeRelayControl ||
|
||||
intent.Endpoint != "http://node-r:19000" ||
|
||||
intent.Endpoint != "quic://node-r:19443" ||
|
||||
intent.RelayNodeID != "node-r" ||
|
||||
intent.RendezvousLeaseID != "lease-node-b-via-node-r" ||
|
||||
intent.BestPeerCertSHA256 != "abc123" ||
|
||||
!intent.RelayCandidate ||
|
||||
!intent.RendezvousResolved ||
|
||||
intent.RequiresRendezvous {
|
||||
@@ -176,8 +215,8 @@ func TestPeerConnectionIntentsSkipExpiredRendezvousLeaseAndReselect(t *testing.T
|
||||
LeaseID: "lease-expired-preferred",
|
||||
PeerNodeID: "node-b",
|
||||
RelayNodeID: "node-r-old",
|
||||
RelayEndpoint: "http://node-r-old:19000",
|
||||
Transport: "relay_control",
|
||||
RelayEndpoint: "quic://node-r-old:19443",
|
||||
Transport: "relay_quic",
|
||||
ConnectivityMode: "relay_required",
|
||||
Priority: 1,
|
||||
ControlPlaneOnly: true,
|
||||
@@ -188,8 +227,8 @@ func TestPeerConnectionIntentsSkipExpiredRendezvousLeaseAndReselect(t *testing.T
|
||||
LeaseID: "lease-active-reselected",
|
||||
PeerNodeID: "node-b",
|
||||
RelayNodeID: "node-r-new",
|
||||
RelayEndpoint: "http://node-r-new:19000",
|
||||
Transport: "relay_control",
|
||||
RelayEndpoint: "quic://node-r-new:19443",
|
||||
Transport: "relay_quic",
|
||||
ConnectivityMode: "relay_required",
|
||||
Priority: 20,
|
||||
ControlPlaneOnly: true,
|
||||
@@ -206,20 +245,29 @@ func TestPeerConnectionIntentsSkipExpiredRendezvousLeaseAndReselect(t *testing.T
|
||||
intent := plan.Intents[0]
|
||||
if intent.RendezvousLeaseID != "lease-active-reselected" ||
|
||||
intent.RelayNodeID != "node-r-new" ||
|
||||
intent.Endpoint != "http://node-r-new:19000" {
|
||||
intent.Endpoint != "quic://node-r-new:19443" {
|
||||
t.Fatalf("expired lease was not skipped: %+v", intent)
|
||||
}
|
||||
}
|
||||
|
||||
func peerConnectionIntentLeaseMetadata(t *testing.T, certSHA256 string) json.RawMessage {
|
||||
t.Helper()
|
||||
payload, err := json.Marshal(map[string]string{"peer_cert_sha256": certSHA256})
|
||||
if err != nil {
|
||||
t.Fatalf("marshal metadata: %v", err)
|
||||
}
|
||||
return payload
|
||||
}
|
||||
|
||||
func TestPeerConnectionIntentsClassifyPrivateEndpointWithoutCandidateHints(t *testing.T) {
|
||||
plan := PlanPeerConnectionIntents(PeerConnectionIntentPlanConfig{
|
||||
PeerCache: PeerCacheSnapshot{Entries: []PeerCacheEntry{
|
||||
{NodeID: "node-b", Endpoint: "http://192.168.10.20:19001"},
|
||||
{NodeID: "node-b", Endpoint: "quic://192.168.10.20:19443"},
|
||||
}},
|
||||
RecoveryPlan: PeerRecoveryPlan{Candidates: []PeerRecoveryCandidate{
|
||||
{
|
||||
NodeID: "node-b",
|
||||
Endpoint: "http://192.168.10.20:19001",
|
||||
Endpoint: "quic://192.168.10.20:19443",
|
||||
ConnectionState: PeerConnectionDisconnected,
|
||||
Reason: "recover_peer",
|
||||
Priority: 10,
|
||||
|
||||
Reference in New Issue
Block a user