aboutsummaryrefslogtreecommitdiffstats
path: root/gcc-4.8/libgo/go/net/conn_test.go
blob: f733a81a3b2c301f84be8008d36096b444884401 (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
94
95
96
97
98
99
100
101
102
103
104
105
// Copyright 2012 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_test

import (
	"net"
	"os"
	"runtime"
	"testing"
	"time"
)

var connTests = []struct {
	net  string
	addr string
}{
	{"tcp", "127.0.0.1:0"},
	{"unix", "/tmp/gotest.net1"},
	{"unixpacket", "/tmp/gotest.net2"},
}

func TestConnAndListener(t *testing.T) {
	for _, tt := range connTests {
		switch tt.net {
		case "unix", "unixpacket":
			switch runtime.GOOS {
			case "plan9", "windows":
				continue
			}
			if tt.net == "unixpacket" && runtime.GOOS != "linux" {
				continue
			}
			os.Remove(tt.addr)
		}

		ln, err := net.Listen(tt.net, tt.addr)
		if err != nil {
			t.Errorf("net.Listen failed: %v", err)
			return
		}
		ln.Addr()
		defer func(ln net.Listener, net, addr string) {
			ln.Close()
			switch net {
			case "unix", "unixpacket":
				os.Remove(addr)
			}
		}(ln, tt.net, tt.addr)

		done := make(chan int)
		go transponder(t, ln, done)

		c, err := net.Dial(tt.net, ln.Addr().String())
		if err != nil {
			t.Errorf("net.Dial failed: %v", err)
			return
		}
		c.LocalAddr()
		c.RemoteAddr()
		c.SetDeadline(time.Now().Add(100 * time.Millisecond))
		c.SetReadDeadline(time.Now().Add(100 * time.Millisecond))
		c.SetWriteDeadline(time.Now().Add(100 * time.Millisecond))
		defer c.Close()

		if _, err := c.Write([]byte("CONN TEST")); err != nil {
			t.Errorf("net.Conn.Write failed: %v", err)
			return
		}
		rb := make([]byte, 128)
		if _, err := c.Read(rb); err != nil {
			t.Errorf("net.Conn.Read failed: %v", err)
		}

		<-done
	}
}

func transponder(t *testing.T, ln net.Listener, done chan<- int) {
	defer func() { done <- 1 }()

	c, err := ln.Accept()
	if err != nil {
		t.Errorf("net.Listener.Accept failed: %v", err)
		return
	}
	c.LocalAddr()
	c.RemoteAddr()
	c.SetDeadline(time.Now().Add(100 * time.Millisecond))
	c.SetReadDeadline(time.Now().Add(100 * time.Millisecond))
	c.SetWriteDeadline(time.Now().Add(100 * time.Millisecond))
	defer c.Close()

	b := make([]byte, 128)
	n, err := c.Read(b)
	if err != nil {
		t.Errorf("net.Conn.Read failed: %v", err)
		return
	}
	if _, err := c.Write(b[:n]); err != nil {
		t.Errorf("net.Conn.Write failed: %v", err)
		return
	}
}