http2: don't rely on double-close of a net.Conn failing
The js_wasm net.Conn implementation doesn't return an error on
double-closing a connection. Update tests to not rely on this
behavior.
Change-Id: I674c6cd6364b7351d627626cf5bd9f59b3c2b96c
Reviewed-on: https://go-review.googlesource.com/c/net/+/432515
Run-TryBot: Damien Neil <dneil@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Bryan Mills <bcmills@google.com>
diff --git a/http2/transport_test.go b/http2/transport_test.go
index ff20c3b..685659a 100644
--- a/http2/transport_test.go
+++ b/http2/transport_test.go
@@ -5930,6 +5930,20 @@
testTransportClosesConnAfterGoAway(t, 1)
}
+type closeOnceConn struct {
+ net.Conn
+ closed uint32
+}
+
+var errClosed = errors.New("Close of closed connection")
+
+func (c *closeOnceConn) Close() error {
+ if atomic.CompareAndSwapUint32(&c.closed, 0, 1) {
+ return c.Conn.Close()
+ }
+ return errClosed
+}
+
// testTransportClosesConnAfterGoAway verifies that the transport
// closes a connection after reading a GOAWAY from it.
//
@@ -5938,6 +5952,7 @@
// when 1, the transport reads the response after receiving the GOAWAY.
func testTransportClosesConnAfterGoAway(t *testing.T, lastStream uint32) {
ct := newClientTester(t)
+ ct.cc = &closeOnceConn{Conn: ct.cc}
var wg sync.WaitGroup
wg.Add(1)
@@ -5951,12 +5966,10 @@
if gotErr, wantErr := err != nil, lastStream == 0; gotErr != wantErr {
t.Errorf("RoundTrip got error %v (want error: %v)", err, wantErr)
}
- if err = ct.cc.Close(); err == nil {
- err = fmt.Errorf("expected error on Close")
- } else if strings.Contains(err.Error(), "use of closed network") {
- err = nil
+ if err = ct.cc.Close(); err != errClosed {
+ return fmt.Errorf("ct.cc.Close() = %v, want errClosed", err)
}
- return err
+ return nil
}
ct.server = func() error {