discovery_test.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. package discovery
  2. import (
  3. "net"
  4. "testing"
  5. )
  6. func TestBestSourceIPForRemoteUsesMostSpecificMatchingSubnet(t *testing.T) {
  7. addresses := []net.Addr{
  8. mustIPNet(t, "169.254.101.3/16"),
  9. mustIPNet(t, "192.168.229.138/24"),
  10. }
  11. actual := bestSourceIPForRemote(addresses, net.ParseIP("192.168.229.1"))
  12. if actual == nil || actual.String() != "192.168.229.138" {
  13. t.Fatalf("expected source 192.168.229.138, got %v", actual)
  14. }
  15. }
  16. func TestBestSourceIPForRemoteUsesLinkLocalAddressForLinkLocalClient(t *testing.T) {
  17. addresses := []net.Addr{
  18. mustIPNet(t, "169.254.101.3/16"),
  19. mustIPNet(t, "192.168.229.138/24"),
  20. }
  21. actual := bestSourceIPForRemote(addresses, net.ParseIP("169.254.100.1"))
  22. if actual == nil || actual.String() != "169.254.101.3" {
  23. t.Fatalf("expected source 169.254.101.3, got %v", actual)
  24. }
  25. }
  26. func TestBestSourceIPForRemoteReturnsNilWithoutMatchingSubnet(t *testing.T) {
  27. addresses := []net.Addr{mustIPNet(t, "169.254.101.3/16")}
  28. if actual := bestSourceIPForRemote(addresses, net.ParseIP("192.168.229.1")); actual != nil {
  29. t.Fatalf("expected no matching source, got %v", actual)
  30. }
  31. }
  32. func TestBroadcastResponseTargetUsesRequesterPort(t *testing.T) {
  33. remote := &net.UDPAddr{IP: net.ParseIP("192.168.44.1"), Port: 55869}
  34. target := broadcastResponseTarget(remote)
  35. if !target.IP.Equal(net.IPv4bcast) || target.Port != remote.Port {
  36. t.Fatalf("expected 255.255.255.255:%d, got %s", remote.Port, target)
  37. }
  38. }
  39. func mustIPNet(t *testing.T, cidr string) *net.IPNet {
  40. t.Helper()
  41. ip, network, err := net.ParseCIDR(cidr)
  42. if err != nil {
  43. t.Fatal(err)
  44. }
  45. network.IP = ip
  46. return network
  47. }