|  | // Copyright 2012 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. | 
|  |  | 
|  | // This file implements API tests across platforms and will never have a build | 
|  | // tag. | 
|  |  | 
|  | package net | 
|  |  | 
|  | import ( | 
|  | "os" | 
|  | "testing" | 
|  | "time" | 
|  | ) | 
|  |  | 
|  | // The full stack test cases for IPConn have been moved to the | 
|  | // following: | 
|  | //	golang.org/x/net/ipv4 | 
|  | //	golang.org/x/net/ipv6 | 
|  | //	golang.org/x/net/icmp | 
|  |  | 
|  | func packetConnTestData(t *testing.T, network string) ([]byte, func()) { | 
|  | if !testableNetwork(network) { | 
|  | return nil, func() { t.Logf("skipping %s test", network) } | 
|  | } | 
|  | return []byte("PACKETCONN TEST"), nil | 
|  | } | 
|  |  | 
|  | var packetConnTests = []struct { | 
|  | net   string | 
|  | addr1 string | 
|  | addr2 string | 
|  | }{ | 
|  | {"udp", "127.0.0.1:0", "127.0.0.1:0"}, | 
|  | {"unixgram", testUnixAddr(), testUnixAddr()}, | 
|  | } | 
|  |  | 
|  | func TestPacketConn(t *testing.T) { | 
|  | closer := func(c PacketConn, net, addr1, addr2 string) { | 
|  | c.Close() | 
|  | switch net { | 
|  | case "unixgram": | 
|  | os.Remove(addr1) | 
|  | os.Remove(addr2) | 
|  | } | 
|  | } | 
|  |  | 
|  | for _, tt := range packetConnTests { | 
|  | wb, skipOrFatalFn := packetConnTestData(t, tt.net) | 
|  | if skipOrFatalFn != nil { | 
|  | skipOrFatalFn() | 
|  | continue | 
|  | } | 
|  |  | 
|  | c1, err := ListenPacket(tt.net, tt.addr1) | 
|  | if err != nil { | 
|  | t.Fatal(err) | 
|  | } | 
|  | defer closer(c1, tt.net, tt.addr1, tt.addr2) | 
|  | c1.LocalAddr() | 
|  | c1.SetDeadline(time.Now().Add(500 * time.Millisecond)) | 
|  | c1.SetReadDeadline(time.Now().Add(500 * time.Millisecond)) | 
|  | c1.SetWriteDeadline(time.Now().Add(500 * time.Millisecond)) | 
|  |  | 
|  | c2, err := ListenPacket(tt.net, tt.addr2) | 
|  | if err != nil { | 
|  | t.Fatal(err) | 
|  | } | 
|  | defer closer(c2, tt.net, tt.addr1, tt.addr2) | 
|  | c2.LocalAddr() | 
|  | c2.SetDeadline(time.Now().Add(500 * time.Millisecond)) | 
|  | c2.SetReadDeadline(time.Now().Add(500 * time.Millisecond)) | 
|  | c2.SetWriteDeadline(time.Now().Add(500 * time.Millisecond)) | 
|  | rb2 := make([]byte, 128) | 
|  |  | 
|  | if _, err := c1.WriteTo(wb, c2.LocalAddr()); err != nil { | 
|  | t.Fatal(err) | 
|  | } | 
|  | if _, _, err := c2.ReadFrom(rb2); err != nil { | 
|  | t.Fatal(err) | 
|  | } | 
|  | if _, err := c2.WriteTo(wb, c1.LocalAddr()); err != nil { | 
|  | t.Fatal(err) | 
|  | } | 
|  | rb1 := make([]byte, 128) | 
|  | if _, _, err := c1.ReadFrom(rb1); err != nil { | 
|  | t.Fatal(err) | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | func TestConnAndPacketConn(t *testing.T) { | 
|  | closer := func(c PacketConn, net, addr1, addr2 string) { | 
|  | c.Close() | 
|  | switch net { | 
|  | case "unixgram": | 
|  | os.Remove(addr1) | 
|  | os.Remove(addr2) | 
|  | } | 
|  | } | 
|  |  | 
|  | for _, tt := range packetConnTests { | 
|  | var wb []byte | 
|  | wb, skipOrFatalFn := packetConnTestData(t, tt.net) | 
|  | if skipOrFatalFn != nil { | 
|  | skipOrFatalFn() | 
|  | continue | 
|  | } | 
|  |  | 
|  | c1, err := ListenPacket(tt.net, tt.addr1) | 
|  | if err != nil { | 
|  | t.Fatal(err) | 
|  | } | 
|  | defer closer(c1, tt.net, tt.addr1, tt.addr2) | 
|  | c1.LocalAddr() | 
|  | c1.SetDeadline(time.Now().Add(500 * time.Millisecond)) | 
|  | c1.SetReadDeadline(time.Now().Add(500 * time.Millisecond)) | 
|  | c1.SetWriteDeadline(time.Now().Add(500 * time.Millisecond)) | 
|  |  | 
|  | c2, err := Dial(tt.net, c1.LocalAddr().String()) | 
|  | if err != nil { | 
|  | t.Fatal(err) | 
|  | } | 
|  | defer c2.Close() | 
|  | c2.LocalAddr() | 
|  | c2.RemoteAddr() | 
|  | c2.SetDeadline(time.Now().Add(500 * time.Millisecond)) | 
|  | c2.SetReadDeadline(time.Now().Add(500 * time.Millisecond)) | 
|  | c2.SetWriteDeadline(time.Now().Add(500 * time.Millisecond)) | 
|  |  | 
|  | if _, err := c2.Write(wb); err != nil { | 
|  | t.Fatal(err) | 
|  | } | 
|  | rb1 := make([]byte, 128) | 
|  | if _, _, err := c1.ReadFrom(rb1); err != nil { | 
|  | t.Fatal(err) | 
|  | } | 
|  | var dst Addr | 
|  | switch tt.net { | 
|  | case "unixgram": | 
|  | continue | 
|  | default: | 
|  | dst = c2.LocalAddr() | 
|  | } | 
|  | if _, err := c1.WriteTo(wb, dst); err != nil { | 
|  | t.Fatal(err) | 
|  | } | 
|  | rb2 := make([]byte, 128) | 
|  | if _, err := c2.Read(rb2); err != nil { | 
|  | t.Fatal(err) | 
|  | } | 
|  | } | 
|  | } |