From f4ed50c26054492e4a2e726d89feffb2dd535ef8 Mon Sep 17 00:00:00 2001 From: Dmitriy Vyukov Date: Mon, 26 Nov 2012 22:28:39 +0400 Subject: [PATCH] net: add deadline prolongation test Currently the test exposes data races on deadline vars. R=golang-dev, dave, bradfitz, rsc CC=golang-dev https://golang.org/cl/6845091 --- src/pkg/net/timeout_test.go | 48 +++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/src/pkg/net/timeout_test.go b/src/pkg/net/timeout_test.go index c72758dc06..9bda4ac9b6 100644 --- a/src/pkg/net/timeout_test.go +++ b/src/pkg/net/timeout_test.go @@ -576,3 +576,51 @@ func TestWriteDeadlineBufferAvailable(t *testing.T) { t.Errorf("Write error = %v; want timeout", res.err) } } + +// TestProlongTimeout tests concurrent deadline modification. +// Known to cause data races in the past. +func TestProlongTimeout(t *testing.T) { + switch runtime.GOOS { + case "plan9": + t.Logf("skipping test on %q", runtime.GOOS) + return + } + + ln := newLocalListener(t) + defer ln.Close() + go func() { + s, err := ln.Accept() + if err != nil { + t.Fatalf("ln.Accept: %v", err) + } + defer s.Close() + s.SetDeadline(time.Now().Add(time.Hour)) + go func() { + var buf [4096]byte + for { + _, err := s.Write(buf[:]) + if err != nil { + break + } + s.SetDeadline(time.Now().Add(time.Hour)) + } + }() + buf := make([]byte, 1) + for { + _, err := s.Read(buf) + if err != nil { + break + } + s.SetDeadline(time.Now().Add(time.Hour)) + } + }() + c, err := Dial("tcp", ln.Addr().String()) + if err != nil { + t.Fatalf("DialTCP: %v", err) + } + defer c.Close() + for i := 0; i < 1024; i++ { + var buf [1]byte + c.Write(buf[:]) + } +} -- 2.48.1