github.com/ethereum/go-ethereum@v1.16.1/p2p/netutil/addrutil_test.go (about) 1 // Copyright 2024 The go-ethereum Authors 2 // This file is part of the go-ethereum library. 3 // 4 // The go-ethereum library is free software: you can redistribute it and/or modify 5 // it under the terms of the GNU Lesser General Public License as published by 6 // the Free Software Foundation, either version 3 of the License, or 7 // (at your option) any later version. 8 // 9 // The go-ethereum library is distributed in the hope that it will be useful, 10 // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 // GNU Lesser General Public License for more details. 13 // 14 // You should have received a copy of the GNU Lesser General Public License 15 // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>. 16 17 package netutil 18 19 import ( 20 "net" 21 "net/netip" 22 "path/filepath" 23 "testing" 24 ) 25 26 // customNetAddr is a custom implementation of net.Addr for testing purposes. 27 type customNetAddr struct{} 28 29 func (c *customNetAddr) Network() string { return "custom" } 30 func (c *customNetAddr) String() string { return "custom" } 31 32 func TestAddrAddr(t *testing.T) { 33 tempDir := t.TempDir() 34 tests := []struct { 35 name string 36 addr net.Addr 37 want netip.Addr 38 }{ 39 { 40 name: "IPAddr IPv4", 41 addr: &net.IPAddr{IP: net.ParseIP("192.0.2.1")}, 42 want: netip.MustParseAddr("192.0.2.1"), 43 }, 44 { 45 name: "IPAddr IPv6", 46 addr: &net.IPAddr{IP: net.ParseIP("2001:db8::1")}, 47 want: netip.MustParseAddr("2001:db8::1"), 48 }, 49 { 50 name: "TCPAddr IPv4", 51 addr: &net.TCPAddr{IP: net.ParseIP("192.0.2.1"), Port: 8080}, 52 want: netip.MustParseAddr("192.0.2.1"), 53 }, 54 { 55 name: "TCPAddr IPv6", 56 addr: &net.TCPAddr{IP: net.ParseIP("2001:db8::1"), Port: 8080}, 57 want: netip.MustParseAddr("2001:db8::1"), 58 }, 59 { 60 name: "UDPAddr IPv4", 61 addr: &net.UDPAddr{IP: net.ParseIP("192.0.2.1"), Port: 8080}, 62 want: netip.MustParseAddr("192.0.2.1"), 63 }, 64 { 65 name: "UDPAddr IPv6", 66 addr: &net.UDPAddr{IP: net.ParseIP("2001:db8::1"), Port: 8080}, 67 want: netip.MustParseAddr("2001:db8::1"), 68 }, 69 { 70 name: "Unsupported Addr type", 71 addr: &net.UnixAddr{Name: filepath.Join(tempDir, "test.sock"), Net: "unix"}, 72 want: netip.Addr{}, 73 }, 74 { 75 name: "Nil input", 76 addr: nil, 77 want: netip.Addr{}, 78 }, 79 { 80 name: "Custom net.Addr implementation", 81 addr: &customNetAddr{}, 82 want: netip.Addr{}, 83 }, 84 } 85 86 for _, tt := range tests { 87 t.Run(tt.name, func(t *testing.T) { 88 if got := AddrAddr(tt.addr); got != tt.want { 89 t.Errorf("AddrAddr() = %v, want %v", got, tt.want) 90 } 91 }) 92 } 93 } 94 95 func TestIPToAddr(t *testing.T) { 96 tests := []struct { 97 name string 98 ip net.IP 99 want netip.Addr 100 }{ 101 { 102 name: "IPv4", 103 ip: net.ParseIP("192.0.2.1"), 104 want: netip.MustParseAddr("192.0.2.1"), 105 }, 106 { 107 name: "IPv6", 108 ip: net.ParseIP("2001:db8::1"), 109 want: netip.MustParseAddr("2001:db8::1"), 110 }, 111 { 112 name: "Invalid IP", 113 ip: net.IP{1, 2, 3}, 114 want: netip.Addr{}, 115 }, 116 { 117 name: "Invalid IP (5 octets)", 118 ip: net.IP{192, 0, 2, 1, 1}, 119 want: netip.Addr{}, 120 }, 121 { 122 name: "IPv4-mapped IPv6", 123 ip: net.ParseIP("::ffff:192.0.2.1"), 124 want: netip.MustParseAddr("192.0.2.1"), 125 }, 126 { 127 name: "Nil input", 128 ip: nil, 129 want: netip.Addr{}, 130 }, 131 } 132 133 for _, tt := range tests { 134 t.Run(tt.name, func(t *testing.T) { 135 if got := IPToAddr(tt.ip); got != tt.want { 136 t.Errorf("IPToAddr() = %v, want %v", got, tt.want) 137 } 138 }) 139 } 140 }