summaryrefslogtreecommitdiff
path: root/src/lib/net/server_test.go
blob: 586b553659921a0d288c83f5d43d13d882c339ef (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
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");
	}
}