mirror of
https://github.com/Control-D-Inc/ctrld.git
synced 2026-02-03 22:18:39 +00:00
An interface may have multiple MAC addresses, that leads to the problem when looking up hostname for its multiple <ip, mac> pairs, because the "ip" map, which storing "mac => ip" mapping can only store 1 entry. It ends up returns an empty hostname for a known MAC address. Fixing this by filling empty hostname based on clients which is already listed, ensuring all clients with the same MAC address will have the same hostname information.
75 lines
1.8 KiB
Go
75 lines
1.8 KiB
Go
package clientinfo
|
|
|
|
import (
|
|
"testing"
|
|
)
|
|
|
|
func Test_normalizeIP(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
in string
|
|
want string
|
|
}{
|
|
{"v4", "127.0.0.1", "127.0.0.1"},
|
|
{"v4 with index", "127.0.0.1%lo", "127.0.0.1"},
|
|
{"v6", "fe80::1", "fe80::1"},
|
|
{"v6 with index", "fe80::1%22002", "fe80::1"},
|
|
}
|
|
for _, tc := range tests {
|
|
tc := tc
|
|
t.Run(tc.name, func(t *testing.T) {
|
|
t.Parallel()
|
|
if got := normalizeIP(tc.in); got != tc.want {
|
|
t.Errorf("normalizeIP() = %v, want %v", got, tc.want)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestTable_LookupRFC1918IPv4(t *testing.T) {
|
|
table := &Table{
|
|
dhcp: &dhcp{},
|
|
arp: &arpDiscover{},
|
|
}
|
|
|
|
table.ipResolvers = append(table.ipResolvers, table.dhcp)
|
|
table.ipResolvers = append(table.ipResolvers, table.arp)
|
|
|
|
macAddress := "cc:19:f9:8a:49:e6"
|
|
rfc1918IPv4 := "10.0.10.245"
|
|
table.dhcp.ip.Store(macAddress, "127.0.0.1")
|
|
table.arp.ip.Store(macAddress, rfc1918IPv4)
|
|
|
|
if got := table.LookupRFC1918IPv4(macAddress); got != rfc1918IPv4 {
|
|
t.Fatalf("unexpected result, want: %s, got: %s", rfc1918IPv4, got)
|
|
}
|
|
}
|
|
|
|
func TestTable_ListClients(t *testing.T) {
|
|
mac := "74:56:3c:44:eb:5e"
|
|
ipv6_1 := "2405:4803:a04b:4190:fbe9:cd14:d522:bbae"
|
|
ipv6_2 := "2405:4803:a04b:4190:fbe9:cd14:d522:bbab"
|
|
table := &Table{}
|
|
|
|
// NDP init.
|
|
table.ndp = &ndpDiscover{}
|
|
table.ndp.mac.Store(ipv6_1, mac)
|
|
table.ndp.mac.Store(ipv6_2, mac)
|
|
table.ndp.ip.Store(mac, ipv6_1)
|
|
table.ndp.ip.Store(mac, ipv6_2)
|
|
table.ipResolvers = append(table.ipResolvers, table.ndp)
|
|
table.macResolvers = append(table.macResolvers, table.ndp)
|
|
|
|
hostname := "foo"
|
|
// mdns init.
|
|
table.mdns = &mdns{}
|
|
table.mdns.name.Store(ipv6_2, hostname)
|
|
table.hostnameResolvers = append(table.hostnameResolvers, table.mdns)
|
|
|
|
for _, c := range table.ListClients() {
|
|
if c.Hostname != hostname {
|
|
t.Fatalf("missing hostname for client: %v", c)
|
|
}
|
|
}
|
|
}
|