PageRenderTime 119ms CodeModel.GetById 27ms RepoModel.GetById 0ms app.codeStats 1ms

/third_party/gofrontend/libgo/go/net/timeout_test.go

http://github.com/axw/llgo
Go | 1010 lines | 887 code | 97 blank | 26 comment | 350 complexity | fe40c3f40f5030ace3ee55327ed207b9 MD5 | raw file
Possible License(s): BSD-3-Clause, MIT
  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. "fmt"
  7. "io"
  8. "io/ioutil"
  9. "net/internal/socktest"
  10. "runtime"
  11. "sync"
  12. "testing"
  13. "time"
  14. )
  15. var dialTimeoutTests = []struct {
  16. timeout time.Duration
  17. delta time.Duration // for deadline
  18. guard time.Duration
  19. max time.Duration
  20. }{
  21. // Tests that dial timeouts, deadlines in the past work.
  22. {-5 * time.Second, 0, -5 * time.Second, 100 * time.Millisecond},
  23. {0, -5 * time.Second, -5 * time.Second, 100 * time.Millisecond},
  24. {-5 * time.Second, 5 * time.Second, -5 * time.Second, 100 * time.Millisecond}, // timeout over deadline
  25. {50 * time.Millisecond, 0, 100 * time.Millisecond, time.Second},
  26. {0, 50 * time.Millisecond, 100 * time.Millisecond, time.Second},
  27. {50 * time.Millisecond, 5 * time.Second, 100 * time.Millisecond, time.Second}, // timeout over deadline
  28. }
  29. func TestDialTimeout(t *testing.T) {
  30. origTestHookDialChannel := testHookDialChannel
  31. defer func() { testHookDialChannel = origTestHookDialChannel }()
  32. defer sw.Set(socktest.FilterConnect, nil)
  33. // Avoid tracking open-close jitterbugs between netFD and
  34. // socket that leads to confusion of information inside
  35. // socktest.Switch.
  36. // It may happen when the Dial call bumps against TCP
  37. // simultaneous open. See selfConnect in tcpsock_posix.go.
  38. defer func() {
  39. sw.Set(socktest.FilterClose, nil)
  40. forceCloseSockets()
  41. }()
  42. sw.Set(socktest.FilterClose, func(so *socktest.Status) (socktest.AfterFilter, error) {
  43. return nil, errTimedout
  44. })
  45. for i, tt := range dialTimeoutTests {
  46. switch runtime.GOOS {
  47. case "plan9", "windows":
  48. testHookDialChannel = func() { time.Sleep(tt.guard) }
  49. if runtime.GOOS == "plan9" {
  50. break
  51. }
  52. fallthrough
  53. default:
  54. sw.Set(socktest.FilterConnect, func(so *socktest.Status) (socktest.AfterFilter, error) {
  55. time.Sleep(tt.guard)
  56. return nil, errTimedout
  57. })
  58. }
  59. ch := make(chan error)
  60. d := Dialer{Timeout: tt.timeout}
  61. if tt.delta != 0 {
  62. d.Deadline = time.Now().Add(tt.delta)
  63. }
  64. max := time.NewTimer(tt.max)
  65. defer max.Stop()
  66. go func() {
  67. // This dial never starts to send any TCP SYN
  68. // segment because of above socket filter and
  69. // test hook.
  70. c, err := d.Dial("tcp", "127.0.0.1:0")
  71. if err == nil {
  72. err = fmt.Errorf("unexpectedly established: tcp:%s->%s", c.LocalAddr(), c.RemoteAddr())
  73. c.Close()
  74. }
  75. ch <- err
  76. }()
  77. select {
  78. case <-max.C:
  79. t.Fatalf("#%d: Dial didn't return in an expected time", i)
  80. case err := <-ch:
  81. if perr := parseDialError(err); perr != nil {
  82. t.Errorf("#%d: %v", i, perr)
  83. }
  84. if nerr, ok := err.(Error); !ok || !nerr.Timeout() {
  85. t.Fatalf("#%d: %v", i, err)
  86. }
  87. }
  88. }
  89. }
  90. var acceptTimeoutTests = []struct {
  91. timeout time.Duration
  92. xerrs [2]error // expected errors in transition
  93. }{
  94. // Tests that accept deadlines in the past work, even if
  95. // there's incoming connections available.
  96. {-5 * time.Second, [2]error{errTimeout, errTimeout}},
  97. {50 * time.Millisecond, [2]error{nil, errTimeout}},
  98. }
  99. func TestAcceptTimeout(t *testing.T) {
  100. switch runtime.GOOS {
  101. case "plan9":
  102. t.Skipf("not supported on %s", runtime.GOOS)
  103. }
  104. ln, err := newLocalListener("tcp")
  105. if err != nil {
  106. t.Fatal(err)
  107. }
  108. defer ln.Close()
  109. for i, tt := range acceptTimeoutTests {
  110. if tt.timeout < 0 {
  111. go func() {
  112. c, err := Dial(ln.Addr().Network(), ln.Addr().String())
  113. if err != nil {
  114. t.Error(err)
  115. return
  116. }
  117. var b [1]byte
  118. c.Read(b[:])
  119. c.Close()
  120. }()
  121. }
  122. if err := ln.(*TCPListener).SetDeadline(time.Now().Add(tt.timeout)); err != nil {
  123. t.Fatalf("$%d: %v", i, err)
  124. }
  125. for j, xerr := range tt.xerrs {
  126. for {
  127. c, err := ln.Accept()
  128. if xerr != nil {
  129. if perr := parseAcceptError(err); perr != nil {
  130. t.Errorf("#%d/%d: %v", i, j, perr)
  131. }
  132. if nerr, ok := err.(Error); !ok || !nerr.Timeout() {
  133. t.Fatalf("#%d/%d: %v", i, j, err)
  134. }
  135. }
  136. if err == nil {
  137. c.Close()
  138. time.Sleep(tt.timeout / 3)
  139. continue
  140. }
  141. break
  142. }
  143. }
  144. }
  145. }
  146. func TestAcceptTimeoutMustReturn(t *testing.T) {
  147. switch runtime.GOOS {
  148. case "plan9":
  149. t.Skipf("not supported on %s", runtime.GOOS)
  150. }
  151. ln, err := newLocalListener("tcp")
  152. if err != nil {
  153. t.Fatal(err)
  154. }
  155. defer ln.Close()
  156. max := time.NewTimer(time.Second)
  157. defer max.Stop()
  158. ch := make(chan error)
  159. go func() {
  160. if err := ln.(*TCPListener).SetDeadline(noDeadline); err != nil {
  161. t.Error(err)
  162. }
  163. if err := ln.(*TCPListener).SetDeadline(time.Now().Add(10 * time.Millisecond)); err != nil {
  164. t.Error(err)
  165. }
  166. c, err := ln.Accept()
  167. if err == nil {
  168. c.Close()
  169. }
  170. ch <- err
  171. }()
  172. select {
  173. case <-max.C:
  174. ln.Close()
  175. <-ch // wait for tester goroutine to stop
  176. t.Fatal("Accept didn't return in an expected time")
  177. case err := <-ch:
  178. if perr := parseAcceptError(err); perr != nil {
  179. t.Error(perr)
  180. }
  181. if nerr, ok := err.(Error); !ok || !nerr.Timeout() {
  182. t.Fatal(err)
  183. }
  184. }
  185. }
  186. func TestAcceptTimeoutMustNotReturn(t *testing.T) {
  187. switch runtime.GOOS {
  188. case "plan9":
  189. t.Skipf("not supported on %s", runtime.GOOS)
  190. }
  191. ln, err := newLocalListener("tcp")
  192. if err != nil {
  193. t.Fatal(err)
  194. }
  195. defer ln.Close()
  196. max := time.NewTimer(100 * time.Millisecond)
  197. defer max.Stop()
  198. ch := make(chan error)
  199. go func() {
  200. if err := ln.(*TCPListener).SetDeadline(time.Now().Add(-5 * time.Second)); err != nil {
  201. t.Error(err)
  202. }
  203. if err := ln.(*TCPListener).SetDeadline(noDeadline); err != nil {
  204. t.Error(err)
  205. }
  206. _, err := ln.Accept()
  207. ch <- err
  208. }()
  209. select {
  210. case err := <-ch:
  211. if perr := parseAcceptError(err); perr != nil {
  212. t.Error(perr)
  213. }
  214. t.Fatalf("expected Accept to not return, but it returned with %v", err)
  215. case <-max.C:
  216. ln.Close()
  217. <-ch // wait for tester goroutine to stop
  218. }
  219. }
  220. var readTimeoutTests = []struct {
  221. timeout time.Duration
  222. xerrs [2]error // expected errors in transition
  223. }{
  224. // Tests that read deadlines work, even if there's data ready
  225. // to be read.
  226. {-5 * time.Second, [2]error{errTimeout, errTimeout}},
  227. {50 * time.Millisecond, [2]error{nil, errTimeout}},
  228. }
  229. func TestReadTimeout(t *testing.T) {
  230. switch runtime.GOOS {
  231. case "plan9":
  232. t.Skipf("not supported on %s", runtime.GOOS)
  233. }
  234. handler := func(ls *localServer, ln Listener) {
  235. c, err := ln.Accept()
  236. if err != nil {
  237. t.Error(err)
  238. return
  239. }
  240. c.Write([]byte("READ TIMEOUT TEST"))
  241. defer c.Close()
  242. }
  243. ls, err := newLocalServer("tcp")
  244. if err != nil {
  245. t.Fatal(err)
  246. }
  247. defer ls.teardown()
  248. if err := ls.buildup(handler); err != nil {
  249. t.Fatal(err)
  250. }
  251. c, err := Dial(ls.Listener.Addr().Network(), ls.Listener.Addr().String())
  252. if err != nil {
  253. t.Fatal(err)
  254. }
  255. defer c.Close()
  256. for i, tt := range readTimeoutTests {
  257. if err := c.SetReadDeadline(time.Now().Add(tt.timeout)); err != nil {
  258. t.Fatalf("#%d: %v", i, err)
  259. }
  260. var b [1]byte
  261. for j, xerr := range tt.xerrs {
  262. for {
  263. n, err := c.Read(b[:])
  264. if xerr != nil {
  265. if perr := parseReadError(err); perr != nil {
  266. t.Errorf("#%d/%d: %v", i, j, perr)
  267. }
  268. if nerr, ok := err.(Error); !ok || !nerr.Timeout() {
  269. t.Fatalf("#%d/%d: %v", i, j, err)
  270. }
  271. }
  272. if err == nil {
  273. time.Sleep(tt.timeout / 3)
  274. continue
  275. }
  276. if n != 0 {
  277. t.Fatalf("#%d/%d: read %d; want 0", i, j, n)
  278. }
  279. break
  280. }
  281. }
  282. }
  283. }
  284. func TestReadTimeoutMustNotReturn(t *testing.T) {
  285. switch runtime.GOOS {
  286. case "plan9":
  287. t.Skipf("not supported on %s", runtime.GOOS)
  288. }
  289. ln, err := newLocalListener("tcp")
  290. if err != nil {
  291. t.Fatal(err)
  292. }
  293. defer ln.Close()
  294. c, err := Dial(ln.Addr().Network(), ln.Addr().String())
  295. if err != nil {
  296. t.Fatal(err)
  297. }
  298. defer c.Close()
  299. max := time.NewTimer(100 * time.Millisecond)
  300. defer max.Stop()
  301. ch := make(chan error)
  302. go func() {
  303. if err := c.SetDeadline(time.Now().Add(-5 * time.Second)); err != nil {
  304. t.Error(err)
  305. }
  306. if err := c.SetWriteDeadline(time.Now().Add(-5 * time.Second)); err != nil {
  307. t.Error(err)
  308. }
  309. if err := c.SetReadDeadline(noDeadline); err != nil {
  310. t.Error(err)
  311. }
  312. var b [1]byte
  313. _, err := c.Read(b[:])
  314. ch <- err
  315. }()
  316. select {
  317. case err := <-ch:
  318. if perr := parseReadError(err); perr != nil {
  319. t.Error(perr)
  320. }
  321. t.Fatalf("expected Read to not return, but it returned with %v", err)
  322. case <-max.C:
  323. c.Close()
  324. err := <-ch // wait for tester goroutine to stop
  325. if perr := parseReadError(err); perr != nil {
  326. t.Error(perr)
  327. }
  328. if err == io.EOF && runtime.GOOS == "nacl" { // see golang.org/issue/8044
  329. return
  330. }
  331. if nerr, ok := err.(Error); !ok || nerr.Timeout() || nerr.Temporary() {
  332. t.Fatal(err)
  333. }
  334. }
  335. }
  336. var readFromTimeoutTests = []struct {
  337. timeout time.Duration
  338. xerrs [2]error // expected errors in transition
  339. }{
  340. // Tests that read deadlines work, even if there's data ready
  341. // to be read.
  342. {-5 * time.Second, [2]error{errTimeout, errTimeout}},
  343. {50 * time.Millisecond, [2]error{nil, errTimeout}},
  344. }
  345. func TestReadFromTimeout(t *testing.T) {
  346. switch runtime.GOOS {
  347. case "nacl", "plan9":
  348. t.Skipf("not supported on %s", runtime.GOOS) // see golang.org/issue/8916
  349. }
  350. ch := make(chan Addr)
  351. defer close(ch)
  352. handler := func(ls *localPacketServer, c PacketConn) {
  353. if dst, ok := <-ch; ok {
  354. c.WriteTo([]byte("READFROM TIMEOUT TEST"), dst)
  355. }
  356. }
  357. ls, err := newLocalPacketServer("udp")
  358. if err != nil {
  359. t.Fatal(err)
  360. }
  361. defer ls.teardown()
  362. if err := ls.buildup(handler); err != nil {
  363. t.Fatal(err)
  364. }
  365. host, _, err := SplitHostPort(ls.PacketConn.LocalAddr().String())
  366. if err != nil {
  367. t.Fatal(err)
  368. }
  369. c, err := ListenPacket(ls.PacketConn.LocalAddr().Network(), JoinHostPort(host, "0"))
  370. if err != nil {
  371. t.Fatal(err)
  372. }
  373. defer c.Close()
  374. ch <- c.LocalAddr()
  375. for i, tt := range readFromTimeoutTests {
  376. if err := c.SetReadDeadline(time.Now().Add(tt.timeout)); err != nil {
  377. t.Fatalf("#%d: %v", i, err)
  378. }
  379. var b [1]byte
  380. for j, xerr := range tt.xerrs {
  381. for {
  382. n, _, err := c.ReadFrom(b[:])
  383. if xerr != nil {
  384. if perr := parseReadError(err); perr != nil {
  385. t.Errorf("#%d/%d: %v", i, j, perr)
  386. }
  387. if nerr, ok := err.(Error); !ok || !nerr.Timeout() {
  388. t.Fatalf("#%d/%d: %v", i, j, err)
  389. }
  390. }
  391. if err == nil {
  392. time.Sleep(tt.timeout / 3)
  393. continue
  394. }
  395. if n != 0 {
  396. t.Fatalf("#%d/%d: read %d; want 0", i, j, n)
  397. }
  398. break
  399. }
  400. }
  401. }
  402. }
  403. var writeTimeoutTests = []struct {
  404. timeout time.Duration
  405. xerrs [2]error // expected errors in transition
  406. }{
  407. // Tests that write deadlines work, even if there's buffer
  408. // space available to write.
  409. {-5 * time.Second, [2]error{errTimeout, errTimeout}},
  410. {10 * time.Millisecond, [2]error{nil, errTimeout}},
  411. }
  412. func TestWriteTimeout(t *testing.T) {
  413. switch runtime.GOOS {
  414. case "plan9":
  415. t.Skipf("not supported on %s", runtime.GOOS)
  416. }
  417. ln, err := newLocalListener("tcp")
  418. if err != nil {
  419. t.Fatal(err)
  420. }
  421. defer ln.Close()
  422. for i, tt := range writeTimeoutTests {
  423. c, err := Dial(ln.Addr().Network(), ln.Addr().String())
  424. if err != nil {
  425. t.Fatal(err)
  426. }
  427. defer c.Close()
  428. if err := c.SetWriteDeadline(time.Now().Add(tt.timeout)); err != nil {
  429. t.Fatalf("#%d: %v", i, err)
  430. }
  431. for j, xerr := range tt.xerrs {
  432. for {
  433. n, err := c.Write([]byte("WRITE TIMEOUT TEST"))
  434. if xerr != nil {
  435. if perr := parseWriteError(err); perr != nil {
  436. t.Errorf("#%d/%d: %v", i, j, perr)
  437. }
  438. if nerr, ok := err.(Error); !ok || !nerr.Timeout() {
  439. t.Fatalf("#%d/%d: %v", i, j, err)
  440. }
  441. }
  442. if err == nil {
  443. time.Sleep(tt.timeout / 3)
  444. continue
  445. }
  446. if n != 0 {
  447. t.Fatalf("#%d/%d: wrote %d; want 0", i, j, n)
  448. }
  449. break
  450. }
  451. }
  452. }
  453. }
  454. func TestWriteTimeoutMustNotReturn(t *testing.T) {
  455. switch runtime.GOOS {
  456. case "plan9":
  457. t.Skipf("not supported on %s", runtime.GOOS)
  458. }
  459. ln, err := newLocalListener("tcp")
  460. if err != nil {
  461. t.Fatal(err)
  462. }
  463. defer ln.Close()
  464. c, err := Dial(ln.Addr().Network(), ln.Addr().String())
  465. if err != nil {
  466. t.Fatal(err)
  467. }
  468. defer c.Close()
  469. max := time.NewTimer(100 * time.Millisecond)
  470. defer max.Stop()
  471. ch := make(chan error)
  472. go func() {
  473. if err := c.SetDeadline(time.Now().Add(-5 * time.Second)); err != nil {
  474. t.Error(err)
  475. }
  476. if err := c.SetReadDeadline(time.Now().Add(-5 * time.Second)); err != nil {
  477. t.Error(err)
  478. }
  479. if err := c.SetWriteDeadline(noDeadline); err != nil {
  480. t.Error(err)
  481. }
  482. var b [1]byte
  483. for {
  484. if _, err := c.Write(b[:]); err != nil {
  485. ch <- err
  486. break
  487. }
  488. }
  489. }()
  490. select {
  491. case err := <-ch:
  492. if perr := parseWriteError(err); perr != nil {
  493. t.Error(perr)
  494. }
  495. t.Fatalf("expected Write to not return, but it returned with %v", err)
  496. case <-max.C:
  497. c.Close()
  498. err := <-ch // wait for tester goroutine to stop
  499. if perr := parseWriteError(err); perr != nil {
  500. t.Error(perr)
  501. }
  502. if nerr, ok := err.(Error); !ok || nerr.Timeout() || nerr.Temporary() {
  503. t.Fatal(err)
  504. }
  505. }
  506. }
  507. var writeToTimeoutTests = []struct {
  508. timeout time.Duration
  509. xerrs [2]error // expected errors in transition
  510. }{
  511. // Tests that write deadlines work, even if there's buffer
  512. // space available to write.
  513. {-5 * time.Second, [2]error{errTimeout, errTimeout}},
  514. {10 * time.Millisecond, [2]error{nil, errTimeout}},
  515. }
  516. func TestWriteToTimeout(t *testing.T) {
  517. switch runtime.GOOS {
  518. case "nacl", "plan9":
  519. t.Skipf("not supported on %s", runtime.GOOS)
  520. }
  521. c1, err := newLocalPacketListener("udp")
  522. if err != nil {
  523. t.Fatal(err)
  524. }
  525. defer c1.Close()
  526. host, _, err := SplitHostPort(c1.LocalAddr().String())
  527. if err != nil {
  528. t.Fatal(err)
  529. }
  530. for i, tt := range writeToTimeoutTests {
  531. c2, err := ListenPacket(c1.LocalAddr().Network(), JoinHostPort(host, "0"))
  532. if err != nil {
  533. t.Fatal(err)
  534. }
  535. defer c2.Close()
  536. if err := c2.SetWriteDeadline(time.Now().Add(tt.timeout)); err != nil {
  537. t.Fatalf("#%d: %v", i, err)
  538. }
  539. for j, xerr := range tt.xerrs {
  540. for {
  541. n, err := c2.WriteTo([]byte("WRITETO TIMEOUT TEST"), c1.LocalAddr())
  542. if xerr != nil {
  543. if perr := parseWriteError(err); perr != nil {
  544. t.Errorf("#%d/%d: %v", i, j, perr)
  545. }
  546. if nerr, ok := err.(Error); !ok || !nerr.Timeout() {
  547. t.Fatalf("#%d/%d: %v", i, j, err)
  548. }
  549. }
  550. if err == nil {
  551. time.Sleep(tt.timeout / 3)
  552. continue
  553. }
  554. if n != 0 {
  555. t.Fatalf("#%d/%d: wrote %d; want 0", i, j, n)
  556. }
  557. break
  558. }
  559. }
  560. }
  561. }
  562. func TestReadTimeoutFluctuation(t *testing.T) {
  563. switch runtime.GOOS {
  564. case "plan9":
  565. t.Skipf("not supported on %s", runtime.GOOS)
  566. }
  567. ln, err := newLocalListener("tcp")
  568. if err != nil {
  569. t.Fatal(err)
  570. }
  571. defer ln.Close()
  572. c, err := Dial(ln.Addr().Network(), ln.Addr().String())
  573. if err != nil {
  574. t.Fatal(err)
  575. }
  576. defer c.Close()
  577. max := time.NewTimer(time.Second)
  578. defer max.Stop()
  579. ch := make(chan error)
  580. go timeoutReceiver(c, 100*time.Millisecond, 50*time.Millisecond, 250*time.Millisecond, ch)
  581. select {
  582. case <-max.C:
  583. t.Fatal("Read took over 1s; expected 0.1s")
  584. case err := <-ch:
  585. if perr := parseReadError(err); perr != nil {
  586. t.Error(perr)
  587. }
  588. if nerr, ok := err.(Error); !ok || !nerr.Timeout() {
  589. t.Fatal(err)
  590. }
  591. }
  592. }
  593. func TestReadFromTimeoutFluctuation(t *testing.T) {
  594. switch runtime.GOOS {
  595. case "plan9":
  596. t.Skipf("not supported on %s", runtime.GOOS)
  597. }
  598. c1, err := newLocalPacketListener("udp")
  599. if err != nil {
  600. t.Fatal(err)
  601. }
  602. defer c1.Close()
  603. c2, err := Dial(c1.LocalAddr().Network(), c1.LocalAddr().String())
  604. if err != nil {
  605. t.Fatal(err)
  606. }
  607. defer c2.Close()
  608. max := time.NewTimer(time.Second)
  609. defer max.Stop()
  610. ch := make(chan error)
  611. go timeoutPacketReceiver(c2.(PacketConn), 100*time.Millisecond, 50*time.Millisecond, 250*time.Millisecond, ch)
  612. select {
  613. case <-max.C:
  614. t.Fatal("ReadFrom took over 1s; expected 0.1s")
  615. case err := <-ch:
  616. if perr := parseReadError(err); perr != nil {
  617. t.Error(perr)
  618. }
  619. if nerr, ok := err.(Error); !ok || !nerr.Timeout() {
  620. t.Fatal(err)
  621. }
  622. }
  623. }
  624. func TestWriteTimeoutFluctuation(t *testing.T) {
  625. switch runtime.GOOS {
  626. case "plan9":
  627. t.Skipf("not supported on %s", runtime.GOOS)
  628. }
  629. ln, err := newLocalListener("tcp")
  630. if err != nil {
  631. t.Fatal(err)
  632. }
  633. defer ln.Close()
  634. c, err := Dial(ln.Addr().Network(), ln.Addr().String())
  635. if err != nil {
  636. t.Fatal(err)
  637. }
  638. defer c.Close()
  639. d := time.Second
  640. if runtime.GOOS == "darwin" && (runtime.GOARCH == "arm" || runtime.GOARCH == "arm64") {
  641. d = 3 * time.Second // see golang.org/issue/10775
  642. }
  643. max := time.NewTimer(d)
  644. defer max.Stop()
  645. ch := make(chan error)
  646. go timeoutTransmitter(c, 100*time.Millisecond, 50*time.Millisecond, 250*time.Millisecond, ch)
  647. select {
  648. case <-max.C:
  649. t.Fatalf("Write took over %v; expected 0.1s", d)
  650. case err := <-ch:
  651. if perr := parseWriteError(err); perr != nil {
  652. t.Error(perr)
  653. }
  654. if nerr, ok := err.(Error); !ok || !nerr.Timeout() {
  655. t.Fatal(err)
  656. }
  657. }
  658. }
  659. func TestVariousDeadlines1Proc(t *testing.T) {
  660. testVariousDeadlines(t, 1)
  661. }
  662. func TestVariousDeadlines4Proc(t *testing.T) {
  663. testVariousDeadlines(t, 4)
  664. }
  665. type neverEnding byte
  666. func (b neverEnding) Read(p []byte) (int, error) {
  667. for i := range p {
  668. p[i] = byte(b)
  669. }
  670. return len(p), nil
  671. }
  672. func testVariousDeadlines(t *testing.T, maxProcs int) {
  673. switch runtime.GOOS {
  674. case "plan9":
  675. t.Skipf("not supported on %s", runtime.GOOS)
  676. }
  677. defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(maxProcs))
  678. type result struct {
  679. n int64
  680. err error
  681. d time.Duration
  682. }
  683. ch := make(chan error, 1)
  684. pasvch := make(chan result)
  685. handler := func(ls *localServer, ln Listener) {
  686. for {
  687. c, err := ln.Accept()
  688. if err != nil {
  689. ch <- err
  690. return
  691. }
  692. // The server, with no timeouts of its own,
  693. // sending bytes to clients as fast as it can.
  694. go func() {
  695. t0 := time.Now()
  696. n, err := io.Copy(c, neverEnding('a'))
  697. dt := time.Since(t0)
  698. c.Close()
  699. pasvch <- result{n, err, dt}
  700. }()
  701. }
  702. }
  703. ls, err := newLocalServer("tcp")
  704. if err != nil {
  705. t.Fatal(err)
  706. }
  707. defer ls.teardown()
  708. if err := ls.buildup(handler); err != nil {
  709. t.Fatal(err)
  710. }
  711. for _, timeout := range []time.Duration{
  712. 1 * time.Nanosecond,
  713. 2 * time.Nanosecond,
  714. 5 * time.Nanosecond,
  715. 50 * time.Nanosecond,
  716. 100 * time.Nanosecond,
  717. 200 * time.Nanosecond,
  718. 500 * time.Nanosecond,
  719. 750 * time.Nanosecond,
  720. 1 * time.Microsecond,
  721. 5 * time.Microsecond,
  722. 25 * time.Microsecond,
  723. 250 * time.Microsecond,
  724. 500 * time.Microsecond,
  725. 1 * time.Millisecond,
  726. 5 * time.Millisecond,
  727. 100 * time.Millisecond,
  728. 250 * time.Millisecond,
  729. 500 * time.Millisecond,
  730. 1 * time.Second,
  731. } {
  732. numRuns := 3
  733. if testing.Short() {
  734. numRuns = 1
  735. if timeout > 500*time.Microsecond {
  736. continue
  737. }
  738. }
  739. for run := 0; run < numRuns; run++ {
  740. name := fmt.Sprintf("%v run %d/%d", timeout, run+1, numRuns)
  741. t.Log(name)
  742. c, err := Dial(ls.Listener.Addr().Network(), ls.Listener.Addr().String())
  743. if err != nil {
  744. t.Fatal(err)
  745. }
  746. tooLong := 5 * time.Second
  747. max := time.NewTimer(tooLong)
  748. defer max.Stop()
  749. actvch := make(chan result)
  750. go func() {
  751. t0 := time.Now()
  752. if err := c.SetDeadline(t0.Add(timeout)); err != nil {
  753. t.Error(err)
  754. }
  755. n, err := io.Copy(ioutil.Discard, c)
  756. dt := time.Since(t0)
  757. c.Close()
  758. actvch <- result{n, err, dt}
  759. }()
  760. select {
  761. case res := <-actvch:
  762. if nerr, ok := res.err.(Error); ok && nerr.Timeout() {
  763. t.Logf("for %v, good client timeout after %v, reading %d bytes", name, res.d, res.n)
  764. } else {
  765. t.Fatalf("for %v, client Copy = %d, %v; want timeout", name, res.n, res.err)
  766. }
  767. case <-max.C:
  768. t.Fatalf("for %v, timeout (%v) waiting for client to timeout (%v) reading", name, tooLong, timeout)
  769. }
  770. select {
  771. case res := <-pasvch:
  772. t.Logf("for %v, server in %v wrote %d: %v", name, res.d, res.n, res.err)
  773. case err := <-ch:
  774. t.Fatalf("for %v, Accept = %v", name, err)
  775. case <-max.C:
  776. t.Fatalf("for %v, timeout waiting for server to finish writing", name)
  777. }
  778. }
  779. }
  780. }
  781. // TestReadWriteProlongedTimeout tests concurrent deadline
  782. // modification. Known to cause data races in the past.
  783. func TestReadWriteProlongedTimeout(t *testing.T) {
  784. switch runtime.GOOS {
  785. case "plan9":
  786. t.Skipf("not supported on %s", runtime.GOOS)
  787. }
  788. handler := func(ls *localServer, ln Listener) {
  789. c, err := ln.Accept()
  790. if err != nil {
  791. t.Error(err)
  792. return
  793. }
  794. defer c.Close()
  795. var wg sync.WaitGroup
  796. wg.Add(2)
  797. go func() {
  798. defer wg.Done()
  799. var b [1]byte
  800. for {
  801. if err := c.SetReadDeadline(time.Now().Add(time.Hour)); err != nil {
  802. if perr := parseCommonError(err); perr != nil {
  803. t.Error(perr)
  804. }
  805. t.Error(err)
  806. return
  807. }
  808. if _, err := c.Read(b[:]); err != nil {
  809. if perr := parseReadError(err); perr != nil {
  810. t.Error(perr)
  811. }
  812. return
  813. }
  814. }
  815. }()
  816. go func() {
  817. defer wg.Done()
  818. var b [1]byte
  819. for {
  820. if err := c.SetWriteDeadline(time.Now().Add(time.Hour)); err != nil {
  821. if perr := parseCommonError(err); perr != nil {
  822. t.Error(perr)
  823. }
  824. t.Error(err)
  825. return
  826. }
  827. if _, err := c.Write(b[:]); err != nil {
  828. if perr := parseWriteError(err); perr != nil {
  829. t.Error(perr)
  830. }
  831. return
  832. }
  833. }
  834. }()
  835. wg.Wait()
  836. }
  837. ls, err := newLocalServer("tcp")
  838. if err != nil {
  839. t.Fatal(err)
  840. }
  841. defer ls.teardown()
  842. if err := ls.buildup(handler); err != nil {
  843. t.Fatal(err)
  844. }
  845. c, err := Dial(ls.Listener.Addr().Network(), ls.Listener.Addr().String())
  846. if err != nil {
  847. t.Fatal(err)
  848. }
  849. defer c.Close()
  850. var b [1]byte
  851. for i := 0; i < 1000; i++ {
  852. c.Write(b[:])
  853. c.Read(b[:])
  854. }
  855. }
  856. func TestReadWriteDeadlineRace(t *testing.T) {
  857. switch runtime.GOOS {
  858. case "nacl", "plan9":
  859. t.Skipf("not supported on %s", runtime.GOOS)
  860. }
  861. N := 1000
  862. if testing.Short() {
  863. N = 50
  864. }
  865. defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(4))
  866. ln, err := newLocalListener("tcp")
  867. if err != nil {
  868. t.Fatal(err)
  869. }
  870. defer ln.Close()
  871. c, err := Dial(ln.Addr().Network(), ln.Addr().String())
  872. if err != nil {
  873. t.Fatal(err)
  874. }
  875. defer c.Close()
  876. var wg sync.WaitGroup
  877. wg.Add(3)
  878. go func() {
  879. defer wg.Done()
  880. tic := time.NewTicker(2 * time.Microsecond)
  881. defer tic.Stop()
  882. for i := 0; i < N; i++ {
  883. if err := c.SetReadDeadline(time.Now().Add(2 * time.Microsecond)); err != nil {
  884. if perr := parseCommonError(err); perr != nil {
  885. t.Error(perr)
  886. }
  887. break
  888. }
  889. if err := c.SetWriteDeadline(time.Now().Add(2 * time.Microsecond)); err != nil {
  890. if perr := parseCommonError(err); perr != nil {
  891. t.Error(perr)
  892. }
  893. break
  894. }
  895. <-tic.C
  896. }
  897. }()
  898. go func() {
  899. defer wg.Done()
  900. var b [1]byte
  901. for i := 0; i < N; i++ {
  902. c.Read(b[:]) // ignore possible timeout errors
  903. }
  904. }()
  905. go func() {
  906. defer wg.Done()
  907. var b [1]byte
  908. for i := 0; i < N; i++ {
  909. c.Write(b[:]) // ignore possible timeout errors
  910. }
  911. }()
  912. wg.Wait() // wait for tester goroutine to stop
  913. }