net_test.go 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. // Copyright 2009 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. package net
  5. import (
  6. "io"
  7. "io/ioutil"
  8. "os"
  9. "runtime"
  10. "testing"
  11. "time"
  12. )
  13. func TestShutdown(t *testing.T) {
  14. if runtime.GOOS == "plan9" {
  15. t.Skipf("skipping test on %q", runtime.GOOS)
  16. }
  17. ln, err := Listen("tcp", "127.0.0.1:0")
  18. if err != nil {
  19. if ln, err = Listen("tcp6", "[::1]:0"); err != nil {
  20. t.Fatalf("ListenTCP on :0: %v", err)
  21. }
  22. }
  23. go func() {
  24. defer ln.Close()
  25. c, err := ln.Accept()
  26. if err != nil {
  27. t.Errorf("Accept: %v", err)
  28. return
  29. }
  30. var buf [10]byte
  31. n, err := c.Read(buf[:])
  32. if n != 0 || err != io.EOF {
  33. t.Errorf("server Read = %d, %v; want 0, io.EOF", n, err)
  34. return
  35. }
  36. c.Write([]byte("response"))
  37. c.Close()
  38. }()
  39. c, err := Dial("tcp", ln.Addr().String())
  40. if err != nil {
  41. t.Fatalf("Dial: %v", err)
  42. }
  43. defer c.Close()
  44. err = c.(*TCPConn).CloseWrite()
  45. if err != nil {
  46. t.Fatalf("CloseWrite: %v", err)
  47. }
  48. var buf [10]byte
  49. n, err := c.Read(buf[:])
  50. if err != nil {
  51. t.Fatalf("client Read: %d, %v", n, err)
  52. }
  53. got := string(buf[:n])
  54. if got != "response" {
  55. t.Errorf("read = %q, want \"response\"", got)
  56. }
  57. }
  58. func TestShutdownUnix(t *testing.T) {
  59. switch runtime.GOOS {
  60. case "nacl", "plan9", "windows":
  61. t.Skipf("skipping test on %q", runtime.GOOS)
  62. }
  63. f, err := ioutil.TempFile("", "go_net_unixtest")
  64. if err != nil {
  65. t.Fatalf("TempFile: %s", err)
  66. }
  67. f.Close()
  68. tmpname := f.Name()
  69. os.Remove(tmpname)
  70. ln, err := Listen("unix", tmpname)
  71. if err != nil {
  72. t.Fatalf("ListenUnix on %s: %s", tmpname, err)
  73. }
  74. defer func() {
  75. ln.Close()
  76. os.Remove(tmpname)
  77. }()
  78. go func() {
  79. c, err := ln.Accept()
  80. if err != nil {
  81. t.Errorf("Accept: %v", err)
  82. return
  83. }
  84. var buf [10]byte
  85. n, err := c.Read(buf[:])
  86. if n != 0 || err != io.EOF {
  87. t.Errorf("server Read = %d, %v; want 0, io.EOF", n, err)
  88. return
  89. }
  90. c.Write([]byte("response"))
  91. c.Close()
  92. }()
  93. c, err := Dial("unix", tmpname)
  94. if err != nil {
  95. t.Fatalf("Dial: %v", err)
  96. }
  97. defer c.Close()
  98. err = c.(*UnixConn).CloseWrite()
  99. if err != nil {
  100. t.Fatalf("CloseWrite: %v", err)
  101. }
  102. var buf [10]byte
  103. n, err := c.Read(buf[:])
  104. if err != nil {
  105. t.Fatalf("client Read: %d, %v", n, err)
  106. }
  107. got := string(buf[:n])
  108. if got != "response" {
  109. t.Errorf("read = %q, want \"response\"", got)
  110. }
  111. }
  112. func TestTCPListenClose(t *testing.T) {
  113. ln, err := Listen("tcp", "127.0.0.1:0")
  114. if err != nil {
  115. t.Fatalf("Listen failed: %v", err)
  116. }
  117. done := make(chan bool, 1)
  118. go func() {
  119. time.Sleep(100 * time.Millisecond)
  120. ln.Close()
  121. }()
  122. go func() {
  123. c, err := ln.Accept()
  124. if err == nil {
  125. c.Close()
  126. t.Error("Accept succeeded")
  127. } else {
  128. t.Logf("Accept timeout error: %s (any error is fine)", err)
  129. }
  130. done <- true
  131. }()
  132. select {
  133. case <-done:
  134. case <-time.After(2 * time.Second):
  135. t.Fatal("timeout waiting for TCP close")
  136. }
  137. }
  138. func TestUDPListenClose(t *testing.T) {
  139. switch runtime.GOOS {
  140. case "plan9":
  141. t.Skipf("skipping test on %q", runtime.GOOS)
  142. }
  143. ln, err := ListenPacket("udp", "127.0.0.1:0")
  144. if err != nil {
  145. t.Fatalf("Listen failed: %v", err)
  146. }
  147. buf := make([]byte, 1000)
  148. done := make(chan bool, 1)
  149. go func() {
  150. time.Sleep(100 * time.Millisecond)
  151. ln.Close()
  152. }()
  153. go func() {
  154. _, _, err = ln.ReadFrom(buf)
  155. if err == nil {
  156. t.Error("ReadFrom succeeded")
  157. } else {
  158. t.Logf("ReadFrom timeout error: %s (any error is fine)", err)
  159. }
  160. done <- true
  161. }()
  162. select {
  163. case <-done:
  164. case <-time.After(2 * time.Second):
  165. t.Fatal("timeout waiting for UDP close")
  166. }
  167. }
  168. func TestTCPClose(t *testing.T) {
  169. switch runtime.GOOS {
  170. case "plan9":
  171. t.Skipf("skipping test on %q", runtime.GOOS)
  172. }
  173. l, err := Listen("tcp", "127.0.0.1:0")
  174. if err != nil {
  175. t.Fatal(err)
  176. }
  177. defer l.Close()
  178. read := func(r io.Reader) error {
  179. var m [1]byte
  180. _, err := r.Read(m[:])
  181. return err
  182. }
  183. go func() {
  184. c, err := Dial("tcp", l.Addr().String())
  185. if err != nil {
  186. t.Errorf("Dial: %v", err)
  187. return
  188. }
  189. go read(c)
  190. time.Sleep(10 * time.Millisecond)
  191. c.Close()
  192. }()
  193. c, err := l.Accept()
  194. if err != nil {
  195. t.Fatal(err)
  196. }
  197. defer c.Close()
  198. for err == nil {
  199. err = read(c)
  200. }
  201. if err != nil && err != io.EOF {
  202. t.Fatal(err)
  203. }
  204. }
  205. func TestErrorNil(t *testing.T) {
  206. c, err := Dial("tcp", "127.0.0.1:65535")
  207. if err == nil {
  208. t.Fatal("Dial 127.0.0.1:65535 succeeded")
  209. }
  210. if c != nil {
  211. t.Fatalf("Dial returned non-nil interface %T(%v) with err != nil", c, c)
  212. }
  213. // Make Listen fail by relistening on the same address.
  214. l, err := Listen("tcp", "127.0.0.1:0")
  215. if err != nil {
  216. t.Fatalf("Listen 127.0.0.1:0: %v", err)
  217. }
  218. defer l.Close()
  219. l1, err := Listen("tcp", l.Addr().String())
  220. if err == nil {
  221. t.Fatalf("second Listen %v: %v", l.Addr(), err)
  222. }
  223. if l1 != nil {
  224. t.Fatalf("Listen returned non-nil interface %T(%v) with err != nil", l1, l1)
  225. }
  226. // Make ListenPacket fail by relistening on the same address.
  227. lp, err := ListenPacket("udp", "127.0.0.1:0")
  228. if err != nil {
  229. t.Fatalf("Listen 127.0.0.1:0: %v", err)
  230. }
  231. defer lp.Close()
  232. lp1, err := ListenPacket("udp", lp.LocalAddr().String())
  233. if err == nil {
  234. t.Fatalf("second Listen %v: %v", lp.LocalAddr(), err)
  235. }
  236. if lp1 != nil {
  237. t.Fatalf("ListenPacket returned non-nil interface %T(%v) with err != nil", lp1, lp1)
  238. }
  239. }