summaryrefslogtreecommitdiff
path: root/src/pkg/net/server_test.go
diff options
context:
space:
mode:
authorRob Pike <r@golang.org>2009-06-09 09:53:44 -0700
committerRob Pike <r@golang.org>2009-06-09 09:53:44 -0700
commit7249ea4df2b4f12a4e7ed446f270cea87e4ffd34 (patch)
tree7032a11d0cac2ae4d3e90f7a189b575b5a50f848 /src/pkg/net/server_test.go
parentacf6ef7a82b3fe61516a1bac4563706552bdf078 (diff)
downloadgolang-7249ea4df2b4f12a4e7ed446f270cea87e4ffd34.tar.gz
mv src/lib to src/pkg
tests: all.bash passes, gobuild still works, godoc still works. R=rsc OCL=30096 CL=30102
Diffstat (limited to 'src/pkg/net/server_test.go')
-rw-r--r--src/pkg/net/server_test.go93
1 files changed, 93 insertions, 0 deletions
diff --git a/src/pkg/net/server_test.go b/src/pkg/net/server_test.go
new file mode 100644
index 000000000..586b55365
--- /dev/null
+++ b/src/pkg/net/server_test.go
@@ -0,0 +1,93 @@
+// Copyright 2009 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 (
+ "io";
+ "net";
+ "os";
+ "syscall";
+ "testing";
+)
+
+func runEcho(fd io.ReadWriter, done chan<- int) {
+ var buf [1024]byte;
+
+ for {
+ n, err := fd.Read(&buf);
+ if err != nil || n == 0 {
+ break;
+ }
+ fd.Write(buf[0:n])
+ }
+ done <- 1
+}
+
+func runServe(t *testing.T, network, addr string, listening, done chan<- int) {
+ l, err := net.Listen(network, addr);
+ if err != nil {
+ t.Fatalf("net.Listen(%q, %q) = _, %v", network, addr, err);
+ }
+ listening <- 1;
+
+ for {
+ fd, addr, err := l.Accept();
+ if err != nil {
+ break;
+ }
+ echodone := make(chan int);
+ go runEcho(fd, echodone);
+ <-echodone; // make sure Echo stops
+ l.Close();
+ }
+ done <- 1
+}
+
+func connect(t *testing.T, network, addr string) {
+ fd, err := net.Dial(network, "", addr);
+ if err != nil {
+ t.Fatalf("net.Dial(%q, %q, %q) = _, %v", network, "", addr, err);
+ }
+
+ b := io.StringBytes("hello, world\n");
+ var b1 [100]byte;
+
+ n, errno := fd.Write(b);
+ if n != len(b) {
+ t.Fatalf("fd.Write(%q) = %d, %v", b, n, errno);
+ }
+
+ n, errno = fd.Read(&b1);
+ if n != len(b) {
+ t.Fatalf("fd.Read() = %d, %v", n, errno);
+ }
+ fd.Close();
+}
+
+func doTest(t *testing.T, network, listenaddr, dialaddr string) {
+ t.Logf("Test %s %s %s\n", network, listenaddr, dialaddr);
+ listening := make(chan int);
+ done := make(chan int);
+ go runServe(t, network, listenaddr, listening, done);
+ <-listening; // wait for server to start
+ connect(t, network, dialaddr);
+ <-done; // make sure server stopped
+}
+
+func TestTcpServer(t *testing.T) {
+ doTest(t, "tcp", "0.0.0.0:9997", "127.0.0.1:9997");
+ doTest(t, "tcp", "[::]:9997", "[::ffff:127.0.0.1]:9997");
+ doTest(t, "tcp", "[::]:9997", "127.0.0.1:9997");
+ doTest(t, "tcp", ":9997", "127.0.0.1:9997");
+ doTest(t, "tcp", "0.0.0.0:9997", "[::ffff:127.0.0.1]:9997");
+}
+
+func TestUnixServer(t *testing.T) {
+ doTest(t, "unix", "/tmp/gotest.net", "/tmp/gotest.net");
+ if syscall.OS == "linux" {
+ // Test abstract unix domain socket, a Linux-ism
+ doTest(t, "unix", "@gotest/net", "@gotest/net");
+ }
+}