Refactor RDP proxy handling and update related tests
This commit is contained in:
@@ -18,14 +18,14 @@ func TestLoadScopedSyntheticConfig(t *testing.T) {
|
||||
ConfigVersion: "config-v1",
|
||||
PeerDirectoryVersion: "peers-v1",
|
||||
PolicyVersion: "policy-v1",
|
||||
PeerEndpoints: map[string]string{"node-b": "http://127.0.0.1:19002"},
|
||||
PeerEndpoints: map[string]string{"node-b": "quic://127.0.0.1:19443"},
|
||||
PeerEndpointCandidates: map[string][]PeerEndpointCandidate{
|
||||
"node-b": {
|
||||
{
|
||||
EndpointID: "node-b-public",
|
||||
NodeID: "node-b",
|
||||
Transport: "direct_tcp_tls",
|
||||
Address: "203.0.113.20:443",
|
||||
Transport: "direct_quic",
|
||||
Address: "quic://203.0.113.20:19443",
|
||||
Reachability: "public",
|
||||
NATType: "restricted",
|
||||
ConnectivityMode: "direct",
|
||||
@@ -55,8 +55,8 @@ func TestLoadScopedSyntheticConfig(t *testing.T) {
|
||||
RecoverySeeds: []PeerRecoverySeed{
|
||||
{
|
||||
NodeID: "node-b",
|
||||
Endpoint: "https://node-b.example.test:443",
|
||||
Transport: "direct_tcp_tls",
|
||||
Endpoint: "quic://node-b.example.test:19443",
|
||||
Transport: "direct_quic",
|
||||
ConnectivityMode: "direct",
|
||||
Priority: 10,
|
||||
},
|
||||
@@ -66,8 +66,8 @@ func TestLoadScopedSyntheticConfig(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",
|
||||
RouteIDs: []string{"route-a-b"},
|
||||
AllowedChannels: []string{"fabric_control", "route_control"},
|
||||
@@ -158,8 +158,8 @@ func TestLoadScopedSyntheticConfigRejectsInvalidPeerEndpointCandidate(t *testing
|
||||
{
|
||||
EndpointID: "node-b-public",
|
||||
NodeID: "node-c",
|
||||
Transport: "direct_tcp_tls",
|
||||
Address: "203.0.113.20:443",
|
||||
Transport: "direct_quic",
|
||||
Address: "quic://203.0.113.20:19443",
|
||||
Reachability: "public",
|
||||
ConnectivityMode: "direct",
|
||||
},
|
||||
@@ -174,6 +174,73 @@ func TestLoadScopedSyntheticConfigRejectsInvalidPeerEndpointCandidate(t *testing
|
||||
}
|
||||
}
|
||||
|
||||
func TestLoadScopedSyntheticConfigRejectsLegacyPeerEndpoint(t *testing.T) {
|
||||
path := writeScopedConfig(t, ScopedSyntheticConfig{
|
||||
SchemaVersion: "c17f.synthetic.v1",
|
||||
ClusterID: "cluster-1",
|
||||
LocalNodeID: "node-a",
|
||||
PeerEndpoints: map[string]string{"node-b": "https://node-b.example.test:443"},
|
||||
Routes: []SyntheticRoute{liveSyntheticRoute("route-a-b", []string{"node-a", "node-b"})},
|
||||
})
|
||||
|
||||
_, err := LoadScopedSyntheticConfig(path, PeerIdentity{ClusterID: "cluster-1", NodeID: "node-a"})
|
||||
if err == nil {
|
||||
t.Fatal("expected non-QUIC peer endpoint error")
|
||||
}
|
||||
}
|
||||
|
||||
func TestLoadScopedSyntheticConfigRejectsLegacyPeerEndpointCandidateTransport(t *testing.T) {
|
||||
path := writeScopedConfig(t, ScopedSyntheticConfig{
|
||||
SchemaVersion: "c17f.synthetic.v1",
|
||||
ClusterID: "cluster-1",
|
||||
LocalNodeID: "node-a",
|
||||
PeerEndpointCandidates: map[string][]PeerEndpointCandidate{
|
||||
"node-b": {
|
||||
{
|
||||
EndpointID: "node-b-websocket",
|
||||
NodeID: "node-b",
|
||||
Transport: "websocket",
|
||||
Address: "quic://203.0.113.20:19443",
|
||||
Reachability: "public",
|
||||
ConnectivityMode: "direct",
|
||||
},
|
||||
},
|
||||
},
|
||||
Routes: []SyntheticRoute{liveSyntheticRoute("route-a-b", []string{"node-a", "node-b"})},
|
||||
})
|
||||
|
||||
_, err := LoadScopedSyntheticConfig(path, PeerIdentity{ClusterID: "cluster-1", NodeID: "node-a"})
|
||||
if err == nil {
|
||||
t.Fatal("expected non-QUIC peer endpoint candidate error")
|
||||
}
|
||||
}
|
||||
|
||||
func TestLoadScopedSyntheticConfigRejectsLegacyPeerEndpointCandidateScheme(t *testing.T) {
|
||||
path := writeScopedConfig(t, ScopedSyntheticConfig{
|
||||
SchemaVersion: "c17f.synthetic.v1",
|
||||
ClusterID: "cluster-1",
|
||||
LocalNodeID: "node-a",
|
||||
PeerEndpointCandidates: map[string][]PeerEndpointCandidate{
|
||||
"node-b": {
|
||||
{
|
||||
EndpointID: "node-b-https",
|
||||
NodeID: "node-b",
|
||||
Transport: "direct_quic",
|
||||
Address: "https://node-b.example.test:443",
|
||||
Reachability: "public",
|
||||
ConnectivityMode: "direct",
|
||||
},
|
||||
},
|
||||
},
|
||||
Routes: []SyntheticRoute{liveSyntheticRoute("route-a-b", []string{"node-a", "node-b"})},
|
||||
})
|
||||
|
||||
_, err := LoadScopedSyntheticConfig(path, PeerIdentity{ClusterID: "cluster-1", NodeID: "node-a"})
|
||||
if err == nil {
|
||||
t.Fatal("expected non-QUIC peer endpoint candidate error")
|
||||
}
|
||||
}
|
||||
|
||||
func TestLoadScopedSyntheticConfigRejectsInvalidPeerEndpointObservation(t *testing.T) {
|
||||
path := writeScopedConfig(t, ScopedSyntheticConfig{
|
||||
SchemaVersion: "c17f.synthetic.v1",
|
||||
@@ -217,7 +284,7 @@ func TestLoadScopedSyntheticConfigRejectsInvalidRecoverySeed(t *testing.T) {
|
||||
ClusterID: "cluster-1",
|
||||
LocalNodeID: "node-a",
|
||||
RecoverySeeds: []PeerRecoverySeed{
|
||||
{NodeID: "node-b", Endpoint: "", Transport: "direct_tcp_tls"},
|
||||
{NodeID: "node-b", Endpoint: "", Transport: "direct_quic"},
|
||||
},
|
||||
Routes: []SyntheticRoute{liveSyntheticRoute("route-a-b", []string{"node-a", "node-b"})},
|
||||
})
|
||||
@@ -228,6 +295,23 @@ func TestLoadScopedSyntheticConfigRejectsInvalidRecoverySeed(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestLoadScopedSyntheticConfigRejectsLegacyRecoverySeed(t *testing.T) {
|
||||
path := writeScopedConfig(t, ScopedSyntheticConfig{
|
||||
SchemaVersion: "c17f.synthetic.v1",
|
||||
ClusterID: "cluster-1",
|
||||
LocalNodeID: "node-a",
|
||||
RecoverySeeds: []PeerRecoverySeed{
|
||||
{NodeID: "node-b", Endpoint: "https://node-b.example.test:443", Transport: "direct_quic"},
|
||||
},
|
||||
Routes: []SyntheticRoute{liveSyntheticRoute("route-a-b", []string{"node-a", "node-b"})},
|
||||
})
|
||||
|
||||
_, err := LoadScopedSyntheticConfig(path, PeerIdentity{ClusterID: "cluster-1", NodeID: "node-a"})
|
||||
if err == nil {
|
||||
t.Fatal("expected non-QUIC recovery seed error")
|
||||
}
|
||||
}
|
||||
|
||||
func TestLoadScopedSyntheticConfigRejectsInvalidRendezvousLease(t *testing.T) {
|
||||
path := writeScopedConfig(t, ScopedSyntheticConfig{
|
||||
SchemaVersion: "c17z12.synthetic.v1",
|
||||
@@ -238,8 +322,8 @@ func TestLoadScopedSyntheticConfigRejectsInvalidRendezvousLease(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",
|
||||
RouteIDs: []string{"route-a-b"},
|
||||
ExpiresAt: time.Now().UTC().Add(time.Hour),
|
||||
},
|
||||
@@ -253,6 +337,36 @@ func TestLoadScopedSyntheticConfigRejectsInvalidRendezvousLease(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestLoadScopedSyntheticConfigRejectsLegacyRendezvousLease(t *testing.T) {
|
||||
path := writeScopedConfig(t, ScopedSyntheticConfig{
|
||||
SchemaVersion: "c17z12.synthetic.v1",
|
||||
ClusterID: "cluster-1",
|
||||
LocalNodeID: "node-a",
|
||||
RendezvousLeases: []PeerRendezvousLease{
|
||||
{
|
||||
LeaseID: "lease-node-b-via-node-r",
|
||||
PeerNodeID: "node-b",
|
||||
RelayNodeID: "node-r",
|
||||
RelayEndpoint: "https://node-r.example.test:443",
|
||||
Transport: "relay_quic",
|
||||
ConnectivityMode: "relay_required",
|
||||
RouteIDs: []string{"route-a-b"},
|
||||
AllowedChannels: []string{"fabric_control", "route_control"},
|
||||
Priority: 10,
|
||||
ControlPlaneOnly: true,
|
||||
IssuedAt: time.Now().UTC().Add(-time.Minute),
|
||||
ExpiresAt: time.Now().UTC().Add(time.Hour),
|
||||
},
|
||||
},
|
||||
Routes: []SyntheticRoute{liveSyntheticRoute("route-a-b", []string{"node-a", "node-r", "node-b"})},
|
||||
})
|
||||
|
||||
_, err := LoadScopedSyntheticConfig(path, PeerIdentity{ClusterID: "cluster-1", NodeID: "node-a"})
|
||||
if err == nil {
|
||||
t.Fatal("expected non-QUIC rendezvous lease error")
|
||||
}
|
||||
}
|
||||
|
||||
func writeScopedConfig(t *testing.T, cfg ScopedSyntheticConfig) string {
|
||||
t.Helper()
|
||||
payload, err := json.Marshal(cfg)
|
||||
@@ -265,3 +379,32 @@ func writeScopedConfig(t *testing.T, cfg ScopedSyntheticConfig) string {
|
||||
}
|
||||
return path
|
||||
}
|
||||
|
||||
func liveSyntheticRoute(routeID string, hops []string) SyntheticRoute {
|
||||
return SyntheticRoute{
|
||||
RouteID: routeID,
|
||||
ClusterID: "cluster-1",
|
||||
SourceNodeID: hops[0],
|
||||
DestinationNodeID: hops[len(hops)-1],
|
||||
Hops: hops,
|
||||
AllowedChannels: []string{SyntheticChannelFabricControl},
|
||||
MaxTTL: 8,
|
||||
MaxHops: 8,
|
||||
ExpiresAt: time.Now().UTC().Add(time.Hour),
|
||||
RouteVersion: "route-v1",
|
||||
PolicyVersion: "policy-v1",
|
||||
PeerDirectoryVersion: "peers-v1",
|
||||
}
|
||||
}
|
||||
|
||||
func sameStrings(left, right []string) bool {
|
||||
if len(left) != len(right) {
|
||||
return false
|
||||
}
|
||||
for i := range left {
|
||||
if left[i] != right[i] {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user