diff options
Diffstat (limited to 'libgo/go/net/unix_test.go')
-rw-r--r-- | libgo/go/net/unix_test.go | 264 |
1 files changed, 181 insertions, 83 deletions
diff --git a/libgo/go/net/unix_test.go b/libgo/go/net/unix_test.go index 1cdff3908c1..358ff310725 100644 --- a/libgo/go/net/unix_test.go +++ b/libgo/go/net/unix_test.go @@ -17,14 +17,18 @@ import ( ) func TestReadUnixgramWithUnnamedSocket(t *testing.T) { + if !testableNetwork("unixgram") { + t.Skip("unixgram test") + } + addr := testUnixAddr() la, err := ResolveUnixAddr("unixgram", addr) if err != nil { - t.Fatalf("ResolveUnixAddr failed: %v", err) + t.Fatal(err) } c, err := ListenUnixgram("unixgram", la) if err != nil { - t.Fatalf("ListenUnixgram failed: %v", err) + t.Fatal(err) } defer func() { c.Close() @@ -37,13 +41,13 @@ func TestReadUnixgramWithUnnamedSocket(t *testing.T) { defer func() { off <- true }() s, err := syscall.Socket(syscall.AF_UNIX, syscall.SOCK_DGRAM, 0) if err != nil { - t.Errorf("syscall.Socket failed: %v", err) + t.Error(err) return } defer syscall.Close(s) rsa := &syscall.SockaddrUnix{Name: addr} if err := syscall.Sendto(s, data[:], 0, rsa); err != nil { - t.Errorf("syscall.Sendto failed: %v", err) + t.Error(err) return } }() @@ -53,69 +57,123 @@ func TestReadUnixgramWithUnnamedSocket(t *testing.T) { c.SetReadDeadline(time.Now().Add(100 * time.Millisecond)) n, from, err := c.ReadFrom(b) if err != nil { - t.Fatalf("UnixConn.ReadFrom failed: %v", err) + t.Fatal(err) } if from != nil { - t.Fatalf("neighbor address is %v", from) + t.Fatalf("unexpected peer address: %v", from) } if !bytes.Equal(b[:n], data[:]) { - t.Fatalf("got %v, want %v", b[:n], data[:]) + t.Fatalf("got %v; want %v", b[:n], data[:]) } } -func TestReadUnixgramWithZeroBytesBuffer(t *testing.T) { - // issue 4352: Recvfrom failed with "address family not - // supported by protocol family" if zero-length buffer provided +func TestUnixgramZeroBytePayload(t *testing.T) { + if !testableNetwork("unixgram") { + t.Skip("unixgram test") + } - addr := testUnixAddr() - la, err := ResolveUnixAddr("unixgram", addr) + c1, err := newLocalPacketListener("unixgram") if err != nil { - t.Fatalf("ResolveUnixAddr failed: %v", err) + t.Fatal(err) } - c, err := ListenUnixgram("unixgram", la) + defer os.Remove(c1.LocalAddr().String()) + defer c1.Close() + + c2, err := Dial("unixgram", c1.LocalAddr().String()) if err != nil { - t.Fatalf("ListenUnixgram failed: %v", err) + t.Fatal(err) } - defer func() { - c.Close() - os.Remove(addr) - }() + defer os.Remove(c2.LocalAddr().String()) + defer c2.Close() - off := make(chan bool) - go func() { - defer func() { off <- true }() - c, err := DialUnix("unixgram", nil, la) + for _, genericRead := range []bool{false, true} { + n, err := c2.Write(nil) if err != nil { - t.Errorf("DialUnix failed: %v", err) - return + t.Fatal(err) } - defer c.Close() - if _, err := c.Write([]byte{1, 2, 3, 4, 5}); err != nil { - t.Errorf("UnixConn.Write failed: %v", err) - return + if n != 0 { + t.Errorf("got %d; want 0", n) } - }() + c1.SetReadDeadline(time.Now().Add(100 * time.Millisecond)) + var b [1]byte + var peer Addr + if genericRead { + _, err = c1.(Conn).Read(b[:]) + } else { + _, peer, err = c1.ReadFrom(b[:]) + } + switch err { + case nil: // ReadFrom succeeds + if peer != nil { // peer is connected-mode + t.Fatalf("unexpected peer address: %v", peer) + } + default: // Read may timeout, it depends on the platform + if nerr, ok := err.(Error); !ok || !nerr.Timeout() { + t.Fatal(err) + } + } + } +} - <-off - c.SetReadDeadline(time.Now().Add(100 * time.Millisecond)) - _, from, err := c.ReadFrom(nil) +func TestUnixgramZeroByteBuffer(t *testing.T) { + if !testableNetwork("unixgram") { + t.Skip("unixgram test") + } + // issue 4352: Recvfrom failed with "address family not + // supported by protocol family" if zero-length buffer provided + + c1, err := newLocalPacketListener("unixgram") if err != nil { - t.Fatalf("UnixConn.ReadFrom failed: %v", err) + t.Fatal(err) } - if from != nil { - t.Fatalf("neighbor address is %v", from) + defer os.Remove(c1.LocalAddr().String()) + defer c1.Close() + + c2, err := Dial("unixgram", c1.LocalAddr().String()) + if err != nil { + t.Fatal(err) + } + defer os.Remove(c2.LocalAddr().String()) + defer c2.Close() + + b := []byte("UNIXGRAM ZERO BYTE BUFFER TEST") + for _, genericRead := range []bool{false, true} { + n, err := c2.Write(b) + if err != nil { + t.Fatal(err) + } + if n != len(b) { + t.Errorf("got %d; want %d", n, len(b)) + } + c1.SetReadDeadline(time.Now().Add(100 * time.Millisecond)) + var peer Addr + if genericRead { + _, err = c1.(Conn).Read(nil) + } else { + _, peer, err = c1.ReadFrom(nil) + } + switch err { + case nil: // ReadFrom succeeds + if peer != nil { // peer is connected-mode + t.Fatalf("unexpected peer address: %v", peer) + } + default: // Read may timeout, it depends on the platform + if nerr, ok := err.(Error); !ok || !nerr.Timeout() { + t.Fatal(err) + } + } } } func TestUnixgramAutobind(t *testing.T) { if runtime.GOOS != "linux" { - t.Skip("skipping: autobind is linux only") + t.Skip("autobind is linux only") } laddr := &UnixAddr{Name: "", Net: "unixgram"} c1, err := ListenUnixgram("unixgram", laddr) if err != nil { - t.Fatalf("ListenUnixgram failed: %v", err) + t.Fatal(err) } defer c1.Close() @@ -130,7 +188,7 @@ func TestUnixgramAutobind(t *testing.T) { c2, err := DialUnix("unixgram", nil, autoAddr) if err != nil { - t.Fatalf("DialUnix failed: %v", err) + t.Fatal(err) } defer c2.Close() @@ -141,25 +199,30 @@ func TestUnixgramAutobind(t *testing.T) { func TestUnixAutobindClose(t *testing.T) { if runtime.GOOS != "linux" { - t.Skip("skipping: autobind is linux only") + t.Skip("autobind is linux only") } + laddr := &UnixAddr{Name: "", Net: "unix"} ln, err := ListenUnix("unix", laddr) if err != nil { - t.Fatalf("ListenUnix failed: %v", err) + t.Fatal(err) } ln.Close() } func TestUnixgramWrite(t *testing.T) { + if !testableNetwork("unixgram") { + t.Skip("unixgram test") + } + addr := testUnixAddr() laddr, err := ResolveUnixAddr("unixgram", addr) if err != nil { - t.Fatalf("ResolveUnixAddr failed: %v", err) + t.Fatal(err) } c, err := ListenPacket("unixgram", addr) if err != nil { - t.Fatalf("ListenPacket failed: %v", err) + t.Fatal(err) } defer os.Remove(addr) defer c.Close() @@ -171,27 +234,28 @@ func TestUnixgramWrite(t *testing.T) { func testUnixgramWriteConn(t *testing.T, raddr *UnixAddr) { c, err := Dial("unixgram", raddr.String()) if err != nil { - t.Fatalf("Dial failed: %v", err) + t.Fatal(err) } defer c.Close() - if _, err := c.(*UnixConn).WriteToUnix([]byte("Connection-oriented mode socket"), raddr); err == nil { - t.Fatal("WriteToUnix should fail") + b := []byte("CONNECTED-MODE SOCKET") + if _, err := c.(*UnixConn).WriteToUnix(b, raddr); err == nil { + t.Fatal("should fail") } else if err.(*OpError).Err != ErrWriteToConnected { - t.Fatalf("WriteToUnix should fail as ErrWriteToConnected: %v", err) + t.Fatalf("should fail as ErrWriteToConnected: %v", err) } - if _, err = c.(*UnixConn).WriteTo([]byte("Connection-oriented mode socket"), raddr); err == nil { - t.Fatal("WriteTo should fail") + if _, err = c.(*UnixConn).WriteTo(b, raddr); err == nil { + t.Fatal("should fail") } else if err.(*OpError).Err != ErrWriteToConnected { - t.Fatalf("WriteTo should fail as ErrWriteToConnected: %v", err) + t.Fatalf("should fail as ErrWriteToConnected: %v", err) } - if _, _, err = c.(*UnixConn).WriteMsgUnix([]byte("Connection-oriented mode socket"), nil, raddr); err == nil { - t.Fatal("WriteTo should fail") + if _, _, err = c.(*UnixConn).WriteMsgUnix(b, nil, raddr); err == nil { + t.Fatal("should fail") } else if err.(*OpError).Err != ErrWriteToConnected { - t.Fatalf("WriteMsgUnix should fail as ErrWriteToConnected: %v", err) + t.Fatalf("should fail as ErrWriteToConnected: %v", err) } - if _, err := c.Write([]byte("Connection-oriented mode socket")); err != nil { - t.Fatalf("Write failed: %v", err) + if _, err := c.Write(b); err != nil { + t.Fatal(err) } } @@ -199,52 +263,59 @@ func testUnixgramWritePacketConn(t *testing.T, raddr *UnixAddr) { addr := testUnixAddr() c, err := ListenPacket("unixgram", addr) if err != nil { - t.Fatalf("ListenPacket failed: %v", err) + t.Fatal(err) } defer os.Remove(addr) defer c.Close() - if _, err := c.(*UnixConn).WriteToUnix([]byte("Connectionless mode socket"), raddr); err != nil { - t.Fatalf("WriteToUnix failed: %v", err) + b := []byte("UNCONNECTED-MODE SOCKET") + if _, err := c.(*UnixConn).WriteToUnix(b, raddr); err != nil { + t.Fatal(err) } - if _, err := c.WriteTo([]byte("Connectionless mode socket"), raddr); err != nil { - t.Fatalf("WriteTo failed: %v", err) + if _, err := c.WriteTo(b, raddr); err != nil { + t.Fatal(err) } - if _, _, err := c.(*UnixConn).WriteMsgUnix([]byte("Connectionless mode socket"), nil, raddr); err != nil { - t.Fatalf("WriteMsgUnix failed: %v", err) + if _, _, err := c.(*UnixConn).WriteMsgUnix(b, nil, raddr); err != nil { + t.Fatal(err) } - if _, err := c.(*UnixConn).Write([]byte("Connectionless mode socket")); err == nil { - t.Fatal("Write should fail") + if _, err := c.(*UnixConn).Write(b); err == nil { + t.Fatal("should fail") } } func TestUnixConnLocalAndRemoteNames(t *testing.T) { + if !testableNetwork("unix") { + t.Skip("unix test") + } + + handler := func(ls *localServer, ln Listener) {} for _, laddr := range []string{"", testUnixAddr()} { laddr := laddr taddr := testUnixAddr() ta, err := ResolveUnixAddr("unix", taddr) if err != nil { - t.Fatalf("ResolveUnixAddr failed: %v", err) + t.Fatal(err) } ln, err := ListenUnix("unix", ta) if err != nil { - t.Fatalf("ListenUnix failed: %v", err) + t.Fatal(err) + } + ls, err := (&streamListener{Listener: ln}).newLocalServer() + if err != nil { + t.Fatal(err) + } + defer ls.teardown() + if err := ls.buildup(handler); err != nil { + t.Fatal(err) } - defer func() { - ln.Close() - os.Remove(taddr) - }() - - done := make(chan int) - go transponder(t, ln, done) la, err := ResolveUnixAddr("unix", laddr) if err != nil { - t.Fatalf("ResolveUnixAddr failed: %v", err) + t.Fatal(err) } c, err := DialUnix("unix", la, ta) if err != nil { - t.Fatalf("DialUnix failed: %v", err) + t.Fatal(err) } defer func() { c.Close() @@ -253,7 +324,7 @@ func TestUnixConnLocalAndRemoteNames(t *testing.T) { } }() if _, err := c.Write([]byte("UNIXCONN LOCAL AND REMOTE NAME TEST")); err != nil { - t.Fatalf("UnixConn.Write failed: %v", err) + t.Fatal(err) } switch runtime.GOOS { @@ -272,22 +343,24 @@ func TestUnixConnLocalAndRemoteNames(t *testing.T) { t.Fatalf("got %#v, expected %#v", ca.got, ca.want) } } - - <-done } } func TestUnixgramConnLocalAndRemoteNames(t *testing.T) { + if !testableNetwork("unixgram") { + t.Skip("unixgram test") + } + for _, laddr := range []string{"", testUnixAddr()} { laddr := laddr taddr := testUnixAddr() ta, err := ResolveUnixAddr("unixgram", taddr) if err != nil { - t.Fatalf("ResolveUnixAddr failed: %v", err) + t.Fatal(err) } c1, err := ListenUnixgram("unixgram", ta) if err != nil { - t.Fatalf("ListenUnixgram failed: %v", err) + t.Fatal(err) } defer func() { c1.Close() @@ -297,12 +370,12 @@ func TestUnixgramConnLocalAndRemoteNames(t *testing.T) { var la *UnixAddr if laddr != "" { if la, err = ResolveUnixAddr("unixgram", laddr); err != nil { - t.Fatalf("ResolveUnixAddr failed: %v", err) + t.Fatal(err) } } c2, err := DialUnix("unixgram", la, ta) if err != nil { - t.Fatalf("DialUnix failed: %v", err) + t.Fatal(err) } defer func() { c2.Close() @@ -326,8 +399,33 @@ func TestUnixgramConnLocalAndRemoteNames(t *testing.T) { } for _, ca := range connAddrs { if !reflect.DeepEqual(ca.got, ca.want) { - t.Fatalf("got %#v, expected %#v", ca.got, ca.want) + t.Fatalf("got %#v; want %#v", ca.got, ca.want) } } } } + +// forceGoDNS forces the resolver configuration to use the pure Go resolver +// and returns a fixup function to restore the old settings. +func forceGoDNS() func() { + c := systemConf() + oldGo := c.netGo + oldCgo := c.netCgo + fixup := func() { + c.netGo = oldGo + c.netCgo = oldCgo + } + c.netGo = true + c.netCgo = false + return fixup +} + +// forceCgoDNS forces the resolver configuration to use the cgo resolver +// and returns true to indicate that it did so. +// (On non-Unix systems forceCgoDNS returns false.) +func forceCgoDNS() bool { + c := systemConf() + c.netGo = false + c.netCgo = true + return true +} |