2011-03-25 14:42:25 -04:00
|
|
|
// Copyright 2011 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.
|
|
|
|
|
|
|
|
|
|
package net
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"os"
|
|
|
|
|
"reflect"
|
2012-03-06 10:07:08 +09:00
|
|
|
"runtime"
|
2011-03-25 14:42:25 -04:00
|
|
|
"testing"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
type listenerFile interface {
|
|
|
|
|
Listener
|
2011-11-01 22:05:34 -04:00
|
|
|
File() (f *os.File, err error)
|
2011-03-25 14:42:25 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type packetConnFile interface {
|
|
|
|
|
PacketConn
|
2011-11-01 22:05:34 -04:00
|
|
|
File() (f *os.File, err error)
|
2011-03-25 14:42:25 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type connFile interface {
|
|
|
|
|
Conn
|
2011-11-01 22:05:34 -04:00
|
|
|
File() (f *os.File, err error)
|
2011-03-25 14:42:25 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func testFileListener(t *testing.T, net, laddr string) {
|
2012-03-06 09:43:45 +09:00
|
|
|
switch net {
|
|
|
|
|
case "tcp", "tcp4", "tcp6":
|
2011-03-25 14:42:25 -04:00
|
|
|
laddr += ":0" // any available port
|
|
|
|
|
}
|
|
|
|
|
l, err := Listen(net, laddr)
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("Listen failed: %v", err)
|
|
|
|
|
}
|
|
|
|
|
defer l.Close()
|
|
|
|
|
lf := l.(listenerFile)
|
|
|
|
|
f, err := lf.File()
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("File failed: %v", err)
|
|
|
|
|
}
|
|
|
|
|
c, err := FileListener(f)
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("FileListener failed: %v", err)
|
|
|
|
|
}
|
|
|
|
|
if !reflect.DeepEqual(l.Addr(), c.Addr()) {
|
|
|
|
|
t.Fatalf("Addrs not equal: %#v != %#v", l.Addr(), c.Addr())
|
|
|
|
|
}
|
|
|
|
|
if err := c.Close(); err != nil {
|
|
|
|
|
t.Fatalf("Close failed: %v", err)
|
|
|
|
|
}
|
|
|
|
|
if err := f.Close(); err != nil {
|
|
|
|
|
t.Fatalf("Close failed: %v", err)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2012-03-06 09:43:45 +09:00
|
|
|
var fileListenerTests = []struct {
|
|
|
|
|
net string
|
|
|
|
|
laddr string
|
|
|
|
|
ipv6 bool // test with underlying AF_INET6 socket
|
|
|
|
|
linux bool // test with abstract unix domain socket, a Linux-ism
|
|
|
|
|
}{
|
|
|
|
|
{net: "tcp", laddr: ""},
|
|
|
|
|
{net: "tcp", laddr: "0.0.0.0"},
|
|
|
|
|
{net: "tcp", laddr: "[::ffff:0.0.0.0]"},
|
|
|
|
|
{net: "tcp", laddr: "[::]", ipv6: true},
|
|
|
|
|
|
|
|
|
|
{net: "tcp", laddr: "127.0.0.1"},
|
|
|
|
|
{net: "tcp", laddr: "[::ffff:127.0.0.1]"},
|
|
|
|
|
{net: "tcp", laddr: "[::1]", ipv6: true},
|
|
|
|
|
|
|
|
|
|
{net: "tcp4", laddr: ""},
|
|
|
|
|
{net: "tcp4", laddr: "0.0.0.0"},
|
|
|
|
|
{net: "tcp4", laddr: "[::ffff:0.0.0.0]"},
|
|
|
|
|
|
|
|
|
|
{net: "tcp4", laddr: "127.0.0.1"},
|
|
|
|
|
{net: "tcp4", laddr: "[::ffff:127.0.0.1]"},
|
|
|
|
|
|
|
|
|
|
{net: "tcp6", laddr: "", ipv6: true},
|
|
|
|
|
{net: "tcp6", laddr: "[::]", ipv6: true},
|
|
|
|
|
|
|
|
|
|
{net: "tcp6", laddr: "[::1]", ipv6: true},
|
|
|
|
|
|
|
|
|
|
{net: "unix", laddr: "@gotest/net", linux: true},
|
|
|
|
|
{net: "unixpacket", laddr: "@gotest/net", linux: true},
|
|
|
|
|
}
|
|
|
|
|
|
2011-03-25 14:42:25 -04:00
|
|
|
func TestFileListener(t *testing.T) {
|
2012-03-06 10:07:08 +09:00
|
|
|
switch runtime.GOOS {
|
2013-02-28 07:18:02 +01:00
|
|
|
case "windows":
|
2013-01-24 17:32:10 +11:00
|
|
|
t.Skipf("skipping test on %q", runtime.GOOS)
|
2012-03-06 10:07:08 +09:00
|
|
|
}
|
|
|
|
|
|
2012-03-06 09:43:45 +09:00
|
|
|
for _, tt := range fileListenerTests {
|
|
|
|
|
if skipServerTest(tt.net, "unix", tt.laddr, tt.ipv6, false, tt.linux) {
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
if skipServerTest(tt.net, "unixpacket", tt.laddr, tt.ipv6, false, tt.linux) {
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
testFileListener(t, tt.net, tt.laddr)
|
2011-03-25 14:42:25 -04:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2011-10-12 13:36:45 -04:00
|
|
|
func testFilePacketConn(t *testing.T, pcf packetConnFile, listen bool) {
|
2011-03-25 14:42:25 -04:00
|
|
|
f, err := pcf.File()
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("File failed: %v", err)
|
|
|
|
|
}
|
|
|
|
|
c, err := FilePacketConn(f)
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("FilePacketConn failed: %v", err)
|
|
|
|
|
}
|
|
|
|
|
if !reflect.DeepEqual(pcf.LocalAddr(), c.LocalAddr()) {
|
|
|
|
|
t.Fatalf("LocalAddrs not equal: %#v != %#v", pcf.LocalAddr(), c.LocalAddr())
|
|
|
|
|
}
|
2011-10-12 13:36:45 -04:00
|
|
|
if listen {
|
|
|
|
|
if _, err := c.WriteTo([]byte{}, c.LocalAddr()); err != nil {
|
|
|
|
|
t.Fatalf("WriteTo failed: %v", err)
|
|
|
|
|
}
|
|
|
|
|
}
|
2011-03-25 14:42:25 -04:00
|
|
|
if err := c.Close(); err != nil {
|
|
|
|
|
t.Fatalf("Close failed: %v", err)
|
|
|
|
|
}
|
|
|
|
|
if err := f.Close(); err != nil {
|
|
|
|
|
t.Fatalf("Close failed: %v", err)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func testFilePacketConnListen(t *testing.T, net, laddr string) {
|
2012-03-06 09:43:45 +09:00
|
|
|
switch net {
|
|
|
|
|
case "udp", "udp4", "udp6":
|
|
|
|
|
laddr += ":0" // any available port
|
|
|
|
|
}
|
2011-03-25 14:42:25 -04:00
|
|
|
l, err := ListenPacket(net, laddr)
|
|
|
|
|
if err != nil {
|
2012-03-06 09:43:45 +09:00
|
|
|
t.Fatalf("ListenPacket failed: %v", err)
|
2011-03-25 14:42:25 -04:00
|
|
|
}
|
2011-10-12 13:36:45 -04:00
|
|
|
testFilePacketConn(t, l.(packetConnFile), true)
|
2011-03-25 14:42:25 -04:00
|
|
|
if err := l.Close(); err != nil {
|
|
|
|
|
t.Fatalf("Close failed: %v", err)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func testFilePacketConnDial(t *testing.T, net, raddr string) {
|
2012-03-06 09:43:45 +09:00
|
|
|
switch net {
|
|
|
|
|
case "udp", "udp4", "udp6":
|
|
|
|
|
raddr += ":12345"
|
|
|
|
|
}
|
2011-03-28 23:39:39 -04:00
|
|
|
c, err := Dial(net, raddr)
|
2011-03-25 14:42:25 -04:00
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("Dial failed: %v", err)
|
|
|
|
|
}
|
2011-10-12 13:36:45 -04:00
|
|
|
testFilePacketConn(t, c.(packetConnFile), false)
|
2011-03-25 14:42:25 -04:00
|
|
|
if err := c.Close(); err != nil {
|
|
|
|
|
t.Fatalf("Close failed: %v", err)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2012-03-06 09:43:45 +09:00
|
|
|
var filePacketConnTests = []struct {
|
|
|
|
|
net string
|
|
|
|
|
addr string
|
|
|
|
|
ipv6 bool // test with underlying AF_INET6 socket
|
|
|
|
|
linux bool // test with abstract unix domain socket, a Linux-ism
|
|
|
|
|
}{
|
|
|
|
|
{net: "udp", addr: "127.0.0.1"},
|
|
|
|
|
{net: "udp", addr: "[::ffff:127.0.0.1]"},
|
|
|
|
|
{net: "udp", addr: "[::1]", ipv6: true},
|
|
|
|
|
|
|
|
|
|
{net: "udp4", addr: "127.0.0.1"},
|
|
|
|
|
{net: "udp4", addr: "[::ffff:127.0.0.1]"},
|
|
|
|
|
|
|
|
|
|
{net: "udp6", addr: "[::1]", ipv6: true},
|
|
|
|
|
|
2014-01-28 03:18:27 -08:00
|
|
|
{net: "ip4:icmp", addr: "127.0.0.1"},
|
|
|
|
|
|
2012-03-06 09:43:45 +09:00
|
|
|
{net: "unixgram", addr: "@gotest3/net", linux: true},
|
|
|
|
|
}
|
|
|
|
|
|
2011-03-25 14:42:25 -04:00
|
|
|
func TestFilePacketConn(t *testing.T) {
|
2012-03-06 10:07:08 +09:00
|
|
|
switch runtime.GOOS {
|
all: merge NaCl branch (part 1)
See golang.org/s/go13nacl for design overview.
This CL is the mostly mechanical changes from rsc's Go 1.2 based NaCl branch, specifically 39cb35750369 to 500771b477cf from https://code.google.com/r/rsc-go13nacl. This CL does not include working NaCl support, there are probably two or three more large merges to come.
CL 15750044 is not included as it involves more invasive changes to the linker which will need to be merged separately.
The exact change lists included are
15050047: syscall: support for Native Client
15360044: syscall: unzip implementation for Native Client
15370044: syscall: Native Client SRPC implementation
15400047: cmd/dist, cmd/go, go/build, test: support for Native Client
15410048: runtime: support for Native Client
15410049: syscall: file descriptor table for Native Client
15410050: syscall: in-memory file system for Native Client
15440048: all: update +build lines for Native Client port
15540045: cmd/6g, cmd/8g, cmd/gc: support for Native Client
15570045: os: support for Native Client
15680044: crypto/..., hash/crc32, reflect, sync/atomic: support for amd64p32
15690044: net: support for Native Client
15690048: runtime: support for fake time like on Go Playground
15690051: build: disable various tests on Native Client
LGTM=rsc
R=rsc
CC=golang-codereviews
https://golang.org/cl/68150047
2014-02-25 09:47:42 -05:00
|
|
|
case "plan9", "windows", "nacl":
|
2013-01-24 17:32:10 +11:00
|
|
|
t.Skipf("skipping test on %q", runtime.GOOS)
|
2012-03-06 10:07:08 +09:00
|
|
|
}
|
|
|
|
|
|
2012-03-06 09:43:45 +09:00
|
|
|
for _, tt := range filePacketConnTests {
|
|
|
|
|
if skipServerTest(tt.net, "unixgram", tt.addr, tt.ipv6, false, tt.linux) {
|
|
|
|
|
continue
|
|
|
|
|
}
|
2014-01-28 03:18:27 -08:00
|
|
|
if os.Getuid() != 0 && tt.net == "ip4:icmp" {
|
|
|
|
|
t.Log("skipping test; must be root")
|
|
|
|
|
continue
|
|
|
|
|
}
|
2012-03-06 09:43:45 +09:00
|
|
|
testFilePacketConnListen(t, tt.net, tt.addr)
|
|
|
|
|
switch tt.addr {
|
|
|
|
|
case "", "0.0.0.0", "[::ffff:0.0.0.0]", "[::]":
|
|
|
|
|
default:
|
|
|
|
|
if tt.net != "unixgram" {
|
|
|
|
|
testFilePacketConnDial(t, tt.net, tt.addr)
|
|
|
|
|
}
|
|
|
|
|
}
|
2011-03-25 14:42:25 -04:00
|
|
|
}
|
|
|
|
|
}
|