133 lines
3.6 KiB
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)
|
|
}
|
|
}
|