package hashable import ( "net" "net/netip" "testing" "gotest.tools/v3/assert" is "gotest.tools/v3/assert/cmp" ) // Assert that the types are hashable. var ( _ map[MACAddr]bool _ map[IPMAC]bool ) func TestMACAddrFrom6(t *testing.T) { want := [6]byte{0x01, 0x02, 0x03, 0x04, 0x05, 0x06} assert.DeepEqual(t, MACAddrFrom6(want).AsSlice(), want[:]) } func TestMACAddrFromSlice(t *testing.T) { mac, ok := MACAddrFromSlice(net.HardwareAddr{0x01, 0x02, 0x03, 0x04, 0x05, 0x06}) assert.Check(t, ok) assert.Check(t, is.DeepEqual(mac.AsSlice(), []byte{0x01, 0x02, 0x03, 0x04, 0x05, 0x06})) // Invalid length for _, tc := range [][]byte{ {0x01, 0x02, 0x03, 0x04, 0x05}, {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}, {}, nil, } { mac, ok = MACAddrFromSlice(net.HardwareAddr(tc)) assert.Check(t, !ok, "want MACAddrFromSlice(%#v) ok=false, got true", tc) assert.Check(t, is.DeepEqual(mac.AsSlice(), []byte{0, 0, 0, 0, 0, 0}), "want MACAddrFromSlice(%#v) = %#v, got %#v", tc, []byte{0, 0, 0, 0, 0, 0}, mac.AsSlice()) } } func TestParseMAC(t *testing.T) { mac, err := ParseMAC("01:02:03:04:05:06") assert.Check(t, err) assert.Check(t, is.DeepEqual(mac.AsSlice(), []byte{0x01, 0x02, 0x03, 0x04, 0x05, 0x06})) // Invalid MAC address _, err = ParseMAC("01:02:03:04:05:06:07:08") assert.Check(t, is.ErrorContains(err, "not a MAC-48 address")) } func TestMACAddr_String(t *testing.T) { mac := MACAddrFrom6([6]byte{0x01, 0x02, 0x03, 0x04, 0x05, 0x06}) assert.Check(t, is.Equal(mac.String(), "01:02:03:04:05:06")) assert.Check(t, is.Equal(MACAddr(0).String(), "00:00:00:00:00:00")) } func TestIPMACFrom(t *testing.T) { assert.Check(t, is.Equal(IPMACFrom(netip.Addr{}, 0), IPMAC{})) ipm := IPMACFrom( netip.MustParseAddr("11.22.33.44"), MACAddrFrom6([6]byte{0x01, 0x02, 0x03, 0x04, 0x05, 0x06}), ) assert.Check(t, is.Equal(ipm.IP(), netip.MustParseAddr("11.22.33.44"))) assert.Check(t, is.Equal(ipm.MAC(), MACAddrFrom6([6]byte{0x01, 0x02, 0x03, 0x04, 0x05, 0x06}))) }