| 1 | // SPDX-License-Identifier: GPL-3.0-or-later |
| 2 | |
| 3 | package l2topology |
| 4 | |
| 5 | import ( |
| 6 | "testing" |
| 7 | |
| 8 | "github.com/stretchr/testify/require" |
| 9 | ) |
| 10 | |
| 11 | func TestSortedTopologyPortNeighbors_NormalizesAndOrders(t *testing.T) { |
| 12 | neighbors := map[string]topologyPortNeighborStatus{ |
| 13 | "b": { |
| 14 | Protocol: " CDP ", |
| 15 | RemoteDevice: " switch-b ", |
| 16 | RemotePort: " Gi0/2 ", |
| 17 | RemoteIP: " 10.0.0.2 ", |
| 18 | RemoteChassisID: "00:11:22:33:44:55", |
| 19 | RemoteCapabilities: []string{"router", "bridge", "router"}, |
| 20 | }, |
| 21 | "a": { |
| 22 | Protocol: " lldp ", |
| 23 | RemoteDevice: " switch-a ", |
| 24 | RemotePort: " Gi0/1 ", |
| 25 | RemoteIP: " 10.0.0.1 ", |
| 26 | RemoteChassisID: " aa:bb:cc:dd:ee:ff ", |
| 27 | RemoteCapabilities: []string{"bridge", "router", "bridge"}, |
| 28 | }, |
| 29 | "empty": {}, |
| 30 | } |
| 31 | |
| 32 | sorted := sortedTopologyPortNeighbors(neighbors) |
| 33 | require.Len(t, sorted, 2) |
| 34 | |
| 35 | require.Equal(t, "cdp", sorted[0].Protocol) |
| 36 | require.Equal(t, "switch-b", sorted[0].RemoteDevice) |
| 37 | require.Equal(t, "Gi0/2", sorted[0].RemotePort) |
| 38 | require.Equal(t, "10.0.0.2", sorted[0].RemoteIP) |
| 39 | require.Equal(t, "00:11:22:33:44:55", sorted[0].RemoteChassisID) |
| 40 | require.Equal(t, []string{"bridge", "router"}, sorted[0].RemoteCapabilities) |
| 41 | |
| 42 | require.Equal(t, "lldp", sorted[1].Protocol) |
| 43 | require.Equal(t, "switch-a", sorted[1].RemoteDevice) |
| 44 | require.Equal(t, "Gi0/1", sorted[1].RemotePort) |
| 45 | require.Equal(t, "10.0.0.1", sorted[1].RemoteIP) |
| 46 | require.Equal(t, "aa:bb:cc:dd:ee:ff", sorted[1].RemoteChassisID) |
| 47 | require.Equal(t, []string{"bridge", "router"}, sorted[1].RemoteCapabilities) |
| 48 | } |
| 49 | |
| 50 | func TestBuildTopologyDevicePortStatusAttributes_RendersOptionalFields(t *testing.T) { |
| 51 | status := topologyDevicePortStatus{ |
| 52 | IfIndex: 7, |
| 53 | IfName: "Gi0/7", |
| 54 | IfDescr: "Uplink", |
| 55 | IfAlias: "core", |
| 56 | MAC: "00:11:22:33:44:55", |
| 57 | SpeedBps: 1000000000, |
| 58 | LastChange: 12345, |
| 59 | Duplex: "full", |
| 60 | InterfaceType: "ethernetCsmacd", |
| 61 | AdminStatus: "up", |
| 62 | OperStatus: "up", |
| 63 | LinkMode: "trunk", |
| 64 | ModeConfidence: "high", |
| 65 | ModeSources: []string{"fdb", "stp"}, |
| 66 | VLANIDs: []string{"100", "200"}, |
| 67 | VLANs: []map[string]any{ |
| 68 | {"vlan_id": "100", "tagged": true}, |
| 69 | {"vlan_id": "200", "tagged": true, "vlan_name": "servers"}, |
| 70 | }, |
| 71 | TopologyRole: "switch_facing", |
| 72 | RoleConfidence: "high", |
| 73 | RoleSources: []string{"peer_link", "bridge_link"}, |
| 74 | FDBMACCount: 3, |
| 75 | STPState: "forwarding", |
| 76 | Neighbors: []topologyPortNeighborStatus{ |
| 77 | { |
| 78 | Protocol: "lldp", |
| 79 | RemoteDevice: "switch-b", |
| 80 | RemotePort: "Gi0/1", |
| 81 | RemoteIP: "10.0.0.2", |
| 82 | RemoteChassisID: "aa:bb:cc:dd:ee:ff", |
| 83 | RemoteCapabilities: []string{"bridge", "router"}, |
| 84 | }, |
| 85 | }, |
| 86 | } |
| 87 | |
| 88 | attrs := buildTopologyDevicePortStatusAttributes(status) |
| 89 | require.Equal(t, 7, attrs["if_index"]) |
| 90 | require.Equal(t, "Gi0/7", attrs["if_name"]) |
| 91 | require.Equal(t, "Uplink", attrs["if_descr"]) |
| 92 | require.Equal(t, "core", attrs["if_alias"]) |
| 93 | require.Equal(t, "00:11:22:33:44:55", attrs["mac"]) |
| 94 | require.Equal(t, int64(1000000000), attrs["speed"]) |
| 95 | require.Equal(t, int64(12345), attrs["last_change"]) |
| 96 | require.Equal(t, "full", attrs["duplex"]) |
| 97 | require.Equal(t, "trunk", attrs["link_mode"]) |
| 98 | require.Equal(t, "high", attrs["link_mode_confidence"]) |
| 99 | require.Equal(t, []string{"fdb", "stp"}, attrs["link_mode_sources"]) |
| 100 | require.Equal(t, []string{"100", "200"}, attrs["vlan_ids"]) |
| 101 | require.Equal(t, "switch_facing", attrs["topology_role"]) |
| 102 | require.Equal(t, "high", attrs["topology_role_confidence"]) |
| 103 | require.Equal(t, []string{"peer_link", "bridge_link"}, attrs["topology_role_sources"]) |
| 104 | require.Equal(t, 3, attrs["fdb_mac_count"]) |
| 105 | require.Equal(t, "forwarding", attrs["stp_state"]) |
| 106 | require.Equal(t, "up", attrs["admin_status"]) |
| 107 | require.Equal(t, "up", attrs["oper_status"]) |
| 108 | require.Equal(t, "ethernetCsmacd", attrs["if_type"]) |
| 109 | |
| 110 | neighbors, ok := attrs["neighbors"].([]map[string]any) |
| 111 | require.True(t, ok) |
| 112 | require.Len(t, neighbors, 1) |
| 113 | require.Equal(t, "lldp", neighbors[0]["protocol"]) |
| 114 | require.Equal(t, "switch-b", neighbors[0]["remote_device"]) |
| 115 | require.Equal(t, "Gi0/1", neighbors[0]["remote_port"]) |
| 116 | require.Equal(t, "10.0.0.2", neighbors[0]["remote_ip"]) |
| 117 | require.Equal(t, "aa:bb:cc:dd:ee:ff", neighbors[0]["remote_chassis_id"]) |
| 118 | require.Equal(t, []string{"bridge", "router"}, neighbors[0]["remote_capabilities"]) |
| 119 | |
| 120 | vlans, ok := attrs["vlans"].([]map[string]any) |
| 121 | require.True(t, ok) |
| 122 | require.Len(t, vlans, 2) |
| 123 | require.Equal(t, "100", vlans[0]["vlan_id"]) |
| 124 | require.Equal(t, true, vlans[0]["tagged"]) |
| 125 | require.Equal(t, "200", vlans[1]["vlan_id"]) |
| 126 | require.Equal(t, "servers", vlans[1]["vlan_name"]) |
| 127 | } |