| // Copyright 2013 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| package net | |
| import ( | |
| "reflect" | |
| "testing" | |
| ) | |
| var testInetaddr = func(ip IP) netaddr { return &TCPAddr{IP: ip, Port: 5682} } | |
| var firstFavoriteAddrTests = []struct { | |
| filter func(IP) IP | |
| ips []IP | |
| inetaddr func(IP) netaddr | |
| addr netaddr | |
| err error | |
| }{ | |
| { | |
| nil, | |
| []IP{ | |
| IPv4(127, 0, 0, 1), | |
| IPv6loopback, | |
| }, | |
| testInetaddr, | |
| addrList{ | |
| &TCPAddr{IP: IPv4(127, 0, 0, 1), Port: 5682}, | |
| &TCPAddr{IP: IPv6loopback, Port: 5682}, | |
| }, | |
| nil, | |
| }, | |
| { | |
| nil, | |
| []IP{ | |
| IPv6loopback, | |
| IPv4(127, 0, 0, 1), | |
| }, | |
| testInetaddr, | |
| addrList{ | |
| &TCPAddr{IP: IPv4(127, 0, 0, 1), Port: 5682}, | |
| &TCPAddr{IP: IPv6loopback, Port: 5682}, | |
| }, | |
| nil, | |
| }, | |
| { | |
| nil, | |
| []IP{ | |
| IPv4(127, 0, 0, 1), | |
| IPv4(192, 168, 0, 1), | |
| }, | |
| testInetaddr, | |
| &TCPAddr{IP: IPv4(127, 0, 0, 1), Port: 5682}, | |
| nil, | |
| }, | |
| { | |
| nil, | |
| []IP{ | |
| IPv6loopback, | |
| ParseIP("fe80::1"), | |
| }, | |
| testInetaddr, | |
| &TCPAddr{IP: IPv6loopback, Port: 5682}, | |
| nil, | |
| }, | |
| { | |
| nil, | |
| []IP{ | |
| IPv4(127, 0, 0, 1), | |
| IPv4(192, 168, 0, 1), | |
| IPv6loopback, | |
| ParseIP("fe80::1"), | |
| }, | |
| testInetaddr, | |
| addrList{ | |
| &TCPAddr{IP: IPv4(127, 0, 0, 1), Port: 5682}, | |
| &TCPAddr{IP: IPv6loopback, Port: 5682}, | |
| }, | |
| nil, | |
| }, | |
| { | |
| nil, | |
| []IP{ | |
| IPv6loopback, | |
| ParseIP("fe80::1"), | |
| IPv4(127, 0, 0, 1), | |
| IPv4(192, 168, 0, 1), | |
| }, | |
| testInetaddr, | |
| addrList{ | |
| &TCPAddr{IP: IPv4(127, 0, 0, 1), Port: 5682}, | |
| &TCPAddr{IP: IPv6loopback, Port: 5682}, | |
| }, | |
| nil, | |
| }, | |
| { | |
| nil, | |
| []IP{ | |
| IPv4(127, 0, 0, 1), | |
| IPv6loopback, | |
| IPv4(192, 168, 0, 1), | |
| ParseIP("fe80::1"), | |
| }, | |
| testInetaddr, | |
| addrList{ | |
| &TCPAddr{IP: IPv4(127, 0, 0, 1), Port: 5682}, | |
| &TCPAddr{IP: IPv6loopback, Port: 5682}, | |
| }, | |
| nil, | |
| }, | |
| { | |
| nil, | |
| []IP{ | |
| IPv6loopback, | |
| IPv4(127, 0, 0, 1), | |
| ParseIP("fe80::1"), | |
| IPv4(192, 168, 0, 1), | |
| }, | |
| testInetaddr, | |
| addrList{ | |
| &TCPAddr{IP: IPv4(127, 0, 0, 1), Port: 5682}, | |
| &TCPAddr{IP: IPv6loopback, Port: 5682}, | |
| }, | |
| nil, | |
| }, | |
| { | |
| ipv4only, | |
| []IP{ | |
| IPv4(127, 0, 0, 1), | |
| IPv6loopback, | |
| }, | |
| testInetaddr, | |
| &TCPAddr{IP: IPv4(127, 0, 0, 1), Port: 5682}, | |
| nil, | |
| }, | |
| { | |
| ipv4only, | |
| []IP{ | |
| IPv6loopback, | |
| IPv4(127, 0, 0, 1), | |
| }, | |
| testInetaddr, | |
| &TCPAddr{IP: IPv4(127, 0, 0, 1), Port: 5682}, | |
| nil, | |
| }, | |
| { | |
| ipv6only, | |
| []IP{ | |
| IPv4(127, 0, 0, 1), | |
| IPv6loopback, | |
| }, | |
| testInetaddr, | |
| &TCPAddr{IP: IPv6loopback, Port: 5682}, | |
| nil, | |
| }, | |
| { | |
| ipv6only, | |
| []IP{ | |
| IPv6loopback, | |
| IPv4(127, 0, 0, 1), | |
| }, | |
| testInetaddr, | |
| &TCPAddr{IP: IPv6loopback, Port: 5682}, | |
| nil, | |
| }, | |
| {nil, nil, testInetaddr, nil, errNoSuitableAddress}, | |
| {ipv4only, nil, testInetaddr, nil, errNoSuitableAddress}, | |
| {ipv4only, []IP{IPv6loopback}, testInetaddr, nil, errNoSuitableAddress}, | |
| {ipv6only, nil, testInetaddr, nil, errNoSuitableAddress}, | |
| {ipv6only, []IP{IPv4(127, 0, 0, 1)}, testInetaddr, nil, errNoSuitableAddress}, | |
| } | |
| func TestFirstFavoriteAddr(t *testing.T) { | |
| if !supportsIPv4 || !supportsIPv6 { | |
| t.Skip("ipv4 or ipv6 is not supported") | |
| } | |
| for i, tt := range firstFavoriteAddrTests { | |
| addr, err := firstFavoriteAddr(tt.filter, tt.ips, tt.inetaddr) | |
| if err != tt.err { | |
| t.Errorf("#%v: got %v; expected %v", i, err, tt.err) | |
| } | |
| if !reflect.DeepEqual(addr, tt.addr) { | |
| t.Errorf("#%v: got %v; expected %v", i, addr, tt.addr) | |
| } | |
| } | |
| } |