diff options
Diffstat (limited to 'src/pkg/net/net_test.go')
-rw-r--r-- | src/pkg/net/net_test.go | 126 |
1 files changed, 114 insertions, 12 deletions
diff --git a/src/pkg/net/net_test.go b/src/pkg/net/net_test.go index fd145e1d7..1a512a5b1 100644 --- a/src/pkg/net/net_test.go +++ b/src/pkg/net/net_test.go @@ -6,6 +6,8 @@ package net import ( "io" + "io/ioutil" + "os" "runtime" "testing" "time" @@ -13,18 +15,17 @@ import ( func TestShutdown(t *testing.T) { if runtime.GOOS == "plan9" { - t.Logf("skipping test on %q", runtime.GOOS) - return + t.Skipf("skipping test on %q", runtime.GOOS) } - l, err := Listen("tcp", "127.0.0.1:0") + ln, err := Listen("tcp", "127.0.0.1:0") if err != nil { - if l, err = Listen("tcp6", "[::1]:0"); err != nil { + if ln, err = Listen("tcp6", "[::1]:0"); err != nil { t.Fatalf("ListenTCP on :0: %v", err) } } go func() { - c, err := l.Accept() + c, err := ln.Accept() if err != nil { t.Fatalf("Accept: %v", err) } @@ -37,7 +38,7 @@ func TestShutdown(t *testing.T) { c.Close() }() - c, err := Dial("tcp", l.Addr().String()) + c, err := Dial("tcp", ln.Addr().String()) if err != nil { t.Fatalf("Dial: %v", err) } @@ -58,8 +59,61 @@ func TestShutdown(t *testing.T) { } } +func TestShutdownUnix(t *testing.T) { + switch runtime.GOOS { + case "windows", "plan9": + t.Skipf("skipping test on %q", runtime.GOOS) + } + f, err := ioutil.TempFile("", "go_net_unixtest") + if err != nil { + t.Fatalf("TempFile: %s", err) + } + f.Close() + tmpname := f.Name() + os.Remove(tmpname) + ln, err := Listen("unix", tmpname) + if err != nil { + t.Fatalf("ListenUnix on %s: %s", tmpname, err) + } + defer os.Remove(tmpname) + + go func() { + c, err := ln.Accept() + if err != nil { + t.Fatalf("Accept: %v", err) + } + var buf [10]byte + n, err := c.Read(buf[:]) + if n != 0 || err != io.EOF { + t.Fatalf("server Read = %d, %v; want 0, io.EOF", n, err) + } + c.Write([]byte("response")) + c.Close() + }() + + c, err := Dial("unix", tmpname) + if err != nil { + t.Fatalf("Dial: %v", err) + } + defer c.Close() + + err = c.(*UnixConn).CloseWrite() + if err != nil { + t.Fatalf("CloseWrite: %v", err) + } + var buf [10]byte + n, err := c.Read(buf[:]) + if err != nil { + t.Fatalf("client Read: %d, %v", n, err) + } + got := string(buf[:n]) + if got != "response" { + t.Errorf("read = %q, want \"response\"", got) + } +} + func TestTCPListenClose(t *testing.T) { - l, err := Listen("tcp", "127.0.0.1:0") + ln, err := Listen("tcp", "127.0.0.1:0") if err != nil { t.Fatalf("Listen failed: %v", err) } @@ -67,11 +121,12 @@ func TestTCPListenClose(t *testing.T) { done := make(chan bool, 1) go func() { time.Sleep(100 * time.Millisecond) - l.Close() + ln.Close() }() go func() { - _, err = l.Accept() + c, err := ln.Accept() if err == nil { + c.Close() t.Error("Accept succeeded") } else { t.Logf("Accept timeout error: %s (any error is fine)", err) @@ -86,7 +141,11 @@ func TestTCPListenClose(t *testing.T) { } func TestUDPListenClose(t *testing.T) { - l, err := ListenPacket("udp", "127.0.0.1:0") + switch runtime.GOOS { + case "plan9": + t.Skipf("skipping test on %q", runtime.GOOS) + } + ln, err := ListenPacket("udp", "127.0.0.1:0") if err != nil { t.Fatalf("Listen failed: %v", err) } @@ -95,10 +154,10 @@ func TestUDPListenClose(t *testing.T) { done := make(chan bool, 1) go func() { time.Sleep(100 * time.Millisecond) - l.Close() + ln.Close() }() go func() { - _, _, err = l.ReadFrom(buf) + _, _, err = ln.ReadFrom(buf) if err == nil { t.Error("ReadFrom succeeded") } else { @@ -112,3 +171,46 @@ func TestUDPListenClose(t *testing.T) { t.Fatal("timeout waiting for UDP close") } } + +func TestTCPClose(t *testing.T) { + switch runtime.GOOS { + case "plan9": + t.Skipf("skipping test on %q", runtime.GOOS) + } + l, err := Listen("tcp", "127.0.0.1:0") + if err != nil { + t.Fatal(err) + } + defer l.Close() + + read := func(r io.Reader) error { + var m [1]byte + _, err := r.Read(m[:]) + return err + } + + go func() { + c, err := Dial("tcp", l.Addr().String()) + if err != nil { + t.Fatal(err) + } + + go read(c) + + time.Sleep(10 * time.Millisecond) + c.Close() + }() + + c, err := l.Accept() + if err != nil { + t.Fatal(err) + } + defer c.Close() + + for err == nil { + err = read(c) + } + if err != nil && err != io.EOF { + t.Fatal(err) + } +} |