Files
elmprodvpn/selective-vpn-api/app/transport_runtime_observability_events_test.go

133 lines
3.6 KiB
Go

package app
import "testing"
func TestPublishTransportRuntimeObservabilitySnapshotChanged(t *testing.T) {
withTransportPolicyMutationTestPaths(t)
prevEvents := events
events = newEventBus(32)
t.Cleanup(func() {
events = prevEvents
})
prevEgress := egressIdentitySWR
egressIdentitySWR = newEgressIdentityService(1)
t.Cleanup(func() {
egressIdentitySWR = prevEgress
})
if err := saveTransportClientsState(transportClientsState{
Version: transportStateVersion,
Items: []TransportClient{
{
ID: "sb-one",
Kind: TransportClientSingBox,
Enabled: true,
IfaceID: "edge-a",
Iface: "tun-edge0",
RoutingTable: "agvpn_if_edge_a",
Status: TransportClientUp,
Health: TransportClientHealth{
LastCheck: "2026-03-16T12:11:00Z",
LatencyMS: 44,
},
},
},
}); err != nil {
t.Fatalf("save clients state: %v", err)
}
if err := saveTransportInterfacesState(transportInterfacesState{
Version: transportStateVersion,
Items: []TransportInterface{
{
ID: "edge-a",
Name: "Edge A",
Mode: TransportInterfaceModeDedicated,
RuntimeIface: "tun-edge",
},
},
}); err != nil {
t.Fatalf("save interfaces state: %v", err)
}
if err := saveTransportPolicyState(TransportPolicyState{
Version: transportStateVersion,
Revision: 3,
Intents: []TransportPolicyIntent{
{SelectorType: "domain", SelectorValue: "example.org", ClientID: "sb-one"},
},
}); err != nil {
t.Fatalf("save policy state: %v", err)
}
if err := saveTransportPolicyCompilePlan(TransportPolicyCompilePlan{
PolicyRevision: 3,
InterfaceCount: 1,
RuleCount: 1,
Interfaces: []TransportPolicyCompileInterface{
{IfaceID: "edge-a", RuleCount: 1, ClientIDs: []string{"sb-one"}},
},
}); err != nil {
t.Fatalf("save policy plan: %v", err)
}
egressIdentitySWR.mu.Lock()
egressIdentitySWR.entries["transport:sb-one"] = &egressIdentityEntry{
item: EgressIdentity{
Scope: "transport:sb-one",
Source: "transport",
SourceID: "sb-one",
IP: "198.51.100.77",
CountryCode: "FR",
},
}
egressIdentitySWR.mu.Unlock()
publishTransportRuntimeObservabilitySnapshotChanged(
"transport_client_state_changed",
[]string{"sb-one"},
nil,
)
evs := events.since(0)
if len(evs) != 1 {
t.Fatalf("expected one event, got %d", len(evs))
}
if evs[0].Kind != "transport_runtime_snapshot_changed" {
t.Fatalf("unexpected event kind: %#v", evs[0])
}
payload, ok := evs[0].Data.(TransportRuntimeObservabilityChangedEvent)
if !ok {
t.Fatalf("unexpected event payload type: %T", evs[0].Data)
}
if payload.Reason != "transport_client_state_changed" {
t.Fatalf("unexpected event reason: %#v", payload)
}
if len(payload.ClientIDs) != 1 || payload.ClientIDs[0] != "sb-one" {
t.Fatalf("unexpected client ids: %#v", payload)
}
if len(payload.IfaceIDs) != 1 || payload.IfaceIDs[0] != "edge-a" {
t.Fatalf("unexpected iface ids: %#v", payload)
}
if payload.Count != len(payload.Items) || payload.Count < 2 {
t.Fatalf("unexpected snapshot payload: %#v", payload)
}
}
func TestResolveTransportRuntimeObservabilityEventIfaceIDsUsesExplicitFallback(t *testing.T) {
items := []TransportRuntimeObservabilityItem{
{
IfaceID: "edge-a",
ClientID: "sb-one",
ClientIDs: []string{"sb-one", "dnstt-one"},
},
}
ifaceIDs := resolveTransportRuntimeObservabilityEventIfaceIDs(
items,
[]string{"deleted-client"},
[]string{"edge-z", "edge-a"},
)
if len(ifaceIDs) != 2 || ifaceIDs[0] != "edge-z" || ifaceIDs[1] != "edge-a" {
t.Fatalf("unexpected iface ids: %#v", ifaceIDs)
}
}