~ubuntu-branches/ubuntu/utopic/golang/utopic

« back to all changes in this revision

Viewing changes to src/pkg/net/conn_test.go

  • Committer: Package Import Robot
  • Author(s): James Page
  • Date: 2013-08-20 14:06:23 UTC
  • mfrom: (14.1.23 saucy-proposed)
  • Revision ID: package-import@ubuntu.com-20130820140623-b414jfxi3m0qkmrq
Tags: 2:1.1.2-2ubuntu1
* Merge from Debian unstable (LP: #1211749, #1202027). Remaining changes:
  - 016-armhf-elf-header.patch: Use correct ELF header for armhf binaries.
  - d/control,control.cross: Update Breaks/Replaces for Ubuntu
    versions to ensure smooth upgrades, regenerate control file.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
// Copyright 2012 The Go Authors.  All rights reserved.
 
2
// Use of this source code is governed by a BSD-style
 
3
// license that can be found in the LICENSE file.
 
4
 
 
5
// This file implements API tests across platforms and will never have a build
 
6
// tag.
 
7
 
 
8
package net
 
9
 
 
10
import (
 
11
        "os"
 
12
        "runtime"
 
13
        "testing"
 
14
        "time"
 
15
)
 
16
 
 
17
var connTests = []struct {
 
18
        net  string
 
19
        addr func() string
 
20
}{
 
21
        {"tcp", func() string { return "127.0.0.1:0" }},
 
22
        {"unix", testUnixAddr},
 
23
        {"unixpacket", testUnixAddr},
 
24
}
 
25
 
 
26
// someTimeout is used just to test that net.Conn implementations
 
27
// don't explode when their SetFooDeadline methods are called.
 
28
// It isn't actually used for testing timeouts.
 
29
const someTimeout = 10 * time.Second
 
30
 
 
31
func TestConnAndListener(t *testing.T) {
 
32
        for _, tt := range connTests {
 
33
                switch tt.net {
 
34
                case "unix", "unixpacket":
 
35
                        switch runtime.GOOS {
 
36
                        case "plan9", "windows":
 
37
                                continue
 
38
                        }
 
39
                        if tt.net == "unixpacket" && runtime.GOOS != "linux" {
 
40
                                continue
 
41
                        }
 
42
                }
 
43
 
 
44
                addr := tt.addr()
 
45
                ln, err := Listen(tt.net, addr)
 
46
                if err != nil {
 
47
                        t.Fatalf("Listen failed: %v", err)
 
48
                }
 
49
                defer func(ln Listener, net, addr string) {
 
50
                        ln.Close()
 
51
                        switch net {
 
52
                        case "unix", "unixpacket":
 
53
                                os.Remove(addr)
 
54
                        }
 
55
                }(ln, tt.net, addr)
 
56
                ln.Addr()
 
57
 
 
58
                done := make(chan int)
 
59
                go transponder(t, ln, done)
 
60
 
 
61
                c, err := Dial(tt.net, ln.Addr().String())
 
62
                if err != nil {
 
63
                        t.Fatalf("Dial failed: %v", err)
 
64
                }
 
65
                defer c.Close()
 
66
                c.LocalAddr()
 
67
                c.RemoteAddr()
 
68
                c.SetDeadline(time.Now().Add(someTimeout))
 
69
                c.SetReadDeadline(time.Now().Add(someTimeout))
 
70
                c.SetWriteDeadline(time.Now().Add(someTimeout))
 
71
 
 
72
                if _, err := c.Write([]byte("CONN TEST")); err != nil {
 
73
                        t.Fatalf("Conn.Write failed: %v", err)
 
74
                }
 
75
                rb := make([]byte, 128)
 
76
                if _, err := c.Read(rb); err != nil {
 
77
                        t.Fatalf("Conn.Read failed: %v", err)
 
78
                }
 
79
 
 
80
                <-done
 
81
        }
 
82
}
 
83
 
 
84
func transponder(t *testing.T, ln Listener, done chan<- int) {
 
85
        defer func() { done <- 1 }()
 
86
 
 
87
        switch ln := ln.(type) {
 
88
        case *TCPListener:
 
89
                ln.SetDeadline(time.Now().Add(someTimeout))
 
90
        case *UnixListener:
 
91
                ln.SetDeadline(time.Now().Add(someTimeout))
 
92
        }
 
93
        c, err := ln.Accept()
 
94
        if err != nil {
 
95
                t.Errorf("Listener.Accept failed: %v", err)
 
96
                return
 
97
        }
 
98
        defer c.Close()
 
99
        c.LocalAddr()
 
100
        c.RemoteAddr()
 
101
        c.SetDeadline(time.Now().Add(someTimeout))
 
102
        c.SetReadDeadline(time.Now().Add(someTimeout))
 
103
        c.SetWriteDeadline(time.Now().Add(someTimeout))
 
104
 
 
105
        b := make([]byte, 128)
 
106
        n, err := c.Read(b)
 
107
        if err != nil {
 
108
                t.Errorf("Conn.Read failed: %v", err)
 
109
                return
 
110
        }
 
111
        if _, err := c.Write(b[:n]); err != nil {
 
112
                t.Errorf("Conn.Write failed: %v", err)
 
113
                return
 
114
        }
 
115
}