diff options
Diffstat (limited to '')
-rw-r--r-- | src/net/packetconn_test.go | 155 |
1 files changed, 155 insertions, 0 deletions
diff --git a/src/net/packetconn_test.go b/src/net/packetconn_test.go new file mode 100644 index 0000000..a377d33 --- /dev/null +++ b/src/net/packetconn_test.go @@ -0,0 +1,155 @@ +// 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. + +// +build !js + +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) + } + } +} |