// 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) } } }