Mikio Hara | 518331d | 2011-06-03 14:35:42 -0400 | [diff] [blame] | 1 | // 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 | |
| 5 | package net |
| 6 | |
| 7 | import ( |
Mikio Hara | cd81db8 | 2013-02-25 23:05:40 +0900 | [diff] [blame] | 8 | "reflect" |
Mikio Hara | 518331d | 2011-06-03 14:35:42 -0400 | [diff] [blame] | 9 | "testing" |
| 10 | ) |
| 11 | |
Mikio Hara | cd81db8 | 2013-02-25 23:05:40 +0900 | [diff] [blame] | 12 | // loopbackInterface returns an available logical network interface |
| 13 | // for loopback tests. It returns nil if no suitable interface is |
| 14 | // found. |
Mikio Hara | 0ad88a4 | 2013-02-22 01:19:04 +0900 | [diff] [blame] | 15 | func 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 Hara | aa0dda7 | 2013-03-23 09:57:40 +0900 | [diff] [blame^] | 28 | // 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. |
| 31 | func 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 Hara | 518331d | 2011-06-03 14:35:42 -0400 | [diff] [blame] | 54 | func TestInterfaces(t *testing.T) { |
| 55 | ift, err := Interfaces() |
| 56 | if err != nil { |
Mikio Hara | 8361056 | 2011-12-21 21:39:00 +0900 | [diff] [blame] | 57 | t.Fatalf("Interfaces failed: %v", err) |
Mikio Hara | 518331d | 2011-06-03 14:35:42 -0400 | [diff] [blame] | 58 | } |
Mikio Hara | 3a112a8 | 2012-07-22 01:49:58 +0900 | [diff] [blame] | 59 | t.Logf("table: len/cap = %v/%v", len(ift), cap(ift)) |
Mikio Hara | 518331d | 2011-06-03 14:35:42 -0400 | [diff] [blame] | 60 | |
| 61 | for _, ifi := range ift { |
| 62 | ifxi, err := InterfaceByIndex(ifi.Index) |
| 63 | if err != nil { |
Mikio Hara | 0ad88a4 | 2013-02-22 01:19:04 +0900 | [diff] [blame] | 64 | t.Fatalf("InterfaceByIndex(%v) failed: %v", ifi.Index, err) |
Mikio Hara | 518331d | 2011-06-03 14:35:42 -0400 | [diff] [blame] | 65 | } |
Mikio Hara | cd81db8 | 2013-02-25 23:05:40 +0900 | [diff] [blame] | 66 | if !reflect.DeepEqual(ifxi, &ifi) { |
| 67 | t.Fatalf("InterfaceByIndex(%v) = %v, want %v", ifi.Index, ifxi, ifi) |
Mikio Hara | 518331d | 2011-06-03 14:35:42 -0400 | [diff] [blame] | 68 | } |
| 69 | ifxn, err := InterfaceByName(ifi.Name) |
| 70 | if err != nil { |
Mikio Hara | 9765325 | 2012-02-23 06:26:31 +0900 | [diff] [blame] | 71 | t.Fatalf("InterfaceByName(%q) failed: %v", ifi.Name, err) |
Mikio Hara | 518331d | 2011-06-03 14:35:42 -0400 | [diff] [blame] | 72 | } |
Mikio Hara | cd81db8 | 2013-02-25 23:05:40 +0900 | [diff] [blame] | 73 | if !reflect.DeepEqual(ifxn, &ifi) { |
| 74 | t.Fatalf("InterfaceByName(%q) = %v, want %v", ifi.Name, ifxn, ifi) |
Mikio Hara | 518331d | 2011-06-03 14:35:42 -0400 | [diff] [blame] | 75 | } |
Mikio Hara | 3a112a8 | 2012-07-22 01:49:58 +0900 | [diff] [blame] | 76 | t.Logf("%q: flags %q, ifindex %v, mtu %v", ifi.Name, ifi.Flags.String(), ifi.Index, ifi.MTU) |
Mikio Hara | c4dfc55 | 2011-06-14 13:32:52 -0400 | [diff] [blame] | 77 | t.Logf("\thardware address %q", ifi.HardwareAddr.String()) |
Mikio Hara | 8361056 | 2011-12-21 21:39:00 +0900 | [diff] [blame] | 78 | testInterfaceAddrs(t, &ifi) |
| 79 | testInterfaceMulticastAddrs(t, &ifi) |
Mikio Hara | 518331d | 2011-06-03 14:35:42 -0400 | [diff] [blame] | 80 | } |
| 81 | } |
| 82 | |
| 83 | func TestInterfaceAddrs(t *testing.T) { |
| 84 | ifat, err := InterfaceAddrs() |
| 85 | if err != nil { |
Mikio Hara | 8361056 | 2011-12-21 21:39:00 +0900 | [diff] [blame] | 86 | t.Fatalf("InterfaceAddrs failed: %v", err) |
Mikio Hara | 518331d | 2011-06-03 14:35:42 -0400 | [diff] [blame] | 87 | } |
Mikio Hara | 3a112a8 | 2012-07-22 01:49:58 +0900 | [diff] [blame] | 88 | t.Logf("table: len/cap = %v/%v", len(ifat), cap(ifat)) |
Mikio Hara | 8361056 | 2011-12-21 21:39:00 +0900 | [diff] [blame] | 89 | testAddrs(t, ifat) |
| 90 | } |
Mikio Hara | 518331d | 2011-06-03 14:35:42 -0400 | [diff] [blame] | 91 | |
Mikio Hara | 8361056 | 2011-12-21 21:39:00 +0900 | [diff] [blame] | 92 | func 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 | |
| 100 | func 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 | |
| 108 | func testAddrs(t *testing.T, ifat []Addr) { |
Mikio Hara | 518331d | 2011-06-03 14:35:42 -0400 | [diff] [blame] | 109 | for _, ifa := range ifat { |
Mikio Hara | aa0dda7 | 2013-03-23 09:57:40 +0900 | [diff] [blame^] | 110 | switch ifa := ifa.(type) { |
Mikio Hara | 8361056 | 2011-12-21 21:39:00 +0900 | [diff] [blame] | 111 | case *IPAddr, *IPNet: |
Mikio Hara | aa0dda7 | 2013-03-23 09:57:40 +0900 | [diff] [blame^] | 112 | if ifa == nil { |
Mikio Hara | 12e7397 | 2013-01-23 07:11:22 +0900 | [diff] [blame] | 113 | t.Errorf("\tunexpected value: %v", ifa) |
| 114 | } else { |
| 115 | t.Logf("\tinterface address %q", ifa.String()) |
| 116 | } |
Mikio Hara | 8361056 | 2011-12-21 21:39:00 +0900 | [diff] [blame] | 117 | default: |
| 118 | t.Errorf("\tunexpected type: %T", ifa) |
| 119 | } |
| 120 | } |
| 121 | } |
| 122 | |
| 123 | func testMulticastAddrs(t *testing.T, ifmat []Addr) { |
| 124 | for _, ifma := range ifmat { |
Mikio Hara | aa0dda7 | 2013-03-23 09:57:40 +0900 | [diff] [blame^] | 125 | switch ifma := ifma.(type) { |
Mikio Hara | 8361056 | 2011-12-21 21:39:00 +0900 | [diff] [blame] | 126 | case *IPAddr: |
Mikio Hara | aa0dda7 | 2013-03-23 09:57:40 +0900 | [diff] [blame^] | 127 | if ifma == nil { |
Mikio Hara | 12e7397 | 2013-01-23 07:11:22 +0900 | [diff] [blame] | 128 | t.Errorf("\tunexpected value: %v", ifma) |
| 129 | } else { |
| 130 | t.Logf("\tjoined group address %q", ifma.String()) |
| 131 | } |
Mikio Hara | 8361056 | 2011-12-21 21:39:00 +0900 | [diff] [blame] | 132 | default: |
| 133 | t.Errorf("\tunexpected type: %T", ifma) |
| 134 | } |
Mikio Hara | 518331d | 2011-06-03 14:35:42 -0400 | [diff] [blame] | 135 | } |
| 136 | } |
Mikio Hara | 0ad88a4 | 2013-02-22 01:19:04 +0900 | [diff] [blame] | 137 | |
| 138 | func 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 | |
| 146 | func BenchmarkInterfaceByIndex(b *testing.B) { |
| 147 | ifi := loopbackInterface() |
| 148 | if ifi == nil { |
Mikio Hara | cd81db8 | 2013-02-25 23:05:40 +0900 | [diff] [blame] | 149 | b.Skip("loopback interface not found") |
Mikio Hara | 0ad88a4 | 2013-02-22 01:19:04 +0900 | [diff] [blame] | 150 | } |
| 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 | |
| 158 | func BenchmarkInterfaceByName(b *testing.B) { |
| 159 | ifi := loopbackInterface() |
| 160 | if ifi == nil { |
Mikio Hara | cd81db8 | 2013-02-25 23:05:40 +0900 | [diff] [blame] | 161 | b.Skip("loopback interface not found") |
Mikio Hara | 0ad88a4 | 2013-02-22 01:19:04 +0900 | [diff] [blame] | 162 | } |
| 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 | |
| 170 | func 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 | |
| 178 | func BenchmarkInterfacesAndAddrs(b *testing.B) { |
| 179 | ifi := loopbackInterface() |
| 180 | if ifi == nil { |
Mikio Hara | cd81db8 | 2013-02-25 23:05:40 +0900 | [diff] [blame] | 181 | b.Skip("loopback interface not found") |
Mikio Hara | 0ad88a4 | 2013-02-22 01:19:04 +0900 | [diff] [blame] | 182 | } |
| 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 | |
| 190 | func BenchmarkInterfacesAndMulticastAddrs(b *testing.B) { |
| 191 | ifi := loopbackInterface() |
| 192 | if ifi == nil { |
Mikio Hara | cd81db8 | 2013-02-25 23:05:40 +0900 | [diff] [blame] | 193 | b.Skip("loopback interface not found") |
Mikio Hara | 0ad88a4 | 2013-02-22 01:19:04 +0900 | [diff] [blame] | 194 | } |
| 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 | } |