1
2
3
4
5 package net
6
7 import (
8 "os"
9 "testing"
10 "time"
11 )
12
13 func testTimeout(t *testing.T, network, addr string, readFrom bool) {
14 fd, err := Dial(network, addr)
15 if err != nil {
16 t.Errorf("dial %s %s failed: %v", network, addr, err)
17 return
18 }
19 defer fd.Close()
20 t0 := time.Nanoseconds()
21 fd.SetReadTimeout(1e8)
22 var b [100]byte
23 var n int
24 var err1 os.Error
25 if readFrom {
26 n, _, err1 = fd.(PacketConn).ReadFrom(b[0:])
27 } else {
28 n, err1 = fd.Read(b[0:])
29 }
30 t1 := time.Nanoseconds()
31 what := "Read"
32 if readFrom {
33 what = "ReadFrom"
34 }
35 if n != 0 || err1 == nil || !err1.(Error).Timeout() {
36 t.Errorf("fd.%s on %s %s did not return 0, timeout: %v, %v", what, network, addr, n, err1)
37 }
38 if t1-t0 < 0.5e8 || t1-t0 > 1.5e8 {
39 t.Errorf("fd.%s on %s %s took %f seconds, expected 0.1", what, network, addr, float64(t1-t0)/1e9)
40 }
41 }
42
43 func TestTimeoutUDP(t *testing.T) {
44 testTimeout(t, "udp", "127.0.0.1:53", false)
45 testTimeout(t, "udp", "127.0.0.1:53", true)
46 }
47
48 func TestTimeoutTCP(t *testing.T) {
49
50 listening := make(chan string)
51 done := make(chan int)
52 go runServe(t, "tcp", "127.0.0.1:0", listening, done)
53 addr := <-listening
54
55 testTimeout(t, "tcp", addr, false)
56 <-done
57 }