blob: e31894abf73e9b3cdffff51ac61b510149548d06 [file] [log] [blame]
Mikio Hara518331d2011-06-03 14:35:42 -04001// Copyright 2011 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package net
6
7import (
Mikio Haracd81db82013-02-25 23:05:40 +09008 "reflect"
Mikio Hara518331d2011-06-03 14:35:42 -04009 "testing"
10)
11
Mikio Haracd81db82013-02-25 23:05:40 +090012// loopbackInterface returns an available logical network interface
13// for loopback tests. It returns nil if no suitable interface is
14// found.
Mikio Hara0ad88a42013-02-22 01:19:04 +090015func loopbackInterface() *Interface {
16 ift, err := Interfaces()
17 if err != nil {
18 return nil
19 }
20 for _, ifi := range ift {
21 if ifi.Flags&FlagLoopback != 0 && ifi.Flags&FlagUp != 0 {
22 return &ifi
23 }
24 }
25 return nil
26}
27
Mikio Haraaa0dda72013-03-23 09:57:40 +090028// ipv6LinkLocalUnicastAddr returns an IPv6 link-local unicast address
29// on the given network interface for tests. It returns "" if no
30// suitable address is found.
31func ipv6LinkLocalUnicastAddr(ifi *Interface) string {
32 if ifi == nil {
33 return ""
34 }
35 ifat, err := ifi.Addrs()
36 if err != nil {
37 return ""
38 }
39 for _, ifa := range ifat {
40 switch ifa := ifa.(type) {
41 case *IPAddr:
42 if ifa.IP.To4() == nil && ifa.IP.IsLinkLocalUnicast() {
43 return ifa.IP.String()
44 }
45 case *IPNet:
46 if ifa.IP.To4() == nil && ifa.IP.IsLinkLocalUnicast() {
47 return ifa.IP.String()
48 }
49 }
50 }
51 return ""
52}
53
Mikio Hara518331d2011-06-03 14:35:42 -040054func TestInterfaces(t *testing.T) {
55 ift, err := Interfaces()
56 if err != nil {
Mikio Hara83610562011-12-21 21:39:00 +090057 t.Fatalf("Interfaces failed: %v", err)
Mikio Hara518331d2011-06-03 14:35:42 -040058 }
Mikio Hara3a112a82012-07-22 01:49:58 +090059 t.Logf("table: len/cap = %v/%v", len(ift), cap(ift))
Mikio Hara518331d2011-06-03 14:35:42 -040060
61 for _, ifi := range ift {
62 ifxi, err := InterfaceByIndex(ifi.Index)
63 if err != nil {
Mikio Hara0ad88a42013-02-22 01:19:04 +090064 t.Fatalf("InterfaceByIndex(%v) failed: %v", ifi.Index, err)
Mikio Hara518331d2011-06-03 14:35:42 -040065 }
Mikio Haracd81db82013-02-25 23:05:40 +090066 if !reflect.DeepEqual(ifxi, &ifi) {
67 t.Fatalf("InterfaceByIndex(%v) = %v, want %v", ifi.Index, ifxi, ifi)
Mikio Hara518331d2011-06-03 14:35:42 -040068 }
69 ifxn, err := InterfaceByName(ifi.Name)
70 if err != nil {
Mikio Hara97653252012-02-23 06:26:31 +090071 t.Fatalf("InterfaceByName(%q) failed: %v", ifi.Name, err)
Mikio Hara518331d2011-06-03 14:35:42 -040072 }
Mikio Haracd81db82013-02-25 23:05:40 +090073 if !reflect.DeepEqual(ifxn, &ifi) {
74 t.Fatalf("InterfaceByName(%q) = %v, want %v", ifi.Name, ifxn, ifi)
Mikio Hara518331d2011-06-03 14:35:42 -040075 }
Mikio Hara3a112a82012-07-22 01:49:58 +090076 t.Logf("%q: flags %q, ifindex %v, mtu %v", ifi.Name, ifi.Flags.String(), ifi.Index, ifi.MTU)
Mikio Harac4dfc552011-06-14 13:32:52 -040077 t.Logf("\thardware address %q", ifi.HardwareAddr.String())
Mikio Hara83610562011-12-21 21:39:00 +090078 testInterfaceAddrs(t, &ifi)
79 testInterfaceMulticastAddrs(t, &ifi)
Mikio Hara518331d2011-06-03 14:35:42 -040080 }
81}
82
83func TestInterfaceAddrs(t *testing.T) {
84 ifat, err := InterfaceAddrs()
85 if err != nil {
Mikio Hara83610562011-12-21 21:39:00 +090086 t.Fatalf("InterfaceAddrs failed: %v", err)
Mikio Hara518331d2011-06-03 14:35:42 -040087 }
Mikio Hara3a112a82012-07-22 01:49:58 +090088 t.Logf("table: len/cap = %v/%v", len(ifat), cap(ifat))
Mikio Hara83610562011-12-21 21:39:00 +090089 testAddrs(t, ifat)
90}
Mikio Hara518331d2011-06-03 14:35:42 -040091
Mikio Hara83610562011-12-21 21:39:00 +090092func testInterfaceAddrs(t *testing.T, ifi *Interface) {
93 ifat, err := ifi.Addrs()
94 if err != nil {
95 t.Fatalf("Interface.Addrs failed: %v", err)
96 }
97 testAddrs(t, ifat)
98}
99
100func testInterfaceMulticastAddrs(t *testing.T, ifi *Interface) {
101 ifmat, err := ifi.MulticastAddrs()
102 if err != nil {
103 t.Fatalf("Interface.MulticastAddrs failed: %v", err)
104 }
105 testMulticastAddrs(t, ifmat)
106}
107
108func testAddrs(t *testing.T, ifat []Addr) {
Mikio Hara518331d2011-06-03 14:35:42 -0400109 for _, ifa := range ifat {
Mikio Haraaa0dda72013-03-23 09:57:40 +0900110 switch ifa := ifa.(type) {
Mikio Hara83610562011-12-21 21:39:00 +0900111 case *IPAddr, *IPNet:
Mikio Haraaa0dda72013-03-23 09:57:40 +0900112 if ifa == nil {
Mikio Hara12e73972013-01-23 07:11:22 +0900113 t.Errorf("\tunexpected value: %v", ifa)
114 } else {
115 t.Logf("\tinterface address %q", ifa.String())
116 }
Mikio Hara83610562011-12-21 21:39:00 +0900117 default:
118 t.Errorf("\tunexpected type: %T", ifa)
119 }
120 }
121}
122
123func testMulticastAddrs(t *testing.T, ifmat []Addr) {
124 for _, ifma := range ifmat {
Mikio Haraaa0dda72013-03-23 09:57:40 +0900125 switch ifma := ifma.(type) {
Mikio Hara83610562011-12-21 21:39:00 +0900126 case *IPAddr:
Mikio Haraaa0dda72013-03-23 09:57:40 +0900127 if ifma == nil {
Mikio Hara12e73972013-01-23 07:11:22 +0900128 t.Errorf("\tunexpected value: %v", ifma)
129 } else {
130 t.Logf("\tjoined group address %q", ifma.String())
131 }
Mikio Hara83610562011-12-21 21:39:00 +0900132 default:
133 t.Errorf("\tunexpected type: %T", ifma)
134 }
Mikio Hara518331d2011-06-03 14:35:42 -0400135 }
136}
Mikio Hara0ad88a42013-02-22 01:19:04 +0900137
138func BenchmarkInterfaces(b *testing.B) {
139 for i := 0; i < b.N; i++ {
140 if _, err := Interfaces(); err != nil {
141 b.Fatalf("Interfaces failed: %v", err)
142 }
143 }
144}
145
146func BenchmarkInterfaceByIndex(b *testing.B) {
147 ifi := loopbackInterface()
148 if ifi == nil {
Mikio Haracd81db82013-02-25 23:05:40 +0900149 b.Skip("loopback interface not found")
Mikio Hara0ad88a42013-02-22 01:19:04 +0900150 }
151 for i := 0; i < b.N; i++ {
152 if _, err := InterfaceByIndex(ifi.Index); err != nil {
153 b.Fatalf("InterfaceByIndex failed: %v", err)
154 }
155 }
156}
157
158func BenchmarkInterfaceByName(b *testing.B) {
159 ifi := loopbackInterface()
160 if ifi == nil {
Mikio Haracd81db82013-02-25 23:05:40 +0900161 b.Skip("loopback interface not found")
Mikio Hara0ad88a42013-02-22 01:19:04 +0900162 }
163 for i := 0; i < b.N; i++ {
164 if _, err := InterfaceByName(ifi.Name); err != nil {
165 b.Fatalf("InterfaceByName failed: %v", err)
166 }
167 }
168}
169
170func BenchmarkInterfaceAddrs(b *testing.B) {
171 for i := 0; i < b.N; i++ {
172 if _, err := InterfaceAddrs(); err != nil {
173 b.Fatalf("InterfaceAddrs failed: %v", err)
174 }
175 }
176}
177
178func BenchmarkInterfacesAndAddrs(b *testing.B) {
179 ifi := loopbackInterface()
180 if ifi == nil {
Mikio Haracd81db82013-02-25 23:05:40 +0900181 b.Skip("loopback interface not found")
Mikio Hara0ad88a42013-02-22 01:19:04 +0900182 }
183 for i := 0; i < b.N; i++ {
184 if _, err := ifi.Addrs(); err != nil {
185 b.Fatalf("Interface.Addrs failed: %v", err)
186 }
187 }
188}
189
190func BenchmarkInterfacesAndMulticastAddrs(b *testing.B) {
191 ifi := loopbackInterface()
192 if ifi == nil {
Mikio Haracd81db82013-02-25 23:05:40 +0900193 b.Skip("loopback interface not found")
Mikio Hara0ad88a42013-02-22 01:19:04 +0900194 }
195 for i := 0; i < b.N; i++ {
196 if _, err := ifi.MulticastAddrs(); err != nil {
197 b.Fatalf("Interface.MulticastAddrs failed: %v", err)
198 }
199 }
200}