1// Copyright 2012 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// This file implements API tests across platforms and should never have a build 6// constraint. 7 8package net 9 10import ( 11 "os" 12 "testing" 13) 14 15// The full stack test cases for IPConn have been moved to the 16// following: 17// golang.org/x/net/ipv4 18// golang.org/x/net/ipv6 19// golang.org/x/net/icmp 20 21func packetConnTestData(t *testing.T, network string) ([]byte, func()) { 22 if !testableNetwork(network) { 23 return nil, func() { t.Logf("skipping %s test", network) } 24 } 25 return []byte("PACKETCONN TEST"), nil 26} 27 28func TestPacketConn(t *testing.T) { 29 var packetConnTests = []struct { 30 net string 31 addr1 string 32 addr2 string 33 }{ 34 {"udp", "127.0.0.1:0", "127.0.0.1:0"}, 35 {"unixgram", testUnixAddr(t), testUnixAddr(t)}, 36 } 37 38 closer := func(c PacketConn, net, addr1, addr2 string) { 39 c.Close() 40 switch net { 41 case "unixgram": 42 os.Remove(addr1) 43 os.Remove(addr2) 44 } 45 } 46 47 for _, tt := range packetConnTests { 48 wb, skipOrFatalFn := packetConnTestData(t, tt.net) 49 if skipOrFatalFn != nil { 50 skipOrFatalFn() 51 continue 52 } 53 54 c1, err := ListenPacket(tt.net, tt.addr1) 55 if err != nil { 56 t.Fatal(err) 57 } 58 defer closer(c1, tt.net, tt.addr1, tt.addr2) 59 c1.LocalAddr() 60 61 c2, err := ListenPacket(tt.net, tt.addr2) 62 if err != nil { 63 t.Fatal(err) 64 } 65 defer closer(c2, tt.net, tt.addr1, tt.addr2) 66 c2.LocalAddr() 67 rb2 := make([]byte, 128) 68 69 if _, err := c1.WriteTo(wb, c2.LocalAddr()); err != nil { 70 t.Fatal(err) 71 } 72 if _, _, err := c2.ReadFrom(rb2); err != nil { 73 t.Fatal(err) 74 } 75 if _, err := c2.WriteTo(wb, c1.LocalAddr()); err != nil { 76 t.Fatal(err) 77 } 78 rb1 := make([]byte, 128) 79 if _, _, err := c1.ReadFrom(rb1); err != nil { 80 t.Fatal(err) 81 } 82 } 83} 84 85func TestConnAndPacketConn(t *testing.T) { 86 var packetConnTests = []struct { 87 net string 88 addr1 string 89 addr2 string 90 }{ 91 {"udp", "127.0.0.1:0", "127.0.0.1:0"}, 92 {"unixgram", testUnixAddr(t), testUnixAddr(t)}, 93 } 94 95 closer := func(c PacketConn, net, addr1, addr2 string) { 96 c.Close() 97 switch net { 98 case "unixgram": 99 os.Remove(addr1) 100 os.Remove(addr2) 101 } 102 } 103 104 for _, tt := range packetConnTests { 105 var wb []byte 106 wb, skipOrFatalFn := packetConnTestData(t, tt.net) 107 if skipOrFatalFn != nil { 108 skipOrFatalFn() 109 continue 110 } 111 112 c1, err := ListenPacket(tt.net, tt.addr1) 113 if err != nil { 114 t.Fatal(err) 115 } 116 defer closer(c1, tt.net, tt.addr1, tt.addr2) 117 c1.LocalAddr() 118 119 c2, err := Dial(tt.net, c1.LocalAddr().String()) 120 if err != nil { 121 t.Fatal(err) 122 } 123 defer c2.Close() 124 c2.LocalAddr() 125 c2.RemoteAddr() 126 127 if _, err := c2.Write(wb); err != nil { 128 t.Fatal(err) 129 } 130 rb1 := make([]byte, 128) 131 if _, _, err := c1.ReadFrom(rb1); err != nil { 132 t.Fatal(err) 133 } 134 var dst Addr 135 switch tt.net { 136 case "unixgram": 137 continue 138 default: 139 dst = c2.LocalAddr() 140 } 141 if _, err := c1.WriteTo(wb, dst); err != nil { 142 t.Fatal(err) 143 } 144 rb2 := make([]byte, 128) 145 if _, err := c2.Read(rb2); err != nil { 146 t.Fatal(err) 147 } 148 } 149} 150