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  }