rsc.io/go@v0.0.0-20150416155037-e040fd465409/src/net/timeout_test.go (about) 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 5 package net 6 7 import ( 8 "fmt" 9 "io" 10 "io/ioutil" 11 "net/internal/socktest" 12 "runtime" 13 "testing" 14 "time" 15 ) 16 17 func TestDialTimeout(t *testing.T) { 18 const T = 100 * time.Millisecond 19 20 switch runtime.GOOS { 21 case "plan9", "windows": 22 origTestHookDialChannel := testHookDialChannel 23 testHookDialChannel = func() { time.Sleep(2 * T) } 24 defer func() { testHookDialChannel = origTestHookDialChannel }() 25 if runtime.GOOS == "plan9" { 26 break 27 } 28 fallthrough 29 default: 30 sw.Set(socktest.FilterConnect, func(so *socktest.Status) (socktest.AfterFilter, error) { 31 time.Sleep(2 * T) 32 return nil, errTimeout 33 }) 34 defer sw.Set(socktest.FilterConnect, nil) 35 } 36 37 ch := make(chan error) 38 go func() { 39 // This dial never starts to send any SYN segment 40 // because of above socket filter and test hook. 41 c, err := DialTimeout("tcp", "127.0.0.1:0", T) 42 if err == nil { 43 err = fmt.Errorf("unexpectedly established: tcp:%s->%s", c.LocalAddr(), c.RemoteAddr()) 44 c.Close() 45 } 46 ch <- err 47 }() 48 tmo := time.NewTimer(3 * T) 49 defer tmo.Stop() 50 select { 51 case <-tmo.C: 52 t.Fatal("dial has not returned") 53 case err := <-ch: 54 nerr, ok := err.(Error) 55 if !ok { 56 t.Fatalf("got %v; want error implements Error interface", err) 57 } 58 if !nerr.Timeout() { 59 t.Fatalf("got %v; want timeout error", err) 60 } 61 } 62 } 63 64 func isTimeout(err error) bool { 65 e, ok := err.(Error) 66 return ok && e.Timeout() 67 } 68 69 type copyRes struct { 70 n int64 71 err error 72 d time.Duration 73 } 74 75 func TestAcceptTimeout(t *testing.T) { 76 switch runtime.GOOS { 77 case "plan9": 78 t.Skipf("skipping test on %q", runtime.GOOS) 79 } 80 81 ln, err := newLocalListener("tcp") 82 if err != nil { 83 t.Fatal(err) 84 } 85 defer ln.Close() 86 ln.(*TCPListener).SetDeadline(time.Now().Add(-1 * time.Second)) 87 if _, err := ln.Accept(); !isTimeout(err) { 88 t.Fatalf("Accept: expected err %v, got %v", errTimeout, err) 89 } 90 if _, err := ln.Accept(); !isTimeout(err) { 91 t.Fatalf("Accept: expected err %v, got %v", errTimeout, err) 92 } 93 ln.(*TCPListener).SetDeadline(time.Now().Add(100 * time.Millisecond)) 94 if _, err := ln.Accept(); !isTimeout(err) { 95 t.Fatalf("Accept: expected err %v, got %v", errTimeout, err) 96 } 97 if _, err := ln.Accept(); !isTimeout(err) { 98 t.Fatalf("Accept: expected err %v, got %v", errTimeout, err) 99 } 100 ln.(*TCPListener).SetDeadline(noDeadline) 101 errc := make(chan error) 102 go func() { 103 _, err := ln.Accept() 104 errc <- err 105 }() 106 time.Sleep(100 * time.Millisecond) 107 select { 108 case err := <-errc: 109 t.Fatalf("Expected Accept() to not return, but it returned with %v\n", err) 110 default: 111 } 112 ln.Close() 113 switch nerr := <-errc; err := nerr.(type) { 114 case *OpError: 115 if err.Err != errClosing { 116 t.Fatalf("Accept: expected err %v, got %v", errClosing, err) 117 } 118 default: 119 if err != errClosing { 120 t.Fatalf("Accept: expected err %v, got %v", errClosing, err) 121 } 122 } 123 } 124 125 func TestReadTimeout(t *testing.T) { 126 switch runtime.GOOS { 127 case "plan9": 128 t.Skipf("skipping test on %q", runtime.GOOS) 129 } 130 131 ln, err := newLocalListener("tcp") 132 if err != nil { 133 t.Fatal(err) 134 } 135 defer ln.Close() 136 c, err := DialTCP("tcp", nil, ln.Addr().(*TCPAddr)) 137 if err != nil { 138 t.Fatalf("Connect: %v", err) 139 } 140 defer c.Close() 141 c.SetDeadline(time.Now().Add(time.Hour)) 142 c.SetReadDeadline(time.Now().Add(-1 * time.Second)) 143 buf := make([]byte, 1) 144 if _, err = c.Read(buf); !isTimeout(err) { 145 t.Fatalf("Read: expected err %v, got %v", errTimeout, err) 146 } 147 if _, err = c.Read(buf); !isTimeout(err) { 148 t.Fatalf("Read: expected err %v, got %v", errTimeout, err) 149 } 150 c.SetDeadline(time.Now().Add(100 * time.Millisecond)) 151 if _, err = c.Read(buf); !isTimeout(err) { 152 t.Fatalf("Read: expected err %v, got %v", errTimeout, err) 153 } 154 if _, err = c.Read(buf); !isTimeout(err) { 155 t.Fatalf("Read: expected err %v, got %v", errTimeout, err) 156 } 157 c.SetReadDeadline(noDeadline) 158 c.SetWriteDeadline(time.Now().Add(-1 * time.Second)) 159 errc := make(chan error) 160 go func() { 161 _, err := c.Read(buf) 162 errc <- err 163 }() 164 time.Sleep(100 * time.Millisecond) 165 select { 166 case err := <-errc: 167 t.Fatalf("Expected Read() to not return, but it returned with %v\n", err) 168 default: 169 } 170 c.Close() 171 switch nerr := <-errc; err := nerr.(type) { 172 case *OpError: 173 if err.Err != errClosing { 174 t.Fatalf("Read: expected err %v, got %v", errClosing, err) 175 } 176 default: 177 if err == io.EOF && runtime.GOOS == "nacl" { // close enough; golang.org/issue/8044 178 break 179 } 180 if err != errClosing { 181 t.Fatalf("Read: expected err %v, got %v", errClosing, err) 182 } 183 } 184 } 185 186 func TestWriteTimeout(t *testing.T) { 187 switch runtime.GOOS { 188 case "plan9": 189 t.Skipf("skipping test on %q", runtime.GOOS) 190 } 191 192 ln, err := newLocalListener("tcp") 193 if err != nil { 194 t.Fatal(err) 195 } 196 defer ln.Close() 197 c, err := DialTCP("tcp", nil, ln.Addr().(*TCPAddr)) 198 if err != nil { 199 t.Fatalf("Connect: %v", err) 200 } 201 defer c.Close() 202 c.SetDeadline(time.Now().Add(time.Hour)) 203 c.SetWriteDeadline(time.Now().Add(-1 * time.Second)) 204 buf := make([]byte, 4096) 205 writeUntilTimeout := func() { 206 for { 207 _, err := c.Write(buf) 208 if err != nil { 209 if isTimeout(err) { 210 return 211 } 212 t.Fatalf("Write: expected err %v, got %v", errTimeout, err) 213 } 214 } 215 } 216 writeUntilTimeout() 217 c.SetDeadline(time.Now().Add(10 * time.Millisecond)) 218 writeUntilTimeout() 219 writeUntilTimeout() 220 c.SetWriteDeadline(noDeadline) 221 c.SetReadDeadline(time.Now().Add(-1 * time.Second)) 222 errc := make(chan error) 223 go func() { 224 for { 225 _, err := c.Write(buf) 226 if err != nil { 227 errc <- err 228 } 229 } 230 }() 231 time.Sleep(100 * time.Millisecond) 232 select { 233 case err := <-errc: 234 t.Fatalf("Expected Write() to not return, but it returned with %v\n", err) 235 default: 236 } 237 c.Close() 238 switch nerr := <-errc; err := nerr.(type) { 239 case *OpError: 240 if err.Err != errClosing { 241 t.Fatalf("Write: expected err %v, got %v", errClosing, err) 242 } 243 default: 244 if err != errClosing { 245 t.Fatalf("Write: expected err %v, got %v", errClosing, err) 246 } 247 } 248 } 249 250 func testTimeout(t *testing.T, net, addr string, readFrom bool) { 251 c, err := Dial(net, addr) 252 if err != nil { 253 t.Errorf("Dial(%q, %q) failed: %v", net, addr, err) 254 return 255 } 256 defer c.Close() 257 what := "Read" 258 if readFrom { 259 what = "ReadFrom" 260 } 261 262 errc := make(chan error, 1) 263 go func() { 264 t0 := time.Now() 265 c.SetReadDeadline(time.Now().Add(100 * time.Millisecond)) 266 var b [100]byte 267 var n int 268 var err error 269 if readFrom { 270 n, _, err = c.(PacketConn).ReadFrom(b[0:]) 271 } else { 272 n, err = c.Read(b[0:]) 273 } 274 t1 := time.Now() 275 if n != 0 || err == nil || !err.(Error).Timeout() { 276 errc <- fmt.Errorf("%s(%q, %q) did not return 0, timeout: %v, %v", what, net, addr, n, err) 277 return 278 } 279 if dt := t1.Sub(t0); dt < 50*time.Millisecond || !testing.Short() && dt > 250*time.Millisecond { 280 errc <- fmt.Errorf("%s(%q, %q) took %s, expected 0.1s", what, net, addr, dt) 281 return 282 } 283 errc <- nil 284 }() 285 select { 286 case err := <-errc: 287 if err != nil { 288 t.Error(err) 289 } 290 case <-time.After(1 * time.Second): 291 t.Errorf("%s(%q, %q) took over 1 second, expected 0.1s", what, net, addr) 292 } 293 } 294 295 func TestTimeoutUDP(t *testing.T) { 296 switch runtime.GOOS { 297 case "plan9": 298 t.Skipf("skipping test on %q", runtime.GOOS) 299 } 300 301 // set up a listener that won't talk back 302 listening := make(chan string) 303 done := make(chan int) 304 go runDatagramPacketConnServer(t, "udp", "127.0.0.1:0", listening, done) 305 addr := <-listening 306 307 testTimeout(t, "udp", addr, false) 308 testTimeout(t, "udp", addr, true) 309 <-done 310 } 311 312 func TestTimeoutTCP(t *testing.T) { 313 switch runtime.GOOS { 314 case "plan9": 315 t.Skipf("skipping test on %q", runtime.GOOS) 316 } 317 318 // set up a listener that won't talk back 319 listening := make(chan string) 320 done := make(chan int) 321 go runStreamConnServer(t, "tcp", "127.0.0.1:0", listening, done) 322 addr := <-listening 323 324 testTimeout(t, "tcp", addr, false) 325 <-done 326 } 327 328 func TestDeadlineReset(t *testing.T) { 329 switch runtime.GOOS { 330 case "plan9": 331 t.Skipf("skipping test on %q", runtime.GOOS) 332 } 333 ln, err := Listen("tcp", "127.0.0.1:0") 334 if err != nil { 335 t.Fatal(err) 336 } 337 defer ln.Close() 338 tl := ln.(*TCPListener) 339 tl.SetDeadline(time.Now().Add(1 * time.Minute)) 340 tl.SetDeadline(noDeadline) // reset it 341 errc := make(chan error, 1) 342 go func() { 343 _, err := ln.Accept() 344 errc <- err 345 }() 346 select { 347 case <-time.After(50 * time.Millisecond): 348 // Pass. 349 case err := <-errc: 350 // Accept should never return; we never 351 // connected to it. 352 t.Errorf("unexpected return from Accept; err=%v", err) 353 } 354 } 355 356 func TestTimeoutAccept(t *testing.T) { 357 switch runtime.GOOS { 358 case "plan9": 359 t.Skipf("skipping test on %q", runtime.GOOS) 360 } 361 ln, err := Listen("tcp", "127.0.0.1:0") 362 if err != nil { 363 t.Fatal(err) 364 } 365 defer ln.Close() 366 tl := ln.(*TCPListener) 367 tl.SetDeadline(time.Now().Add(100 * time.Millisecond)) 368 errc := make(chan error, 1) 369 go func() { 370 _, err := ln.Accept() 371 errc <- err 372 }() 373 select { 374 case <-time.After(1 * time.Second): 375 // Accept shouldn't block indefinitely 376 t.Errorf("Accept didn't return in an expected time") 377 case <-errc: 378 // Pass. 379 } 380 } 381 382 func TestReadWriteDeadline(t *testing.T) { 383 switch runtime.GOOS { 384 case "plan9": 385 t.Skipf("skipping test on %q", runtime.GOOS) 386 } 387 388 const ( 389 readTimeout = 50 * time.Millisecond 390 writeTimeout = 250 * time.Millisecond 391 ) 392 checkTimeout := func(command string, start time.Time, should time.Duration) { 393 is := time.Now().Sub(start) 394 d := is - should 395 if d < -30*time.Millisecond || !testing.Short() && 150*time.Millisecond < d { 396 t.Errorf("%s timeout test failed: is=%v should=%v\n", command, is, should) 397 } 398 } 399 400 ln, err := Listen("tcp", "127.0.0.1:0") 401 if err != nil { 402 t.Fatalf("ListenTCP on :0: %v", err) 403 } 404 defer ln.Close() 405 406 lnquit := make(chan bool) 407 408 go func() { 409 c, err := ln.Accept() 410 if err != nil { 411 t.Errorf("Accept: %v", err) 412 return 413 } 414 defer c.Close() 415 lnquit <- true 416 }() 417 418 c, err := Dial("tcp", ln.Addr().String()) 419 if err != nil { 420 t.Fatalf("Dial: %v", err) 421 } 422 defer c.Close() 423 424 start := time.Now() 425 err = c.SetReadDeadline(start.Add(readTimeout)) 426 if err != nil { 427 t.Fatalf("SetReadDeadline: %v", err) 428 } 429 err = c.SetWriteDeadline(start.Add(writeTimeout)) 430 if err != nil { 431 t.Fatalf("SetWriteDeadline: %v", err) 432 } 433 434 quit := make(chan bool) 435 436 go func() { 437 var buf [10]byte 438 _, err := c.Read(buf[:]) 439 if err == nil { 440 t.Errorf("Read should not succeed") 441 } 442 checkTimeout("Read", start, readTimeout) 443 quit <- true 444 }() 445 446 go func() { 447 var buf [10000]byte 448 for { 449 _, err := c.Write(buf[:]) 450 if err != nil { 451 break 452 } 453 } 454 checkTimeout("Write", start, writeTimeout) 455 quit <- true 456 }() 457 458 <-quit 459 <-quit 460 <-lnquit 461 } 462 463 type neverEnding byte 464 465 func (b neverEnding) Read(p []byte) (n int, err error) { 466 for i := range p { 467 p[i] = byte(b) 468 } 469 return len(p), nil 470 } 471 472 func TestVariousDeadlines1Proc(t *testing.T) { 473 testVariousDeadlines(t, 1) 474 } 475 476 func TestVariousDeadlines4Proc(t *testing.T) { 477 testVariousDeadlines(t, 4) 478 } 479 480 func testVariousDeadlines(t *testing.T, maxProcs int) { 481 switch runtime.GOOS { 482 case "plan9": 483 t.Skipf("skipping test on %q", runtime.GOOS) 484 } 485 486 defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(maxProcs)) 487 488 acceptc := make(chan error, 1) 489 // The server, with no timeouts of its own, sending bytes to clients 490 // as fast as it can. 491 servec := make(chan copyRes) 492 handler := func(ls *localServer, ln Listener) { 493 for { 494 c, err := ln.Accept() 495 if err != nil { 496 acceptc <- err 497 return 498 } 499 go func() { 500 t0 := time.Now() 501 n, err := io.Copy(c, neverEnding('a')) 502 d := time.Since(t0) 503 c.Close() 504 servec <- copyRes{n, err, d} 505 }() 506 } 507 } 508 ls, err := newLocalServer("tcp") 509 if err != nil { 510 t.Fatal(err) 511 } 512 defer ls.teardown() 513 if err := ls.buildup(handler); err != nil { 514 t.Fatal(err) 515 } 516 517 for _, timeout := range []time.Duration{ 518 1 * time.Nanosecond, 519 2 * time.Nanosecond, 520 5 * time.Nanosecond, 521 50 * time.Nanosecond, 522 100 * time.Nanosecond, 523 200 * time.Nanosecond, 524 500 * time.Nanosecond, 525 750 * time.Nanosecond, 526 1 * time.Microsecond, 527 5 * time.Microsecond, 528 25 * time.Microsecond, 529 250 * time.Microsecond, 530 500 * time.Microsecond, 531 1 * time.Millisecond, 532 5 * time.Millisecond, 533 100 * time.Millisecond, 534 250 * time.Millisecond, 535 500 * time.Millisecond, 536 1 * time.Second, 537 } { 538 numRuns := 3 539 if testing.Short() { 540 numRuns = 1 541 if timeout > 500*time.Microsecond { 542 continue 543 } 544 } 545 for run := 0; run < numRuns; run++ { 546 name := fmt.Sprintf("%v run %d/%d", timeout, run+1, numRuns) 547 t.Log(name) 548 549 c, err := Dial("tcp", ls.Listener.Addr().String()) 550 if err != nil { 551 t.Fatalf("Dial: %v", err) 552 } 553 clientc := make(chan copyRes) 554 go func() { 555 t0 := time.Now() 556 c.SetDeadline(t0.Add(timeout)) 557 n, err := io.Copy(ioutil.Discard, c) 558 d := time.Since(t0) 559 c.Close() 560 clientc <- copyRes{n, err, d} 561 }() 562 563 tooLong := 5 * time.Second 564 select { 565 case res := <-clientc: 566 if isTimeout(res.err) { 567 t.Logf("for %v, good client timeout after %v, reading %d bytes", name, res.d, res.n) 568 } else { 569 t.Fatalf("for %v: client Copy = %d, %v (want timeout)", name, res.n, res.err) 570 } 571 case <-time.After(tooLong): 572 t.Fatalf("for %v: timeout (%v) waiting for client to timeout (%v) reading", name, tooLong, timeout) 573 } 574 575 select { 576 case res := <-servec: 577 t.Logf("for %v: server in %v wrote %d, %v", name, res.d, res.n, res.err) 578 case err := <-acceptc: 579 t.Fatalf("for %v: server Accept = %v", name, err) 580 case <-time.After(tooLong): 581 t.Fatalf("for %v, timeout waiting for server to finish writing", name) 582 } 583 } 584 } 585 } 586 587 // TestReadDeadlineDataAvailable tests that read deadlines work, even 588 // if there's data ready to be read. 589 func TestReadDeadlineDataAvailable(t *testing.T) { 590 switch runtime.GOOS { 591 case "plan9": 592 t.Skipf("skipping test on %q", runtime.GOOS) 593 } 594 595 servec := make(chan copyRes) 596 const msg = "data client shouldn't read, even though it'll be waiting" 597 handler := func(ls *localServer, ln Listener) { 598 c, err := ln.Accept() 599 if err != nil { 600 t.Errorf("Accept: %v", err) 601 return 602 } 603 defer c.Close() 604 n, err := c.Write([]byte(msg)) 605 servec <- copyRes{n: int64(n), err: err} 606 } 607 ls, err := newLocalServer("tcp") 608 if err != nil { 609 t.Fatal(err) 610 } 611 defer ls.teardown() 612 if err := ls.buildup(handler); err != nil { 613 t.Fatal(err) 614 } 615 616 c, err := Dial("tcp", ls.Listener.Addr().String()) 617 if err != nil { 618 t.Fatalf("Dial: %v", err) 619 } 620 defer c.Close() 621 if res := <-servec; res.err != nil || res.n != int64(len(msg)) { 622 t.Fatalf("unexpected server Write: n=%d, err=%v; want n=%d, err=nil", res.n, res.err, len(msg)) 623 } 624 c.SetReadDeadline(time.Now().Add(-5 * time.Second)) // in the psat. 625 buf := make([]byte, len(msg)/2) 626 n, err := c.Read(buf) 627 if n > 0 || !isTimeout(err) { 628 t.Fatalf("client read = %d (%q) err=%v; want 0, timeout", n, buf[:n], err) 629 } 630 } 631 632 // TestWriteDeadlineBufferAvailable tests that write deadlines work, even 633 // if there's buffer space available to write. 634 func TestWriteDeadlineBufferAvailable(t *testing.T) { 635 switch runtime.GOOS { 636 case "plan9": 637 t.Skipf("skipping test on %q", runtime.GOOS) 638 } 639 640 servec := make(chan copyRes) 641 handler := func(ls *localServer, ln Listener) { 642 c, err := ln.Accept() 643 if err != nil { 644 t.Errorf("Accept: %v", err) 645 return 646 } 647 defer c.Close() 648 c.SetWriteDeadline(time.Now().Add(-5 * time.Second)) // in the past 649 n, err := c.Write([]byte{'x'}) 650 servec <- copyRes{n: int64(n), err: err} 651 } 652 ls, err := newLocalServer("tcp") 653 if err != nil { 654 t.Fatal(err) 655 } 656 defer ls.teardown() 657 if err := ls.buildup(handler); err != nil { 658 t.Fatal(err) 659 } 660 661 c, err := Dial("tcp", ls.Listener.Addr().String()) 662 if err != nil { 663 t.Fatalf("Dial: %v", err) 664 } 665 defer c.Close() 666 res := <-servec 667 if res.n != 0 { 668 t.Errorf("Write = %d; want 0", res.n) 669 } 670 if !isTimeout(res.err) { 671 t.Errorf("Write error = %v; want timeout", res.err) 672 } 673 } 674 675 // TestAcceptDeadlineConnectionAvailable tests that accept deadlines work, even 676 // if there's incoming connections available. 677 func TestAcceptDeadlineConnectionAvailable(t *testing.T) { 678 switch runtime.GOOS { 679 case "plan9": 680 t.Skipf("skipping test on %q", runtime.GOOS) 681 } 682 683 ln, err := newLocalListener("tcp") 684 if err != nil { 685 t.Fatal(err) 686 } 687 defer ln.Close() 688 689 go func() { 690 c, err := Dial("tcp", ln.Addr().String()) 691 if err != nil { 692 t.Errorf("Dial: %v", err) 693 return 694 } 695 defer c.Close() 696 var buf [1]byte 697 c.Read(buf[:]) // block until the connection or listener is closed 698 }() 699 time.Sleep(10 * time.Millisecond) 700 ln.(*TCPListener).SetDeadline(time.Now().Add(-5 * time.Second)) // in the past 701 c, err := ln.Accept() 702 if err == nil { 703 defer c.Close() 704 } 705 if !isTimeout(err) { 706 t.Fatalf("Accept: got %v; want timeout", err) 707 } 708 } 709 710 // TestConnectDeadlineInThePast tests that connect deadlines work, even 711 // if the connection can be established w/o blocking. 712 func TestConnectDeadlineInThePast(t *testing.T) { 713 ln, err := newLocalListener("tcp") 714 if err != nil { 715 t.Fatal(err) 716 } 717 defer ln.Close() 718 719 go func() { 720 c, err := ln.Accept() 721 if err == nil { 722 defer c.Close() 723 } 724 }() 725 time.Sleep(10 * time.Millisecond) 726 c, err := DialTimeout("tcp", ln.Addr().String(), -5*time.Second) // in the past 727 if err == nil { 728 defer c.Close() 729 } 730 if !isTimeout(err) { 731 t.Fatalf("DialTimeout: got %v; want timeout", err) 732 } 733 } 734 735 // TestProlongTimeout tests concurrent deadline modification. 736 // Known to cause data races in the past. 737 func TestProlongTimeout(t *testing.T) { 738 switch runtime.GOOS { 739 case "plan9": 740 t.Skipf("skipping test on %q", runtime.GOOS) 741 } 742 743 connected := make(chan bool) 744 handler := func(ls *localServer, ln Listener) { 745 s, err := ln.Accept() 746 connected <- true 747 if err != nil { 748 t.Errorf("ln.Accept: %v", err) 749 return 750 } 751 defer s.Close() 752 s.SetDeadline(time.Now().Add(time.Hour)) 753 go func() { 754 var buf [4096]byte 755 for { 756 _, err := s.Write(buf[:]) 757 if err != nil { 758 break 759 } 760 s.SetDeadline(time.Now().Add(time.Hour)) 761 } 762 }() 763 buf := make([]byte, 1) 764 for { 765 _, err := s.Read(buf) 766 if err != nil { 767 break 768 } 769 s.SetDeadline(time.Now().Add(time.Hour)) 770 } 771 } 772 ls, err := newLocalServer("tcp") 773 if err != nil { 774 t.Fatal(err) 775 } 776 defer ls.teardown() 777 if err := ls.buildup(handler); err != nil { 778 t.Fatal(err) 779 } 780 781 c, err := Dial("tcp", ls.Listener.Addr().String()) 782 if err != nil { 783 t.Fatalf("DialTCP: %v", err) 784 } 785 defer c.Close() 786 <-connected 787 for i := 0; i < 1024; i++ { 788 var buf [1]byte 789 c.Write(buf[:]) 790 } 791 } 792 793 func TestDeadlineRace(t *testing.T) { 794 switch runtime.GOOS { 795 case "nacl", "plan9": 796 t.Skipf("skipping test on %q", runtime.GOOS) 797 } 798 799 N := 1000 800 if testing.Short() { 801 N = 50 802 } 803 defer runtime.GOMAXPROCS(runtime.GOMAXPROCS(4)) 804 ln, err := newLocalListener("tcp") 805 if err != nil { 806 t.Fatal(err) 807 } 808 defer ln.Close() 809 c, err := Dial("tcp", ln.Addr().String()) 810 if err != nil { 811 t.Fatalf("Dial: %v", err) 812 } 813 defer c.Close() 814 done := make(chan bool) 815 go func() { 816 t := time.NewTicker(2 * time.Microsecond).C 817 for i := 0; i < N; i++ { 818 if err := c.SetDeadline(time.Now().Add(2 * time.Microsecond)); err != nil { 819 break 820 } 821 <-t 822 } 823 done <- true 824 }() 825 var buf [1]byte 826 for i := 0; i < N; i++ { 827 c.Read(buf[:]) // ignore possible timeout errors 828 } 829 c.Close() 830 <-done 831 }