Closed bassosimone closed 5 years ago
Running go test -race -v -count=1 ./internal/dialerapi/...
I saw:
==================
WARNING: DATA RACE
Write at 0x00c0001cc018 by goroutine 43:
github.com/bassosimone/netx/internal/dialerapi.(*Dialer).tlsHandshake()
/Users/sbasso/src/github.com/bassosimone/netx/internal/dialerapi/dialerapi.go:205 +0x9fe
github.com/bassosimone/netx/internal/dialerapi.(*Dialer).DialTLS()
/Users/sbasso/src/github.com/bassosimone/netx/internal/dialerapi/dialerapi.go:97 +0x1e4
github.com/bassosimone/netx/internal/dialerapi_test.TestIntegrationTLSHandshakeTimeout()
/Users/sbasso/src/github.com/bassosimone/netx/internal/dialerapi/dialerapi_test.go:131 +0xaf
testing.tRunner()
/usr/local/Cellar/go/1.13/libexec/src/testing/testing.go:909 +0x199
Previous read at 0x00c0001cc018 by goroutine 46:
github.com/bassosimone/netx/internal/dialerapi.(*Dialer).tlsHandshake.func1()
/Users/sbasso/src/github.com/bassosimone/netx/internal/dialerapi/dialerapi.go:174 +0x38
Goroutine 43 (running) created at:
testing.(*T).Run()
/usr/local/Cellar/go/1.13/libexec/src/testing/testing.go:960 +0x651
testing.runTests.func1()
/usr/local/Cellar/go/1.13/libexec/src/testing/testing.go:1202 +0xa6
testing.tRunner()
/usr/local/Cellar/go/1.13/libexec/src/testing/testing.go:909 +0x199
testing.runTests()
/usr/local/Cellar/go/1.13/libexec/src/testing/testing.go:1200 +0x521
testing.(*M).Run()
/usr/local/Cellar/go/1.13/libexec/src/testing/testing.go:1117 +0x2ff
main.main()
_testmain.go:62 +0x223
Goroutine 46 (running) created at:
github.com/bassosimone/netx/internal/dialerapi.(*Dialer).tlsHandshake()
/Users/sbasso/src/github.com/bassosimone/netx/internal/dialerapi/dialerapi.go:173 +0x29d
github.com/bassosimone/netx/internal/dialerapi.(*Dialer).DialTLS()
/Users/sbasso/src/github.com/bassosimone/netx/internal/dialerapi/dialerapi.go:97 +0x1e4
github.com/bassosimone/netx/internal/dialerapi_test.TestIntegrationTLSHandshakeTimeout()
/Users/sbasso/src/github.com/bassosimone/netx/internal/dialerapi/dialerapi_test.go:131 +0xaf
testing.tRunner()
/usr/local/Cellar/go/1.13/libexec/src/testing/testing.go:909 +0x199
==================
So, the problem is that, with a super short timeout as in
func TestIntegrationTLSHandshakeTimeout(t *testing.T) {
dialer := dialerapi.NewDialer(time.Now(), handlers.StdoutHandler)
dialer.TLSHandshakeTimeout = 1 // very small timeout
conn, err := dialer.DialTLS("tcp", "ooni.io:443")
if err == nil {
t.Fatal("expected an error here")
}
if conn != nil {
t.Fatal("expected a nil conn here")
}
}
There is a race between:
tc = tls.Client(net.Conn(conn), config)
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
ech := make(chan error, 1)
start := time.Now()
go func() {
ech <- tc.Handshake()
}()
select {
case <-ctx.Done():
err = ctx.Err()
case err = <-ech:
// FALLTHROUGH
}
and
if err != nil {
tc.Close()
tc = nil
}
where tc
is set to nil
before the Handshake could start.
i have seen this intermittent unit tests failure: